static void carbon_menu_item_update_submenu (CarbonMenuItem *carbon_item, GtkWidget *widget) { GtkWidget *submenu; submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget)); if (submenu) { const gchar *label_text; CFStringRef cfstr = NULL; label_text = get_menu_label_text (widget, NULL); if (label_text) cfstr = CFStringCreateWithCString (NULL, label_text, kCFStringEncodingUTF8); CreateNewMenu (0, 0, &carbon_item->submenu); SetMenuTitleWithCFString (carbon_item->submenu, cfstr); SetMenuItemHierarchicalMenu (carbon_item->menu, carbon_item->index, carbon_item->submenu); sync_menu_shell (GTK_MENU_SHELL (submenu), carbon_item->submenu, FALSE, FALSE); if (cfstr) CFRelease (cfstr); } else { SetMenuItemHierarchicalMenu (carbon_item->menu, carbon_item->index, NULL); carbon_item->submenu = NULL; } }
static gboolean parent_set_emission_hook (GSignalInvocationHint *ihint, guint n_param_values, const GValue *param_values, gpointer data) { GtkWidget *instance = g_value_get_object (param_values); if (GTK_IS_MENU_ITEM (instance)) { GtkWidget *previous_parent = g_value_get_object (param_values + 1); GtkWidget *menu_shell = NULL; if (GTK_IS_MENU_SHELL (previous_parent)) { menu_shell = previous_parent; } else { GtkWidget *parent; parent = gtk_widget_get_parent (instance); if (GTK_IS_MENU_SHELL (parent)) { menu_shell = parent; } } if (menu_shell) { CarbonMenu *carbon_menu = carbon_menu_get (menu_shell); if (carbon_menu) { #if 0 g_printerr ("%s: item %s %p (%s, %s)\n", G_STRFUNC, previous_parent ? "removed from" : "added to", menu_shell, get_menu_label_text (instance, NULL), g_type_name (G_TYPE_FROM_INSTANCE (instance))); #endif sync_menu_shell (GTK_MENU_SHELL (menu_shell), carbon_menu->menu, carbon_menu->toplevel, FALSE); } } } return TRUE; }
void ige_mac_menu_set_menu_bar (GtkMenuShell *menu_shell) { CarbonMenu *current_menu; MenuRef carbon_menubar; g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell)); if (carbon_menu_quark == 0) carbon_menu_quark = g_quark_from_static_string ("CarbonMenu"); if (carbon_menu_item_quark == 0) carbon_menu_item_quark = g_quark_from_static_string ("CarbonMenuItem"); current_menu = carbon_menu_get (GTK_WIDGET (menu_shell)); if (current_menu) { SetRootMenu (current_menu->menu); return; } CreateNewMenu (0 /*id*/, 0 /*options*/, &carbon_menubar); SetRootMenu (carbon_menubar); setup_menu_event_handler (); if (emission_hook_id == 0) { emission_hook_id = g_signal_add_emission_hook (g_signal_lookup ("parent-set", GTK_TYPE_WIDGET), 0, parent_set_emission_hook, NULL, NULL); } emission_hook_count++; g_signal_connect (menu_shell, "destroy", G_CALLBACK (parent_set_emission_hook_remove), NULL); sync_menu_shell (menu_shell, carbon_menubar, TRUE, FALSE); }
void sync_menu_takeover_menu (GtkMenuShell *menu_shell) { static MenuRef carbon_menubar = NULL; g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell)); if (carbon_menu_quark == 0) carbon_menu_quark = g_quark_from_static_string ("CarbonMenu"); if (carbon_menu_item_quark == 0) carbon_menu_item_quark = g_quark_from_static_string ("CarbonMenuItem"); if (!carbon_menubar) { carbon_menubar = AcquireRootMenu(); setup_menu_event_handler (); } sync_menu_shell (menu_shell, carbon_menubar, TRUE); }