diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2017-04-29 12:11:08 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2017-04-29 12:11:08 +0200 |
commit | 16e9630b79f0a7a90c6cedb6781175bb8b337dc1 (patch) | |
tree | e1b09d277dec2057e6b995ec099dd2b1f2129b35 /app/wlib/gtklib/gtkmenu.c | |
parent | 09795a01ef859f072920de9df974d1b03b9ab9a4 (diff) |
New upstream version 4.3.0upstream/4.3.0
Diffstat (limited to 'app/wlib/gtklib/gtkmenu.c')
-rw-r--r-- | app/wlib/gtklib/gtkmenu.c | 873 |
1 files changed, 0 insertions, 873 deletions
diff --git a/app/wlib/gtklib/gtkmenu.c b/app/wlib/gtklib/gtkmenu.c deleted file mode 100644 index d3258c4..0000000 --- a/app/wlib/gtklib/gtkmenu.c +++ /dev/null @@ -1,873 +0,0 @@ -/** \file gtkmenu.c - * Menu creation and handling stuff. - * - * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/wlib/gtklib/gtkmenu.c,v 1.5 2009-10-03 04:49:01 dspagnol Exp $ - */ - -/* XTrkCad - Model Railroad CAD - * Copyright (C) 2005 Dave Bullis - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <unistd.h> -#include <dirent.h> -#include <ctype.h> - -#include "gtkint.h" - -int testMenuPopup = 1; - -static char MenuItemDataKey[] = "MenuItemDataKey"; - -extern char gtkAccelChar; - -/* - ***************************************************************************** - * - * Menus - * - ***************************************************************************** - */ - -typedef enum { M_MENU, M_SEPARATOR, M_PUSH, M_LIST, M_LISTITEM, M_TOGGLE, M_RADIO } mtype_e; -typedef enum { MM_BUTT, MM_MENU, MM_BAR, MM_POPUP } mmtype_e; - - -#define MOBJ_COMMON \ - WOBJ_COMMON \ - mtype_e mtype; \ - GtkWidget * menu_item; \ - wMenu_p parentMenu; \ - int recursion; - -struct wMenuItem_t { - MOBJ_COMMON - }; -typedef struct wMenuItem_t * wMenuItem_p; - -struct wMenu_t { - MOBJ_COMMON - mmtype_e mmtype; - wMenuItem_p first, last; - GSList *radioGroup; /* in case menu holds a radio button group */ - GtkWidget * menu; - wMenuTraceCallBack_p traceFunc; - void * traceData; - GtkLabel * labelG; - GtkWidget * imageG; - }; - -struct wMenuPush_t { - MOBJ_COMMON - wMenuCallBack_p action; - wBool_t enabled; - }; - -struct wMenuRadio_t { - MOBJ_COMMON - wMenuCallBack_p action; - wBool_t enabled; - }; - - -typedef struct wMenuListItem_t * wMenuListItem_p; - -struct wMenuList_t { - MOBJ_COMMON - int max; - int count; - wMenuListCallBack_p action; - }; - -struct wMenuListItem_t { - MOBJ_COMMON - wMenuList_p mlist; - }; - -struct wMenuToggle_t { - MOBJ_COMMON - wMenuToggleCallBack_p action; - wBool_t enabled; - wBool_t set; - }; - - -/*-----------------------------------------------------------------*/ - -static void pushMenuItem( - GtkWidget * widget, - gpointer value ) -{ - wMenuItem_p m = (wMenuItem_p)value; - wMenuToggle_p mt; - if (gdk_pointer_is_grabbed()) { - gdk_pointer_ungrab(0); - } -/* wFlush(); */ - if (m->recursion) - return; - switch (m->mtype) { - case M_PUSH: - if ( ((wMenuPush_p)m)->enabled == FALSE ) - wBeep(); - else - ((wMenuPush_p)m)->action( ((wMenuPush_p)m)->data ); - break; - case M_TOGGLE: - mt = (wMenuToggle_p)m; - if ( mt->enabled == FALSE ) { - wBeep(); - } else { - wMenuToggleSet( mt, !mt->set ); - mt->action( mt->set, mt->data ); - } - break; - case M_RADIO: - /* NOTE: action is only called when radio button is activated, not when deactivated */ - if ( ((wMenuRadio_p)m)->enabled == FALSE ) - wBeep(); - else - if( ((GtkCheckMenuItem *)widget)->active == TRUE ) - ((wMenuRadio_p)m)->action( ((wMenuRadio_p)m)->data ); - break; - case M_MENU: - return; - default: - /*fprintf(stderr," Oops menu\n");*/ - return; - } - if ( (m->parentMenu)->traceFunc ) { - (m->parentMenu)->traceFunc( m->parentMenu, m->labelStr, ((wMenu_p)m->parentMenu)->traceData ); - } -} - -static wMenuItem_p createMenuItem( - wMenu_p m, - mtype_e mtype, - const char * helpStr, - const char * labelStr, - int size ) -{ - wMenuItem_p mi; - mi = (wMenuItem_p)gtkAlloc( NULL, B_MENUITEM, 0, 0, labelStr, size, NULL ); - mi->mtype = mtype; - switch ( mtype ) { - case M_LIST: - m->menu_item = NULL; - break; - case M_SEPARATOR: - mi->menu_item = gtk_separator_menu_item_new(); - break; - case M_TOGGLE: - mi->menu_item = gtk_check_menu_item_new_with_mnemonic(gtkConvertInput(mi->labelStr)); - break; - case M_RADIO: - mi->menu_item = gtk_radio_menu_item_new_with_mnemonic(m->radioGroup, gtkConvertInput(mi->labelStr)); - m->radioGroup = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mi->menu_item)); - break; - default: - mi->menu_item = gtk_menu_item_new_with_mnemonic(gtkConvertInput(mi->labelStr)); - break; - } - if (mi->menu_item) { - if (m) - gtk_menu_append( GTK_MENU(m->menu), mi->menu_item ); - - gtk_signal_connect( GTK_OBJECT(mi->menu_item), "activate", - GTK_SIGNAL_FUNC(pushMenuItem), mi ); - gtk_widget_show(mi->menu_item); - } - if (m) { - if (m->first == NULL) { - m->first = mi; - } else { - m->last->next = (wControl_p)mi; - } - m->last = mi; - } - mi->next = NULL; - if (helpStr != NULL) { - gtkAddHelpString( mi->menu_item, helpStr ); - } - mi->parentMenu = m; - return mi; -} - - -static void setAcclKey( wWin_p w, GtkWidget * menu, GtkWidget * menu_item, int acclKey ) -{ - char acclStr[40]; - int len; - int mask; - static GtkAccelGroup * accel_alpha_group = NULL; - static GtkAccelGroup * accel_nonalpha_group = NULL; - guint oldmods; - - - if (accel_alpha_group == NULL) { - accel_alpha_group = gtk_accel_group_new(); - /*gtk_accel_group_set_mod_mask( accel_group, GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD1_MASK );*/ - gtk_window_add_accel_group(GTK_WINDOW(gtkMainW->gtkwin), accel_alpha_group ); - } - if (accel_nonalpha_group == NULL) { - oldmods = gtk_accelerator_get_default_mod_mask(); - gtk_accelerator_set_default_mod_mask( GDK_CONTROL_MASK | GDK_MOD1_MASK ); - accel_nonalpha_group = gtk_accel_group_new(); - /*gtk_accel_group_set_mod_mask( accel_group, GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD1_MASK );*/ - gtk_window_add_accel_group(GTK_WINDOW(gtkMainW->gtkwin), accel_nonalpha_group ); - gtk_accelerator_set_default_mod_mask( oldmods ); - } - - mask = 0; - if (acclKey) { -#ifdef LATER - switch ( (acclKey&0xFF) ) { - case '+': acclKey = (acclKey&0xFF00) | WSHIFT | '='; break; - case '?': acclKey = (acclKey&0xFF00) | WSHIFT | '/'; break; - } -#endif - len = 0; - if (acclKey&WALT) { - mask |= GDK_MOD1_MASK; - strcpy( acclStr+len, "Meta+" ); - len += 5; - } - if (acclKey&WSHIFT) { - mask |= GDK_SHIFT_MASK; - strcpy( acclStr+len, "Shift+" ); - len += 6; - switch ( (acclKey&0xFF) ) { - case '0': acclKey += ')'-'0'; break; - case '1': acclKey += '!'-'1'; break; - case '2': acclKey += '@'-'2'; break; - case '3': acclKey += '#'-'3'; break; - case '4': acclKey += '$'-'4'; break; - case '5': acclKey += '%'-'5'; break; - case '6': acclKey += '^'-'6'; break; - case '7': acclKey += '&'-'7'; break; - case '8': acclKey += '*'-'8'; break; - case '9': acclKey += '('-'9'; break; - case '`': acclKey += '~'-'`'; break; - case '-': acclKey += '_'-'-'; break; - case '=': acclKey += '+'-'='; break; - case '\\': acclKey += '|'-'\\'; break; - case '[': acclKey += '{'-'['; break; - case ']': acclKey += '}'-']'; break; - case ';': acclKey += ':'-';'; break; - case '\'': acclKey += '"'-'\''; break; - case ',': acclKey += '<'-','; break; - case '.': acclKey += '>'-'.'; break; - case '/': acclKey += '?'-'/'; break; - default: break; - } - } - if (acclKey&WCTL) { - mask |= GDK_CONTROL_MASK; - strcpy( acclStr+len, "Ctrl+" ); - len += 5; - } - acclStr[len++] = (acclKey & 0xFF); - acclStr[len++] = '\0'; - gtk_widget_add_accelerator( menu_item, "activate", - (isalpha(acclKey&0xFF)?accel_alpha_group:accel_nonalpha_group), - toupper(acclKey&0xFF), mask, GTK_ACCEL_VISIBLE|GTK_ACCEL_LOCKED ); - } -} - -/*-----------------------------------------------------------------*/ - -wMenuRadio_p wMenuRadioCreate( - wMenu_p m, - const char * helpStr, - const char * labelStr, - long acclKey, - wMenuCallBack_p action, - void *data ) -{ - wMenuRadio_p mi; - - mi = (wMenuRadio_p)createMenuItem( m, M_RADIO, helpStr, labelStr, sizeof *mi ); - if (m->mmtype == MM_POPUP && !testMenuPopup) - return mi; - setAcclKey( m->parent, m->menu, mi->menu_item, acclKey ); - mi->action = action; - mi->data = data; - mi->enabled = TRUE; - return mi; -} - -void wMenuRadioSetActive( - wMenuRadio_p mi ) -{ - gtk_check_menu_item_set_active( (GtkCheckMenuItem *)mi->menu_item, TRUE ); -} - -/*-----------------------------------------------------------------*/ - -wMenuPush_p wMenuPushCreate( - wMenu_p m, - const char * helpStr, - const char * labelStr, - long acclKey, - wMenuCallBack_p action, - void *data ) -{ - wMenuPush_p mi; - - mi = (wMenuPush_p)createMenuItem( m, M_PUSH, helpStr, labelStr, sizeof *mi ); - if (m->mmtype == MM_POPUP && !testMenuPopup) - return mi; - setAcclKey( m->parent, m->menu, mi->menu_item, acclKey ); - mi->action = action; - mi->data = data; - mi->enabled = TRUE; - return mi; -} - - -void wMenuPushEnable( - wMenuPush_p mi, - wBool_t enable ) -{ - mi->enabled = enable; - gtk_widget_set_sensitive( GTK_WIDGET(mi->menu_item), enable ); -} - - -/*-----------------------------------------------------------------*/ - -wMenu_p wMenuMenuCreate( - wMenu_p m, - const char * helpStr, - const char * labelStr ) -{ - wMenu_p mi; - mi = (wMenu_p)createMenuItem( m, M_MENU, helpStr, labelStr, sizeof *mi ); - mi->mmtype = MM_MENU; - mi->menu = gtk_menu_new(); - /*gtk_widget_set_sensitive( GTK_WIDGET(mi->menu_item), FALSE );*/ - gtk_menu_item_set_submenu( GTK_MENU_ITEM(mi->menu_item), mi->menu ); - return mi; -} - - -/*-----------------------------------------------------------------*/ - -void wMenuSeparatorCreate( - wMenu_p m ) -{ - wMenuItem_p mi; - mi = createMenuItem( m, M_SEPARATOR, NULL, "", sizeof *mi ); -} - - -/*-----------------------------------------------------------------*/ - -int getMlistOrigin( wMenu_p m, wMenuList_p ml ) -{ - wMenuItem_p mi; - int count; - count = 0; /* Menu counts as one */ - for ( mi = m->first; mi != NULL; mi = (wMenuItem_p)mi->next ) { - switch( mi->mtype ) { - case M_SEPARATOR: - case M_PUSH: - case M_MENU: - count++; - break; - case M_LIST: - if (mi == (wMenuItem_p)ml) - return count; - count += ((wMenuList_p)mi)->count; - break; - default: - /*fprintf(stderr, "Oops: getMlistOrigin\n");*/ - break; - } - } - return count; -} - -wMenuList_p wMenuListCreate( - wMenu_p m, - const char * helpStr, - int max, - wMenuListCallBack_p action ) -{ - wMenuList_p mi; - mi = (wMenuList_p)createMenuItem( m, M_LIST, NULL, NULL, sizeof *mi ); - mi->next = NULL; - mi->count = 0; - mi->max = max; - mi->parentMenu = m; - mi->action = action; - return (wMenuList_p)mi; -} - - -static void pushMenuList( - GtkWidget * widget, - gpointer value ) -{ - wMenuListItem_p ml = (wMenuListItem_p)value; - int i; - int origin; - GtkWidget * item; - char * itemLabel; - GList * children; - GList * child; - GtkWidget *label; - - if (gdk_pointer_is_grabbed()) { - gdk_pointer_ungrab(0); - } - wFlush(); - - if (ml->recursion) - return; - if (ml->mlist->count <= 0) { - fprintf( stderr, "pushMenuItem: empty list\n" ); - return; - } - if (ml->mlist->action) { - origin = getMlistOrigin(ml->mlist->parentMenu, ml->mlist); - children = gtk_container_children( GTK_CONTAINER(ml->mlist->parentMenu->menu) ); - if (children == NULL) abort(); - child = g_list_nth( children, origin ); - for (i=origin; i<origin+ml->mlist->count; i++, child=g_list_next(child) ) { - if (child == NULL) abort(); - item = (GtkWidget*)child->data; - if (item == NULL) abort(); - if (item == widget) { - children = gtk_container_children(GTK_CONTAINER(item)); - label = (GtkWidget*)children->data; - gtk_label_get( GTK_LABEL(label), &itemLabel ); - ml->mlist->action( i-origin, itemLabel, ml->data ); - return; - } - } - } - fprintf( stderr, "pushMenuItem: item (%lx) not found\n", (long)widget ); -} - - -void wMenuListAdd( - wMenuList_p ml, - int index, - const char * labelStr, - const void * data ) -{ - int i; - int origin; - GtkWidget * item; - char * itemLabel; - GList * children; - GList * child; - GList * itemList; - GtkWidget * label; - wMenuListItem_p mi; - char * labelStrConverted; - - origin = getMlistOrigin(ml->parentMenu, ml); - if (ml->count > 0) { - children = gtk_container_children( GTK_CONTAINER(ml->parentMenu->menu) ); - if (children == NULL) abort(); - child = g_list_nth( children, origin ); - labelStrConverted = gtkConvertInput(labelStr); - for (i=origin; i<origin+ml->count; i++, child=g_list_next(child) ) { - if (child == NULL) abort(); - item = (GtkWidget*)child->data; - if (item == NULL) abort(); - itemList = gtk_container_children(GTK_CONTAINER(item)); - label = (GtkWidget*)itemList->data; - gtk_label_get( GTK_LABEL(label), &itemLabel ); - if (strcmp( labelStrConverted, itemLabel ) == 0) { - if (i != ml->count+index) { - gtk_container_remove( GTK_CONTAINER(ml->parentMenu->menu), item ); - ml->count--; - break; - } - return; - } - } - if (ml->max >= 0 && ml->count >= ml->max) { - child = g_list_nth( children, origin+ml->count-1 ); - if (child == NULL) abort(); - item = (GtkWidget*)child->data; - if (item == NULL) abort(); - gtk_container_remove( GTK_CONTAINER(ml->parentMenu->menu), item ); - ml->count--; - } - } - mi = (wMenuListItem_p)gtkAlloc( NULL, B_MENUITEM, 0, 0, labelStr, sizeof *mi, NULL ); - mi->mtype = M_LISTITEM; - mi->menu_item = gtk_menu_item_new_with_label(gtkConvertInput(mi->labelStr)); - mi->data = (void *)data; - mi->mlist = ml; - if (index < 0 || index > ml->count) - index = ml->count; - gtk_menu_insert( GTK_MENU(ml->parentMenu->menu), mi->menu_item, origin+index ); - gtk_signal_connect( GTK_OBJECT(mi->menu_item), "activate", - GTK_SIGNAL_FUNC(pushMenuList), mi ); - gtk_object_set_data( GTK_OBJECT(mi->menu_item), MenuItemDataKey, mi ); - gtk_widget_show(mi->menu_item); - - ml->count++; -} - - -void wMenuListDelete( - wMenuList_p ml, - const char * labelStr ) -{ - int i; - int origin; - GtkWidget * item; - char * itemLabel; - GList * children; - GList * child; - GtkWidget * label; - char * labelStrConverted; - - if (ml->count < 0) abort(); - origin = getMlistOrigin(ml->parentMenu, ml); - children = gtk_container_children( GTK_CONTAINER(ml->parentMenu->menu) ); - if (children == NULL) abort(); - child = g_list_nth( children, origin ); - labelStrConverted = gtkConvertInput( labelStr ); - for (i=origin; i<origin+ml->count; i++, child=g_list_next(child) ) { - if (child == NULL) abort(); - item = (GtkWidget*)child->data; - if (item == NULL) abort(); - children = gtk_container_children(GTK_CONTAINER(item)); - label = (GtkWidget*)children->data; - gtk_label_get( GTK_LABEL(label), &itemLabel ); - if (strcmp( labelStrConverted, itemLabel ) == 0) { - gtk_container_remove( GTK_CONTAINER(ml->parentMenu->menu), item ); - gtk_widget_queue_resize( GTK_WIDGET(ml->parentMenu->menu) ); - ml->count--; - return; - } - } -} - - -const char * wMenuListGet( wMenuList_p ml, int index, void ** data ) -{ - int origin; - GtkWidget * item; - GList * children; - GList * child; - GtkWidget * label; - char * itemLabel; - wMenuListItem_p mi; - - if (ml->count <= 0) - return NULL; - - if (index >= ml->count) { - if (data) - *data = NULL; - return NULL; - } - origin = getMlistOrigin(ml->parentMenu, ml); - children = gtk_container_children( GTK_CONTAINER(ml->parentMenu->menu) ); - if (children == NULL) abort(); - child = g_list_nth( children, origin+index ); - if (child == NULL) abort(); - item = (GtkWidget*)child->data; - if (item == NULL) abort(); - children = gtk_container_children(GTK_CONTAINER(item)); - label = (GtkWidget*)children->data; - gtk_label_get( GTK_LABEL(label), &itemLabel ); - if (data) { - mi = (wMenuListItem_p)gtk_object_get_data( GTK_OBJECT(item), MenuItemDataKey ); - if (mi) - *data = mi->data; - } - return itemLabel; -} - - -void wMenuListClear( - wMenuList_p ml ) -{ - int i; - int origin; - GtkWidget * item; - GList * children; - GList * child; - - if (ml->count == 0) - return; - origin = getMlistOrigin(ml->parentMenu, ml); - children = gtk_container_children( GTK_CONTAINER(ml->parentMenu->menu) ); - if (children == NULL) abort(); - child = g_list_nth( children, origin ); - for (i=origin; i<origin+ml->count; i++, child=g_list_next(child) ) { - if (child == NULL) abort(); - item = (GtkWidget*)child->data; - if (item == NULL) abort(); - gtk_container_remove( GTK_CONTAINER(ml->parentMenu->menu), item ); - } - ml->count = 0; - gtk_widget_queue_resize( GTK_WIDGET(ml->parentMenu->menu) ); -} -/*-----------------------------------------------------------------*/ - -wMenuToggle_p wMenuToggleCreate( - wMenu_p m, - const char * helpStr, - const char * labelStr, - long acclKey, - wBool_t set, - wMenuToggleCallBack_p action, - void * data ) -{ - wMenuToggle_p mt; - - mt = (wMenuToggle_p)createMenuItem( m, M_TOGGLE, helpStr, labelStr, sizeof *mt ); - setAcclKey( m->parent, m->menu, mt->menu_item, acclKey ); - mt->action = action; - mt->data = data; - mt->enabled = TRUE; - mt->parentMenu = m; - wMenuToggleSet( mt, set ); - - return mt; -} - - -wBool_t wMenuToggleGet( - wMenuToggle_p mt ) -{ - return mt->set; -} - - -wBool_t wMenuToggleSet( - wMenuToggle_p mt, - wBool_t set ) -{ - wBool_t rc; - if (mt==NULL) return 0; - mt->recursion++; - gtk_check_menu_item_set_state( GTK_CHECK_MENU_ITEM(mt->menu_item), set ); - mt->recursion--; - rc = mt->set; - mt->set = set; - return rc; -} - - -void wMenuToggleEnable( - wMenuToggle_p mt, - wBool_t enable ) -{ - mt->enabled = enable; -} - - -/*-----------------------------------------------------------------*/ - -void wMenuSetLabel( wMenu_p m, const char * labelStr) { - gtkSetLabel( m->widget, m->option, labelStr, &m->labelG, &m->imageG ); -} - - -static gint pushMenu( - GtkWidget * widget, - wMenu_p m ) -{ - gtk_menu_popup( GTK_MENU(m->menu), NULL, NULL, NULL, NULL, 0, 0 ); - /* Tell calling code that we have handled this event; the buck - * stops here. */ - return TRUE; -} - - -wMenu_p wMenuCreate( - wWin_p parent, - wPos_t x, - wPos_t y, - const char * helpStr, - const char * labelStr, - long option ) -{ - wMenu_p m; - m = gtkAlloc( parent, B_MENU, x, y, labelStr, sizeof *m, NULL ); - m->mmtype = MM_BUTT; - m->option = option; - m->traceFunc = NULL; - m->traceData = NULL; - gtkComputePos( (wControl_p)m ); - - m->widget = gtk_button_new(); - gtk_signal_connect (GTK_OBJECT(m->widget), "clicked", - GTK_SIGNAL_FUNC(pushMenu), m ); - - m->menu = gtk_menu_new(); - - wMenuSetLabel( m, labelStr ); -#ifdef MENUOPTION - gtk_option_menu_set_menu( GTK_OPTION_MENU(m->widget), m->menu ); - ((GtkOptionMenu*)m->widget)->width = 25; - ((GtkOptionMenu*)m->widget)->height = 16; -#endif - - gtk_fixed_put( GTK_FIXED(parent->widget), m->widget, m->realX, m->realY ); - gtkControlGetSize( (wControl_p)m ); - if ( m->w < 80 && (m->option&BO_ICON)==0) { - m->w = 80; - gtk_widget_set_usize( m->widget, m->w, m->h ); - } - gtk_widget_show( m->widget ); - gtkAddButton( (wControl_p)m ); - gtkAddHelpString( m->widget, helpStr ); - return m; -} - -/** - * Add a drop-down menu to the menu bar. - * - * \param[IN] w main window handle - * \param[IN] helpStr unused (should be help topic ) - * \param[IN] labelStr label for the drop-down menu - * \return pointer to the created drop-down menu - */ - - -wMenu_p wMenuBarAdd( - wWin_p w, - const char * helpStr, - const char * labelStr ) -{ - wMenu_p m; - GtkWidget * menuItem; - static GtkAccelGroup * accel_group = NULL; - - m = gtkAlloc( w, B_MENU, 0, 0, labelStr, sizeof *m, NULL ); - m->mmtype = MM_BAR; - m->realX = 0; - m->realY = 0; - - menuItem = gtk_menu_item_new_with_label( gtkConvertInput(m->labelStr) ); - m->menu = gtk_menu_new(); - gtk_menu_item_set_submenu( GTK_MENU_ITEM(menuItem), m->menu ); - gtk_menu_bar_append( GTK_MENU_BAR(w->menubar), menuItem ); - gtk_widget_show( menuItem ); - - m->w = 0; - m->h = 0; - - /* TODO: why is help not supported here? */ - /*gtkAddHelpString( m->panel_item, helpStr );*/ - - if ( gtkAccelChar ) { - if ( accel_group == NULL ) { - accel_group = gtk_accel_group_new(); - gtk_window_add_accel_group( GTK_WINDOW(w->gtkwin), accel_group ); - } - gtk_widget_add_accelerator( menuItem, "activate", accel_group, tolower(gtkAccelChar), GDK_MOD1_MASK, GTK_ACCEL_LOCKED ); - } - return m; -} - - -/*-----------------------------------------------------------------*/ - - -wMenu_p wMenuPopupCreate( - wWin_p w, - const char * labelStr ) -{ - wMenu_p b; - b = gtkAlloc( w, B_MENU, 0, 0, labelStr, sizeof *b, NULL ); - b->mmtype = MM_POPUP; - b->option = 0; - - b->menu = gtk_menu_new(); - b->w = 0; - b->h = 0; - gtk_signal_connect( GTK_OBJECT (b->menu), "key_press_event", - GTK_SIGNAL_FUNC (catch_shift_ctrl_alt_keys), b); - gtk_signal_connect( GTK_OBJECT (b->menu), "key_release_event", - GTK_SIGNAL_FUNC (catch_shift_ctrl_alt_keys), b); - gtk_widget_set_events ( GTK_WIDGET(b->menu), GDK_EXPOSURE_MASK|GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK ); - return b; -} - - -void wMenuPopupShow( wMenu_p mp ) -{ - gtk_menu_popup( GTK_MENU(mp->menu), NULL, NULL, NULL, NULL, 0, 0 ); -} - - -/*-----------------------------------------------------------------*/ - -void wMenuSetTraceCallBack( - wMenu_p m, - wMenuTraceCallBack_p func, - void * data ) -{ - m->traceFunc = func; - m->traceData = data; -} - -wBool_t wMenuAction( - wMenu_p m, - const char * label ) -{ - wMenuItem_p mi; - wMenuToggle_p mt; - for ( mi = m->first; mi != NULL; mi = (wMenuItem_p)mi->next ) { - if ( strcmp( mi->labelStr, label ) == 0 ) { - switch( mi->mtype ) { - case M_SEPARATOR: - break; - case M_PUSH: - if ( ((wMenuPush_p)mi)->enabled == FALSE ) - wBeep(); - else - ((wMenuPush_p)mi)->action( ((wMenuPush_p)mi)->data ); - break; - case M_TOGGLE: - mt = (wMenuToggle_p)mi; - if ( mt->enabled == FALSE ) { - wBeep(); - } else { - wMenuToggleSet( mt, !mt->set ); - mt->action( mt->set, mt->data ); - } - break; - case M_MENU: - break; - case M_LIST: - break; - default: - /*fprintf(stderr, "Oops: wMenuAction\n");*/ - break; - } - return TRUE; - } - } - return FALSE; -} |