fix toolbar menuitem event handling (Cocoa)

Sat, 23 Aug 2025 14:00:09 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 23 Aug 2025 14:00:09 +0200
changeset 709
131d38916ac7
parent 708
0598e70c6489
child 710
6c7f700e4900

fix toolbar menuitem event handling (Cocoa)

ui/cocoa/MainWindow.m file | annotate | diff | comparison | revisions
ui/cocoa/Toolbar.m file | annotate | diff | comparison | revisions
ui/cocoa/menu.h file | annotate | diff | comparison | revisions
ui/cocoa/menu.m file | annotate | diff | comparison | revisions
--- a/ui/cocoa/MainWindow.m	Sat Aug 23 11:45:10 2025 +0200
+++ b/ui/cocoa/MainWindow.m	Sat Aug 23 14:00:09 2025 +0200
@@ -141,8 +141,13 @@
 - (void)menuItemAction:(id)sender {
     EventData *event = objc_getAssociatedObject(sender, "eventdata");
     if(event) {
-        event.obj = self.uiobj; // temporary set the event object
-        [event handleEvent:sender];
+        if(event.obj) {
+            [event handleEvent:sender];
+        } else {
+            event.obj = self.uiobj;
+            [event handleEvent:sender];
+            event.obj = NULL;
+        }
     }
 }
 
--- a/ui/cocoa/Toolbar.m	Sat Aug 23 11:45:10 2025 +0200
+++ b/ui/cocoa/Toolbar.m	Sat Aug 23 14:00:09 2025 +0200
@@ -237,7 +237,7 @@
     }
     
     NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
-    ui_add_menu_items(menu, 0, &item->menu);
+    ui_add_menu_items(obj, menu, 0, &item->menu);
     
     button.menu = menu;
     
--- a/ui/cocoa/menu.h	Sat Aug 23 11:45:10 2025 +0200
+++ b/ui/cocoa/menu.h	Sat Aug 23 14:00:09 2025 +0200
@@ -45,16 +45,16 @@
 
 void ui_menu_init(void);
 
-typedef void(*ui_menu_add_f)(NSMenu*, int, UiMenuItemI*);
+typedef void(*ui_menu_add_f)(UiObject*, NSMenu*, int, UiMenuItemI*);
 
-void add_menu_widget(NSMenu *parent, int i, UiMenuItemI *item);
-void add_menuitem_widget(NSMenu *parent, int i, UiMenuItemI *item);
-void add_menuseparator_widget(NSMenu *parent, int i, UiMenuItemI *item);
-void add_checkitem_widget(NSMenu *parent, int i, UiMenuItemI *item);
-void add_radioitem_widget(NSMenu *parent, int index, UiMenuItemI *item);
-void add_checkitemnv_widget(NSMenu *parent, int i, UiMenuItemI *item);
-void add_menuitem_list_widget(NSMenu *parent, int i, UiMenuItemI *item);
+void add_menu_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item);
+void add_menuitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item);
+void add_menuseparator_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item);
+void add_checkitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item);
+void add_radioitem_widget(UiObject *obj, NSMenu *parent, int index, UiMenuItemI *item);
+void add_checkitemnv_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item);
+void add_menuitem_list_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item);
 
-void ui_add_menu_items(NSMenu *parent, int i, UiMenu *menu);
+void ui_add_menu_items(UiObject *obj, NSMenu *parent, int i, UiMenu *menu);
 
 NSArray* ui_get_binding_items(void);
--- a/ui/cocoa/menu.m	Sat Aug 23 11:45:10 2025 +0200
+++ b/ui/cocoa/menu.m	Sat Aug 23 14:00:09 2025 +0200
@@ -63,46 +63,51 @@
     /* UI_MENU_SEPARATOR       */ add_menuseparator_widget
 };
 
-void ui_add_menu_items(NSMenu *parent, int i, UiMenu *menu) {
+void ui_add_menu_items(UiObject *obj, NSMenu *parent, int i, UiMenu *menu) {
     UiMenuItemI *it = menu->items_begin;
     int index = 0;
     while(it) {
-        createMenuItem[it->type](parent, index, it);
+        createMenuItem[it->type](obj, parent, index, it);
         it = it->next;
         index++;
     }
 }
 
-void add_menu_widget(NSMenu *parent, int i, UiMenuItemI *item) {
+void add_menu_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
     UiMenu *it = (UiMenu*)item;
     NSString *str = [[NSString alloc] initWithUTF8String:it->label];
     NSMenu *menu = [[NSMenu alloc] initWithTitle: str];
     NSMenuItem *menuItem = [parent addItemWithTitle:str action:nil keyEquivalent:@""];
     [parent setSubmenu:menu forItem:menuItem];
     
-    ui_add_menu_items(menu, i, it);
+    ui_add_menu_items(obj, menu, i, it);
 }
 
-void add_menuitem_widget(NSMenu *parent, int i, UiMenuItemI *item) {
+void add_menuitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
     UiMenuItem *it = (UiMenuItem*)item;
     
     NSString *str = [[NSString alloc] initWithUTF8String:it->label];
-    NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction:) keyEquivalent:@""];
+    NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction) keyEquivalent:@""];
     
     if(it->callback) {
         EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata];
+        if(obj) {
+            event.obj = obj;
+            menuItem.target = event;
+            menuItem.action = @selector(handleEvent:);
+        }
         objc_setAssociatedObject(menuItem, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
     }
 }
 
-void add_menuseparator_widget(NSMenu *parent, int i, UiMenuItemI *item) {
+void add_menuseparator_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
     NSMenuItem *menuItem = [NSMenuItem separatorItem];
     [parent addItem:menuItem];
 }
 
 static int nItem = 0;
 
-void add_checkitem_widget(NSMenu *parent, int i, UiMenuItemI *item) {
+void add_checkitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
     UiMenuCheckItem *it = (UiMenuCheckItem*)item;
     
     NSString *str = [[NSString alloc] initWithUTF8String:it->label];
@@ -117,7 +122,7 @@
     [bindingItems addObject:mItem];
 }
 
-void add_radioitem_widget(NSMenu *parent, int index, UiMenuItemI *item) {
+void add_radioitem_widget(UiObject *obj, NSMenu *parent, int index, UiMenuItemI *item) {
     UiMenuRadioItem *it = (UiMenuRadioItem*)item;
     
     NSString *str = [[NSString alloc] initWithUTF8String:it->label];
@@ -132,11 +137,11 @@
     [bindingItems addObject:mItem];
 }
 
-void add_checkitemnv_widget(NSMenu *parent, int i, UiMenuItemI *item) {
+void add_checkitemnv_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
     
 }
 
-void add_menuitem_list_widget(NSMenu *parent, int i, UiMenuItemI *item) {
+void add_menuitem_list_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
     
 }
 
@@ -154,7 +159,7 @@
             NSMenuItem *menuItem = [[NSApp mainMenu] insertItemWithTitle:str action:nil keyEquivalent:@"" atIndex:index];
             [[NSApp mainMenu] setSubmenu:menu forItem:menuItem];
             
-            ui_add_menu_items(menu, 0, ls);
+            ui_add_menu_items(NULL, menu, 0, ls);
         }
         ls = (UiMenu*)ls->item.next;
         index++;

mercurial