From e124f0a220e6a4f0da4281e054b65a7991c09fac Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 4 Mar 2021 06:07:45 +1100 Subject: [PATCH] Support Alternative menu items --- v2/internal/ffenestri/menu_darwin.c | 29 +++++++++++++++++++----- v2/internal/ffenestri/menu_darwin.h | 2 +- v2/internal/menumanager/processedMenu.go | 2 ++ v2/pkg/menu/menuitem.go | 5 +++- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/v2/internal/ffenestri/menu_darwin.c b/v2/internal/ffenestri/menu_darwin.c index dd4eb9876..3ee6038ea 100644 --- a/v2/internal/ffenestri/menu_darwin.c +++ b/v2/internal/ffenestri/menu_darwin.c @@ -576,7 +576,7 @@ id processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const c return item; } -id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage) { +id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage, bool alternate) { id item = ALLOC("NSMenuItem"); // Create a MenuItemCallbackData @@ -585,9 +585,15 @@ id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char id wrappedId = msg(c("NSValue"), s("valueWithPointer:"), callback); msg(item, s("setRepresentedObject:"), wrappedId); - id key = processAcceleratorKey(acceleratorkey); - msg(item, s("initWithTitle:action:keyEquivalent:"), str(title), - s("menuItemCallback:"), key); + if( !alternate ) { + id key = processAcceleratorKey(acceleratorkey); + msg(item, s("initWithTitle:action:keyEquivalent:"), str(title), + s("menuItemCallback:"), key); + printf("Menuitem title: %s\n", title); + } else { + msg(item, s("initWithTitle:action:keyEquivalent:"), str(title), s("menuItemCallback:"), str("")); + printf("ALT Menuitem title: %s\n", title); + } if( tooltip != NULL ) { msg(item, s("setToolTip:"), str(tooltip)); @@ -663,10 +669,16 @@ id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char msg(item, s("autorelease")); // Process modifiers - if( modifiers != NULL ) { + if( modifiers != NULL && !alternate) { unsigned long modifierFlags = parseModifiers(modifiers); msg(item, s("setKeyEquivalentModifierMask:"), modifierFlags); } + + // alternate + if( alternate ) { + msg(item, s("setAlternate:"), true); + msg(item, s("setKeyEquivalentModifierMask:"), NSEventModifierFlagOption); + } msg(parentMenu, s("addItem:"), item); return item; @@ -727,6 +739,11 @@ void processMenuItem(Menu *menu, id parentMenu, JsonNode *item) { label = "(empty)"; } + + // Is this an alternate menu item? + bool alternate = false; + getJSONBool(item, "MacAlternate", &alternate); + const char *menuid = getJSONString(item, "ID"); if ( menuid == NULL) { menuid = ""; @@ -782,7 +799,7 @@ void processMenuItem(Menu *menu, id parentMenu, JsonNode *item) { if( type != NULL ) { if( STREQ(type->string_, "Text")) { - processTextMenuItem(menu, parentMenu, label, menuid, disabled, acceleratorkey, modifiers, tooltip, image, fontName, fontSize, RGBA, templateImage); + processTextMenuItem(menu, parentMenu, label, menuid, disabled, acceleratorkey, modifiers, tooltip, image, fontName, fontSize, RGBA, templateImage, alternate); } else if ( STREQ(type->string_, "Separator")) { addSeparator(parentMenu); diff --git a/v2/internal/ffenestri/menu_darwin.h b/v2/internal/ffenestri/menu_darwin.h index 152fde810..dacf93818 100644 --- a/v2/internal/ffenestri/menu_darwin.h +++ b/v2/internal/ffenestri/menu_darwin.h @@ -105,7 +105,7 @@ id processRadioMenuItem(Menu *menu, id parentmenu, const char *title, const char id processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const char *menuid, bool disabled, bool checked, const char *key); -id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage); +id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage, bool alternate); void processMenuItem(Menu *menu, id parentMenu, JsonNode *item); void processMenuData(Menu *menu, JsonNode *menuData); diff --git a/v2/internal/menumanager/processedMenu.go b/v2/internal/menumanager/processedMenu.go index 55a8aa20d..bdb4fe4e1 100644 --- a/v2/internal/menumanager/processedMenu.go +++ b/v2/internal/menumanager/processedMenu.go @@ -37,6 +37,7 @@ type ProcessedMenuItem struct { // Image - base64 image data Image string `json:",omitempty"` MacTemplateImage bool `json:", omitempty"` + MacAlternate bool `json:", omitempty"` // Tooltip Tooltip string `json:",omitempty"` @@ -60,6 +61,7 @@ func NewProcessedMenuItem(menuItemMap *MenuItemMap, menuItem *menu.MenuItem) *Pr FontName: menuItem.FontName, Image: menuItem.Image, MacTemplateImage: menuItem.MacTemplateImage, + MacAlternate: menuItem.MacAlternate, Tooltip: menuItem.Tooltip, } diff --git a/v2/pkg/menu/menuitem.go b/v2/pkg/menu/menuitem.go index e00f1a7b2..0750cde34 100644 --- a/v2/pkg/menu/menuitem.go +++ b/v2/pkg/menu/menuitem.go @@ -39,9 +39,12 @@ type MenuItem struct { // Image - base64 image data Image string - // MacTemplateImage indicates that on a mac, this image is a template image + // MacTemplateImage indicates that on a Mac, this image is a template image MacTemplateImage bool + // MacAlternate indicates that this item is an alternative to the previous menu item + MacAlternate bool + // Tooltip Tooltip string