26 #include <gdk/gdkkeysyms.h>
28 #include <Carbon/Carbon.h>
42 #define IGE_QUARTZ_MENU_CREATOR 'IGEC'
43 #define IGE_QUARTZ_ITEM_WIDGET 'IWID'
59 GtkWidget *label = NULL;
61 if (GTK_IS_LABEL (widget))
64 if (GTK_IS_CONTAINER (widget))
69 children = gtk_container_get_children (GTK_CONTAINER (widget));
71 for (l = children; l; l = l->next)
78 g_list_free (children);
95 return gtk_label_get_text (GTK_LABEL (my_label));
105 return (GClosure *) data == closure;
153 carbon_menu->
menu = menuRef;
198 UInt32 set_attrs = 0;
199 UInt32 clear_attrs = 0;
201 g_object_get (widget,
202 "sensitive", &sensitive,
207 set_attrs |= kMenuItemAttrDisabled;
209 clear_attrs |= kMenuItemAttrDisabled;
212 set_attrs |= kMenuItemAttrHidden;
214 clear_attrs |= kMenuItemAttrHidden;
216 ChangeMenuItemAttributes (carbon_item->
menu, carbon_item->
index,
217 set_attrs, clear_attrs);
226 g_object_get (widget,
230 CheckMenuItem (carbon_item->
menu, carbon_item->
index,
240 submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
244 const gchar *label_text;
245 CFStringRef cfstr = NULL;
249 cfstr = CFStringCreateWithCString (NULL, label_text,
250 kCFStringEncodingUTF8);
252 CreateNewMenu (0, 0, &carbon_item->
submenu);
253 SetMenuTitleWithCFString (carbon_item->
submenu, cfstr);
254 SetMenuItemHierarchicalMenu (carbon_item->
menu, carbon_item->
index,
264 SetMenuItemHierarchicalMenu (carbon_item->
menu, carbon_item->
index,
274 const gchar *label_text;
275 CFStringRef cfstr = NULL;
279 cfstr = CFStringCreateWithCString (NULL, label_text,
280 kCFStringEncodingUTF8);
282 SetMenuItemTextWithCFString (carbon_item->
menu, carbon_item->
index,
297 if (GTK_IS_ACCEL_LABEL (label) &&
298 GTK_ACCEL_LABEL (label)->accel_closure)
302 key = gtk_accel_group_find (GTK_ACCEL_LABEL (label)->accel_group,
304 GTK_ACCEL_LABEL (label)->accel_closure);
308 key->accel_flags & GTK_ACCEL_VISIBLE)
310 GdkDisplay *display = gtk_widget_get_display (widget);
311 GdkKeymap *keymap = gdk_keymap_get_for_display (display);
315 gboolean add_modifiers = FALSE;
318 if (gdk_keymap_get_entries_for_keyval (keymap, key->accel_key,
319 &keys, &n_keys) == 0)
323 switch (key->accel_key) {
326 realkey = kRightArrowCharCode;
330 realkey = kLeftArrowCharCode;
334 realkey = kUpArrowCharCode;
338 realkey = kDownArrowCharCode;
345 SetMenuItemCommandKey (carbon_item->
menu, carbon_item->
index,
347 add_modifiers = TRUE;
351 SetMenuItemCommandKey (carbon_item->
menu, carbon_item->
index,
true, keys[0].keycode);
352 if (keys[0].
level == 1) {
354 modifiers |= kMenuShiftModifier;
358 add_modifiers = TRUE;
369 if (key->accel_mods & GDK_SHIFT_MASK) {
370 modifiers |= kMenuShiftModifier;
375 if (key->accel_mods & (GDK_MOD1_MASK)) {
376 modifiers |= kMenuOptionModifier;
379 if (key->accel_mods & GDK_CONTROL_MASK) {
380 modifiers |= kMenuControlModifier;
385 if (key->accel_mods & GDK_META_MASK) {
391 modifiers |= kMenuNoCommandModifier;
393 SetMenuItemModifiers (carbon_item->
menu, carbon_item->
index,
402 SetMenuItemModifiers (carbon_item->
menu, carbon_item->
index,
403 kMenuNoModifiers | kMenuNoCommandModifier);
404 ChangeMenuItemAttributes (carbon_item->
menu, carbon_item->
index,
405 0, kMenuItemAttrUseVirtualKey);
406 SetMenuItemCommandKey (carbon_item->
menu, carbon_item->
index,
414 GClosure *accel_closure,
422 if (GTK_IS_ACCEL_LABEL (label) &&
423 GTK_ACCEL_LABEL (label)->accel_closure == accel_closure)
431 GtkAccelGroup *group;
438 group = gtk_accel_group_from_accel_closure (carbon_item->
accel_closure);
440 g_signal_handlers_disconnect_by_func (group,
448 if (GTK_IS_ACCEL_LABEL (label))
449 carbon_item->
accel_closure = GTK_ACCEL_LABEL (label)->accel_closure;
455 group = gtk_accel_group_from_accel_closure (carbon_item->
accel_closure);
457 g_signal_connect_object (group,
"accel-changed",
470 if (!strcmp (pspec->name,
"sensitive") ||
471 !strcmp (pspec->name,
"visible"))
475 else if (!strcmp (pspec->name,
"active"))
479 else if (!strcmp (pspec->name,
"submenu"))
492 if (!strcmp (pspec->name,
"label"))
495 GTK_WIDGET (
object));
497 else if (!strcmp (pspec->name,
"accel-closure"))
500 GTK_WIDGET (
object));
520 g_signal_connect (menu_item,
"notify",
525 g_signal_connect_swapped (label,
"notify::label",
530 carbon_item->
menu = menu;
531 carbon_item->
index = index;
552 gtk_menu_item_activate (GTK_MENU_ITEM(arg));
561 UInt32 event_class = GetEventClass (event_ref);
562 UInt32 event_kind = GetEventKind (event_ref);
570 case kEventClassCommand:
574 if (event_kind == kEventCommandProcess)
581 err = GetEventParameter (event_ref, kEventParamDirectObject,
583 sizeof (command), 0, &command);
587 GtkWidget *widget = NULL;
590 err = GetMenuItemProperty (command.menu.menuRef,
591 command.menu.menuItemIndex,
594 sizeof (widget), 0, &widget);
595 if (err == noErr && GTK_IS_WIDGET (widget))
606 case kEventClassMenu:
607 GetEventParameter (event_ref,
608 kEventParamDirectObject,
617 case kEventMenuTargetItem:
624 case kEventMenuOpening:
631 case kEventMenuClosed:
645 ret = CallNextEventHandler (event_handler_call_ref, event_ref);
653 EventHandlerUPP menu_event_handler_upp;
654 EventHandlerRef menu_event_handler_ref;
655 const EventTypeSpec menu_events[] = {
656 { kEventClassCommand, kEventCommandProcess },
657 { kEventClassMenu, kEventMenuTargetItem },
658 { kEventClassMenu, kEventMenuOpening },
659 { kEventClassMenu, kEventMenuClosed }
665 InstallEventHandler (GetApplicationEventTarget (), menu_event_handler_upp,
666 GetEventTypeCount (menu_events), menu_events, 0,
667 &menu_event_handler_ref);
671 RemoveEventHandler(menu_event_handler_ref);
672 DisposeEventHandlerUPP(menu_event_handler_upp);
684 MenuItemIndex carbon_index = 1;
687 g_printerr (
"%s: syncing shell %p\n", G_STRFUNC, menu_shell);
691 children = gtk_container_get_children (GTK_CONTAINER (menu_shell));
693 for (l = children; l; l = l->next)
695 GtkWidget *menu_item = l->data;
698 if (GTK_IS_TEAROFF_MENU_ITEM (menu_item))
701 if (toplevel && g_object_get_data (G_OBJECT (menu_item),
702 "gtk-empty-menu-item"))
708 g_printerr (
"%s: carbon_item %d for menu_item %d (%s, %s)\n",
709 G_STRFUNC, carbon_item ? carbon_item->
index : -1,
711 g_type_name (G_TYPE_FROM_INSTANCE (menu_item)));
713 if (carbon_item && carbon_item->
index != carbon_index)
716 g_printerr (
"%s: -> not matching, deleting\n", G_STRFUNC);
718 DeleteMenuItem (carbon_item->
menu, carbon_index);
724 GtkWidget *label = NULL;
725 const gchar *label_text;
726 CFStringRef cfstr = NULL;
727 MenuItemAttributes attributes = 0;
730 g_printerr (
"%s: -> creating new\n", G_STRFUNC);
734 cfstr = CFStringCreateWithCString (NULL, label_text,
735 kCFStringEncodingUTF8);
737 if (GTK_IS_SEPARATOR_MENU_ITEM (menu_item))
738 attributes |= kMenuItemAttrSeparator;
740 if (!GTK_WIDGET_IS_SENSITIVE (menu_item))
741 attributes |= kMenuItemAttrDisabled;
743 if (!GTK_WIDGET_VISIBLE (menu_item))
744 attributes |= kMenuItemAttrHidden;
746 InsertMenuItemTextWithCFString (carbon_menu, cfstr,
749 SetMenuItemProperty (carbon_menu, carbon_index,
752 sizeof (menu_item), &menu_item);
761 if (GTK_IS_CHECK_MENU_ITEM (menu_item))
766 if (gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item)))
773 g_list_free (children);
781 guint n_param_values,
782 const GValue *param_values,
785 GtkWidget *instance = g_value_get_object (param_values);
787 if (GTK_IS_MENU_ITEM (instance))
789 GtkWidget *previous_parent = g_value_get_object (param_values + 1);
790 GtkWidget *menu_shell = NULL;
792 if (GTK_IS_MENU_SHELL (previous_parent))
794 menu_shell = previous_parent;
796 else if (GTK_IS_MENU_SHELL (instance->parent))
798 menu_shell = instance->parent;
808 g_printerr (
"%s: item %s %p (%s, %s)\n", G_STRFUNC,
809 previous_parent ?
"removed from" :
"added to",
812 g_type_name (G_TYPE_FROM_INSTANCE (instance)));
817 carbon_menu->
menu == (MenuRef) data,
830 g_signal_remove_emission_hook (g_signal_lookup (
"parent-set",
843 MenuRef carbon_menubar;
845 g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
853 CreateNewMenu (0 , 0 , &carbon_menubar);
854 SetRootMenu (carbon_menubar);
859 g_signal_add_emission_hook (g_signal_lookup (
"parent-set",
863 carbon_menubar, NULL);
865 g_signal_connect (menu_shell,
"destroy",
878 g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
880 if (GetIndMenuItemWithCommandID (NULL, kHICommandQuit, 1,
881 &appmenu, &index) == noErr)
883 SetMenuItemCommandID (appmenu, index, 0);
884 SetMenuItemProperty (appmenu, index,
887 sizeof (menu_item), &menu_item);
889 gtk_widget_hide (GTK_WIDGET (menu_item));
913 GtkMenuItem *menu_item,
920 g_return_if_fail (group != NULL);
921 g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
923 if (GetIndMenuItemWithCommandID (NULL, kHICommandHide, 1,
924 &appmenu, NULL) != noErr)
926 g_warning (
"%s: retrieving app menu failed",
935 index += g_list_length (list_group->items);
940 if (list_group->items && list->prev)
943 if (group == list_group)
950 if (!group->items && list->prev)
952 InsertMenuItemTextWithCFString (appmenu, NULL, index,
953 kMenuItemAttrSeparator, 0);
960 cfstr = CFStringCreateWithCString (NULL, label,
961 kCFStringEncodingUTF8);
963 InsertMenuItemTextWithCFString (appmenu, cfstr, index, 0, 0);
964 SetMenuItemProperty (appmenu, index + 1,
967 sizeof (menu_item), &menu_item);
971 gtk_widget_hide (GTK_WIDGET (menu_item));
973 group->items = g_list_append (group->items, menu_item);
980 g_warning (
"%s: app menu group %p does not exist",
static const struct @24 modifiers[]
LIBARDOUR_API PBD::PropertyDescriptor< bool > active