From: <kr_...@us...> - 2003-04-23 21:49:30
|
Update of /cvsroot/htoolkit/port/src/cbits/GTK In directory sc8-pr-cvs1:/tmp/cvs-serv26873/port/src/cbits/GTK Modified Files: Frame.c Menu.c Log Message: Complete implementation for Menu with both GTK and Win32. Supported: - command menu items with bitmaps - checked menu items - radio menu items - sepparators - sub menus Index: Frame.c =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/GTK/Frame.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** Frame.c 2 Apr 2003 19:12:10 -0000 1.5 --- Frame.c 23 Apr 2003 21:48:52 -0000 1.6 *************** *** 94,97 **** --- 94,98 ---- case GDK_F11: return kbF11; case GDK_F12: return kbF12; + case GDK_Clear: return kbClear; } *************** *** 191,195 **** GtkWidget *box; GtkWidget *notebook_menu, *menu_item, *pages_menu; - GtkAccelGroup *accel_group; GSList *group; --- 192,195 ---- *************** *** 231,235 **** /* Create "Pages" menu */ pages_menu = gtk_menu_new(); - // gtk_menu_set_accel_group(GTK_MENU(pages_menu), accel_group); menu_item = gtk_menu_item_new_with_label("Pages"); --- 231,234 ---- *************** *** 240,244 **** notebook_menu = gtk_menu_new(); - //gtk_menu_set_accel_group(GTK_MENU(notebook_menu), accel_group); menu_item = gtk_radio_menu_item_new_with_label(NULL, "Top"); --- 239,242 ---- *************** *** 279,282 **** --- 277,282 ---- gtk_menu_append(GTK_MENU(pages_menu), menu_item); + gtk_window_add_accel_group (GTK_WINDOW (gFrameWidget), gtk_accel_group_new()); + gtk_widget_show_all(pages_menu); } *************** *** 310,313 **** --- 310,315 ---- box = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(gFrameWidget), box); + + gtk_window_add_accel_group (GTK_WINDOW (gFrameWidget), gtk_accel_group_new()); gtk_widget_show_all(gFrameWidget); Index: Menu.c =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/GTK/Menu.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Menu.c 2 Apr 2003 19:12:11 -0000 1.6 --- Menu.c 23 Apr 2003 21:48:52 -0000 1.7 *************** *** 3,7 **** #include "Internals.h" #include "Handlers_stub.h" ! static MenuHandle getMenu(MenuHandle parent) --- 3,7 ---- #include "Internals.h" #include "Handlers_stub.h" ! #include <gdk/gdkkeysyms.h> static MenuHandle getMenu(MenuHandle parent) *************** *** 15,123 **** gtk_widget_show(gMenuBar); } ! parent = gMenuBar; } ! return parent; }; ! MenuHandle osAddMenu(MenuHandle parent, char *title) { ! GtkMenuShell *menu_shell; ! gchar *szText = toMnemonicString(title); ! GtkWidget *menuItem = gtk_menu_item_new_with_mnemonic(szText); GtkWidget *popUpMenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), popUpMenu); - rfree(szText); ! menu_shell = GTK_MENU_SHELL(getMenu(parent)); ! if (gDocumentInterface == 1) ! gtk_menu_shell_append(menu_shell, menuItem); ! else ! gtk_menu_shell_insert(menu_shell, menuItem, g_list_length(menu_shell->children)-1); ! gtk_widget_show(menuItem); ! return popUpMenu; }; ! MenuHandle osAddMenuItem(MenuHandle parent, int nKeyCode, unsigned int mods, char *title) { ! gchar *szText = toMnemonicString(title); ! GtkWidget *menuItem = gtk_menu_item_new_with_mnemonic(szText); ! rfree(szText); gtk_signal_connect (GTK_OBJECT(menuItem), "activate", GTK_SIGNAL_FUNC(handleMenuCommand), NULL); ! gtk_menu_shell_append(GTK_MENU_SHELL(getMenu(parent)), menuItem); ! gtk_widget_show(menuItem); return menuItem; }; ! static int in_handler_flag = 0; ! ! static void handleCheckMenuCommand(GtkMenuItem *menuitem) { ! if (!in_handler_flag) ! { ! in_handler_flag++; ! gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), !(GTK_CHECK_MENU_ITEM(menuitem)->active)); ! handleMenuCommand(menuitem) ; ! in_handler_flag--; ! } ! } ! MenuHandle osAddMenuCheckItem(MenuHandle parent, int nKeyCode, unsigned int mods, char *title) ! { ! gchar *szText = toMnemonicString(title); ! GtkWidget *menuItem = gtk_check_menu_item_new_with_mnemonic(szText); ! rfree(szText); gtk_signal_connect (GTK_OBJECT(menuItem), "activate", ! GTK_SIGNAL_FUNC(handleCheckMenuCommand), NULL); ! gtk_menu_shell_append(GTK_MENU_SHELL(getMenu(parent)), menuItem); ! gtk_widget_show(menuItem); return menuItem; }; ! void osAddMenuSeparatorItem(MenuHandle parent) { GtkWidget *item = gtk_separator_menu_item_new(); ! gtk_menu_shell_append(GTK_MENU_SHELL(getMenu(parent)), item); gtk_widget_show(item); } ! void osSetMenuItemEnabled(MenuHandle parent, MenuHandle item, BOOL bState) { gtk_widget_set_sensitive(item,bState); }; ! BOOL osGetMenuItemEnabled(MenuHandle parent, MenuHandle item) { return GTK_WIDGET_SENSITIVE(item); }; ! void osSetMenuItemChecked(MenuHandle parent, MenuHandle item, BOOL bState) { - in_handler_flag++; gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), bState); - in_handler_flag--; }; ! BOOL osGetMenuItemChecked(MenuHandle parent, MenuHandle item) { return gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item)); }; ! void osDrawMenuBar(WindowHandle window) { ! /* TODO: nothing yet */ } ! void osSetMenuItemLabel(MenuHandle menu, MenuHandle item, int nKeyCode, unsigned int mods, char* title ) { ! /* TODO: nothing yet */ } --- 15,643 ---- gtk_widget_show(gMenuBar); } ! parent = gMenuBar; } ! else ! parent = gtk_menu_item_get_submenu(GTK_MENU_ITEM(parent)); ! return parent; }; ! static int recalcPos(GtkWidget *menu, int pos) { ! BOOL b; ! int new_pos; ! GList *children; ! ! children = GTK_MENU_SHELL(menu)->children; ! ! if (pos >= 0) ! { ! b = TRUE; ! new_pos = 0; ! while (children && pos > 0) ! { ! if (GTK_WIDGET_VISIBLE((GtkWidget*) children->data)) ! { ! if (b) pos--; ! } ! else ! { ! b = !b; ! } ! ! new_pos++; ! children = children->next; ! } ! ! if (!children) ! new_pos = (gDocumentInterface == 1 || menu != gMenuBar) ? -1 : new_pos-1; ! } ! else ! { ! new_pos = (gDocumentInterface == 1 || menu != gMenuBar) ? -1 : g_list_length(children)-1; ! } ! ! return new_pos; ! } ! ! static void menu_show(GtkWidget *widget, gpointer user_data) ! { ! GtkWidget *menuItem; ! GList *child = GTK_MENU_SHELL(widget)->children; ! ! while (child) ! { ! menuItem = (GtkWidget *) child->data; ! ! if (GTK_IS_IMAGE_MENU_ITEM(menuItem) || ! GTK_IS_CHECK_MENU_ITEM(menuItem) || ! GTK_IS_RADIO_MENU_ITEM(menuItem)) ! { ! handleMenuUpdate(menuItem); ! } ! ! child = child->next; ! } ! } ! ! MenuHandle osInsertMenu(MenuHandle parent, int pos) ! { ! GtkWidget *menu; ! GtkWidget *menuItem = gtk_menu_item_new_with_mnemonic(""); GtkWidget *popUpMenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuItem), popUpMenu); ! gtk_signal_connect (GTK_OBJECT(menuItem), "destroy", ! GTK_SIGNAL_FUNC(handleMenuDestroy), ! NULL); ! gtk_signal_connect (GTK_OBJECT(popUpMenu), "show", ! GTK_SIGNAL_FUNC(menu_show), ! NULL); ! menu = getMenu(parent); ! pos = recalcPos(menu, pos); ! ! gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuItem, pos); ! gtk_widget_show_all(menuItem); ! return menuItem; }; ! MenuHandle osInsertMenuItem(MenuHandle parent, int pos) { ! GtkWidget *menu; ! GtkWidget *label, *menuItem; ! ! menuItem = gtk_image_menu_item_new(); ! label = gtk_accel_label_new(""); ! gtk_container_add(GTK_CONTAINER(menuItem), label); ! gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), menuItem); gtk_signal_connect (GTK_OBJECT(menuItem), "activate", GTK_SIGNAL_FUNC(handleMenuCommand), NULL); + gtk_signal_connect (GTK_OBJECT(menuItem), "destroy", + GTK_SIGNAL_FUNC(handleMenuDestroy), + NULL); ! menu = getMenu(parent); ! pos = recalcPos(menu, pos); ! ! gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuItem, pos); ! gtk_widget_show_all(menuItem); return menuItem; }; ! MenuHandle osInsertMenuCheckItem(MenuHandle parent, int pos) { ! GtkWidget *menu; ! GtkWidget *label, *menuItem; ! menuItem = gtk_check_menu_item_new(); ! label = gtk_accel_label_new(""); ! gtk_container_add(GTK_CONTAINER(menuItem), label); ! gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), menuItem); gtk_signal_connect (GTK_OBJECT(menuItem), "activate", ! GTK_SIGNAL_FUNC(handleMenuCommand), ! NULL); ! gtk_signal_connect (GTK_OBJECT(menuItem), "destroy", ! GTK_SIGNAL_FUNC(handleMenuDestroy), NULL); ! menu = getMenu(parent); ! pos = recalcPos(menu, pos); ! ! gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuItem, pos); ! gtk_widget_show_all(menuItem); return menuItem; }; ! MenuHandle osInsertMenuSeparatorItem(MenuHandle parent, int pos) { + GtkWidget *menu; GtkWidget *item = gtk_separator_menu_item_new(); ! gtk_signal_connect (GTK_OBJECT(item), "destroy", ! GTK_SIGNAL_FUNC(handleMenuDestroy), ! NULL); ! ! menu = getMenu(parent); ! pos = recalcPos(menu, pos); ! ! gtk_menu_shell_insert(GTK_MENU_SHELL(getMenu(parent)), item, pos); gtk_widget_show(item); + return item; } ! static void handleRadioMenuCommand(GtkMenuItem *menuitem) ! { ! if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) ! handleMenuCommand(menuitem) ; ! } ! ! MenuHandle osInsertMenuRadioGroup(MenuHandle parent, int pos) ! { ! GtkWidget *menu; ! GtkWidget *item1, *item2; ! ! menu = getMenu(parent); ! pos = recalcPos(menu, pos); ! ! item1 = gtk_separator_menu_item_new(); ! gtk_menu_shell_insert(GTK_MENU_SHELL(menu), item1, pos); ! ! item2 = gtk_separator_menu_item_new(); ! gtk_menu_shell_insert(GTK_MENU_SHELL(menu), item2, pos); ! ! gtk_signal_connect (GTK_OBJECT(item1), "destroy", ! GTK_SIGNAL_FUNC(handleMenuDestroy), ! parent); ! ! return item1; ! }; ! ! MenuHandle osInsertMenuRadioItem(MenuHandle parent, int pos) ! { ! int new_pos; ! GList *children; ! GtkWidget *menu, *menuItem, *label; ! GSList *group; ! ! new_pos = 0; ! menu = gtk_widget_get_parent(parent); ! children = GTK_MENU_SHELL(menu)->children; ! ! ! while (children && children->data != parent) ! { ! new_pos++; ! children = children->next; ! } ! ! if (!children || !children->next) ! return NULL; ! ! new_pos++; ! children = children->next; ! group = NULL; ! ! if (pos < 0) ! { ! while (children && GTK_WIDGET_VISIBLE((GtkWidget *) children->data)) ! { ! new_pos++; ! group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM((GtkWidget *) children->data)); ! children = children->next; ! } ! } ! else ! { ! while (children && GTK_WIDGET_VISIBLE((GtkWidget *) children->data) && pos > 0) ! { ! pos--; ! new_pos++; ! group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM((GtkWidget *) children->data)); ! children = children->next; ! } ! } ! ! menuItem = gtk_radio_menu_item_new (group); ! label = gtk_accel_label_new(""); ! gtk_container_add(GTK_CONTAINER(menuItem), label); ! gtk_accel_label_set_accel_widget(GTK_ACCEL_LABEL(label), menuItem); ! ! gtk_signal_connect (GTK_OBJECT(menuItem), "activate", ! GTK_SIGNAL_FUNC(handleRadioMenuCommand), ! NULL); ! gtk_signal_connect (GTK_OBJECT(menuItem), "destroy", ! GTK_SIGNAL_FUNC(handleMenuDestroy), ! NULL); ! ! gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuItem, new_pos); ! gtk_widget_show_all(menuItem); ! ! return menuItem; ! } ! ! void osDestroyMenu(MenuHandle handle) ! { ! GtkWidget *item, *menu; ! ! if (GTK_WIDGET_VISIBLE(handle)) ! gtk_widget_destroy(handle); ! else ! { ! menu = gtk_widget_get_parent(handle); ! ! for (;;) ! { ! GList *children = GTK_MENU_SHELL(menu)->children; ! ! while (children && children->data != handle) ! children = children->next; ! ! if (!children || !children->next) ! return; ! ! item = (GtkWidget *) children->next->data; ! ! if (!GTK_WIDGET_VISIBLE(item)) ! { ! gtk_widget_destroy(item); ! gtk_widget_destroy((GtkWidget *) children->data); ! return; ! } ! gtk_widget_destroy(item); ! } ! } ! } ! ! int osGetMenuItemCount(MenuHandle handle) ! { ! BOOL b; ! int count; ! GList *children; ! GtkWidget *menu; ! ! count = 0; ! ! if (!handle || GTK_WIDGET_VISIBLE(handle)) ! { ! menu = getMenu(handle); ! children = GTK_MENU_SHELL(menu)->children; ! ! b = TRUE; ! while (children) ! { ! if (b) count++; ! ! if (!GTK_WIDGET_VISIBLE((GtkWidget*) children->data)) ! { ! b = !b; ! } ! ! children = children->next; ! } ! } ! else ! { ! menu = gtk_widget_get_parent(handle); ! children = GTK_MENU_SHELL(menu)->children; ! ! while (children && children->data != handle) ! children = children->next; ! ! while (children && GTK_WIDGET_VISIBLE((GtkWidget *) children->data)) ! { ! count++; ! children = children->next; ! } ! ! count--; ! } ! ! return count; ! } ! ! void osSetMenuItemEnabled(MenuHandle item, BOOL bState) { gtk_widget_set_sensitive(item,bState); }; ! BOOL osGetMenuItemEnabled(MenuHandle item) { return GTK_WIDGET_SENSITIVE(item); }; ! void osSetMenuItemChecked(MenuHandle item, BOOL bState) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(item), bState); }; ! BOOL osGetMenuItemChecked(MenuHandle item) { return gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(item)); }; ! void osSetMenuRadioGroupSelection(MenuHandle handle, int index) { ! GList *children; ! GtkWidget *menu; ! ! menu = gtk_widget_get_parent(handle); ! children = GTK_MENU_SHELL(menu)->children; ! ! while (children && children->data != handle) ! children = children->next; ! ! if (!children || !children->next) ! return; ! ! children = children->next; ! while (children && GTK_WIDGET_VISIBLE((GtkWidget *) children->data) && index > 0) ! { ! index--; ! children = children->next; ! } ! ! if (children) ! gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM((GtkWidget *) children->data), TRUE); } ! int osGetMenuRadioGroupSelection(MenuHandle handle) { ! int index; ! GList *children; ! GtkWidget *menu; ! ! menu = gtk_widget_get_parent(handle); ! children = GTK_MENU_SHELL(menu)->children; ! ! while (children && children->data != handle) ! children = children->next; ! ! if (!children || !children->next) ! return -1; ! ! index = 0; ! children = children->next; ! while (children && GTK_WIDGET_VISIBLE((GtkWidget *) children->data)) ! { ! if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM((GtkWidget *) children->data))) ! return index; ! ! index++; ! children = children->next; ! } ! ! return -1; ! } ! ! void osSetMenuLabel(MenuHandle item, char* title) ! { ! gchar *szText = toMnemonicString(title); ! gtk_label_set_text_with_mnemonic(GTK_LABEL(GTK_BIN(item)->child), szText); ! rfree(szText); ! } ! ! char *osGetMenuLabel(MenuHandle item) ! { ! return fromMnemonicString(gtk_label_get_text(GTK_LABEL(GTK_BIN(item)->child))); ! }; ! ! static gboolean find_accel_by_widget(GtkAccelKey *key, GClosure *closure, gpointer data) ! { ! return (closure->data == data); ! } ! ! void osSetMenuItemAccel(MenuHandle item, int key, unsigned int mods) ! { ! GdkModifierType modifier; ! GtkAccelKey *accel_key; ! GtkAccelGroup *accel_group = (GtkAccelGroup *) gtk_accel_groups_from_object (G_OBJECT(gFrameWidget))->data; ! ! accel_key = gtk_accel_group_find(accel_group, find_accel_by_widget, item); ! if (accel_key) gtk_widget_remove_accelerator(item, accel_group, accel_key->accel_key, accel_key->accel_mods); ! ! if (!key) return; ! ! modifier = 0; ! if (mods & shiftBIT) modifier |= GDK_SHIFT_MASK; ! if (mods & ctrlBIT) modifier |= GDK_CONTROL_MASK; ! if (mods & altBIT) modifier |= GDK_MOD1_MASK; ! ! switch (key) ! { ! case kbBackSpace: key = GDK_BackSpace; break; ! case kbTab: key = GDK_Tab; break; ! case kbEnter: key = GDK_Return; break; ! case kbEscape: key = GDK_Escape; break; ! case kbBegin: key = GDK_Begin; break; ! case kbClear: key = GDK_Clear; break; ! case kbDelete: key = GDK_Delete; break; ! case kbDown: key = GDK_Down; break; ! case kbEnd: key = GDK_End; break; ! case kbF1: key = GDK_F1; break; ! case kbF2: key = GDK_F2; break; ! case kbF3: key = GDK_F3; break; ! case kbF4: key = GDK_F4; break; ! case kbF5: key = GDK_F5; break; ! case kbF6: key = GDK_F6; break; ! case kbF7: key = GDK_F7; break; ! case kbF8: key = GDK_F8; break; ! case kbF9: key = GDK_F9; break; ! case kbF10: key = GDK_F10; break; ! case kbF11: key = GDK_F11; break; ! case kbF12: key = GDK_F12; break; ! case kbF13: key = GDK_F13; break; ! case kbF14: key = GDK_F14; break; ! case kbF15: key = GDK_F15; break; ! case kbHelp: key = GDK_Help; break; ! case kbLeft: key = GDK_Left; break; ! case kbPgDown: key = GDK_Page_Down; break; ! case kbPgUp: key = GDK_Page_Up; break; ! case kbRight: key = GDK_Right; break; ! case kbUp: key = GDK_Up; break; ! default: ! if (key >= 256) ! { ! key -= 256; ! modifier = GDK_MOD1_MASK; ! } ! ! if (iscntrl(key)) ! { ! key += '@'; ! modifier |= GDK_CONTROL_MASK; ! } ! else ! if (isupper(key)) ! modifier |= GDK_SHIFT_MASK; ! else ! key = toupper(key); ! break; ! } ! ! gtk_widget_add_accelerator(item, "activate", ! accel_group, ! key, ! modifier, ! GTK_ACCEL_VISIBLE); ! }; ! ! void osGetMenuItemAccel(MenuHandle item, int *key, unsigned int *mods) ! { ! GtkAccelKey *accel_key; ! GtkAccelGroup *accel_group = (GtkAccelGroup *) gtk_accel_groups_from_object (G_OBJECT(gFrameWidget))->data; ! ! accel_key = gtk_accel_group_find(accel_group, find_accel_by_widget, item); ! ! if (accel_key) ! { ! *mods = 0; ! if (accel_key->accel_mods & GDK_SHIFT_MASK) *mods |= shiftBIT; ! if (accel_key->accel_mods & GDK_CONTROL_MASK) *mods |= ctrlBIT; ! if (accel_key->accel_mods & GDK_MOD1_MASK) *mods |= altBIT; ! ! switch (accel_key->accel_key) ! { ! case GDK_Up: *key = kbUp; break; ! case GDK_Down: *key = kbDown; break; ! case GDK_Left: *key = kbLeft; break; ! case GDK_Right: *key = kbRight; break; ! case GDK_Page_Up: *key = kbPgUp; break; ! case GDK_Page_Down:*key = kbPgDown; break; ! case GDK_End: *key = kbEnd; break; ! case GDK_Begin: *key = kbBegin; break; ! case GDK_BackSpace:*key = kbBackSpace; break; ! case GDK_Delete: *key = kbDelete; break; ! case GDK_Tab: *key = kbTab; break; ! case GDK_Return: *key = kbEnter; break; ! case GDK_Escape: *key = kbEscape; break; ! case GDK_Help: *key = kbHelp; break; ! case GDK_F1: *key = kbF1; break; ! case GDK_F2: *key = kbF2; break; ! case GDK_F3: *key = kbF3; break; ! case GDK_F4: *key = kbF4; break; ! case GDK_F5: *key = kbF5; break; ! case GDK_F6: *key = kbF6; break; ! case GDK_F7: *key = kbF7; break; ! case GDK_F8: *key = kbF8; break; ! case GDK_F9: *key = kbF9; break; ! case GDK_F10: *key = kbF10; break; ! case GDK_F11: *key = kbF11; break; ! case GDK_F12: *key = kbF12; break; ! case GDK_Clear: *key = kbClear; break; ! default: ! *mods = 0; ! ! *key = accel_key->accel_key; ! if (accel_key->accel_mods & GDK_CONTROL_MASK) ! *key = toupper(accel_key->accel_key) - '@'; ! else ! if (accel_key->accel_mods & GDK_SHIFT_MASK) ! *key = toupper(accel_key->accel_key); ! ! if (accel_key->accel_mods & GDK_MOD1_MASK) ! *key += 256; ! break; ! } ! } ! else ! { ! *key = 0; ! *mods = 0; ! } ! }; ! ! void osSetMenuItemBitmap(MenuHandle item, BitmapHandle bitmap) ! { ! GtkWidget *image = gtk_image_menu_item_get_image(GTK_IMAGE_MENU_ITEM(item)); ! ! if (bitmap) ! { ! if (!image) ! { ! image = gtk_image_new_from_pixbuf(bitmap->pixbuf); ! gtk_widget_show(image); ! gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image); ! } ! else ! gtk_image_set_from_pixbuf(GTK_IMAGE(image),bitmap->pixbuf); ! } ! else ! { ! if (image) ! { ! gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), NULL); ! } ! } ! }; ! ! int osGetMenuItemPos(MenuHandle handle) ! { ! BOOL b; ! int pos; ! GList *children; ! GtkWidget *menu; ! ! pos = 0; ! menu = getMenu(handle); ! children = GTK_MENU_SHELL(menu)->children; ! ! ! if (GTK_IS_RADIO_MENU_ITEM(handle)) ! { ! while (children && children->data != handle) ! { ! if (GTK_WIDGET_VISIBLE((GtkWidget*) children->data)) ! pos++; ! else ! pos = 0; ! ! children = children->next; ! } ! } ! else ! { ! b = TRUE; ! while (children && children->data != handle) ! { ! if (GTK_WIDGET_VISIBLE((GtkWidget*) children->data)) ! { ! if (b) pos++; ! } ! else ! { ! b = !b; ! } ! ! children = children->next; ! } ! } ! ! if (!children) pos = -1; ! ! return pos; } + |