ui/cocoa/menu.m

Mon, 29 Sep 2025 21:14:46 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 29 Sep 2025 21:14:46 +0200
changeset 779
b84cbe57e0bd
parent 710
6c7f700e4900
permissions
-rw-r--r--

change UiCellValue from struct to union and pass it as pointer to the onsave function, for better compatibility with other languages

541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2014 Olaf Wintermann. All rights reserved.
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #import <stdio.h>
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #import <stdlib.h>
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #import <string.h>
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #import <stdarg.h>
569
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
33 #import <objc/runtime.h>
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #import "menu.h"
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 #import "window.h"
569
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
37 #import "EventData.h"
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
39 #pragma GCC diagnostic ignored "-Wundeclared-selector"
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
40 #pragma clang diagnostic ignored "-Wundeclared-selector"
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
41
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
42 // holds all items that need bindings
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
43 // value type: MenuItem*
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
44 static NSMutableArray *bindingItems;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
45
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
46 @implementation MenuItem
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
47
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
48 - (MenuItem*)init:(int)itId {
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
49 self.itemId = [[NSString alloc] initWithFormat:@"item%d", itId];
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
50 return self;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
51 }
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
52
710
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
53 - (void)handleToggleEvent:(id)sender {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
54 NSMenuItem *item = (NSMenuItem*)sender;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
55 if(!_state) {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
56 item.state = NSControlStateValueOn;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
57 } else {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
58 item.state = NSControlStateValueOff;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
59 }
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
60 _state = !_state;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
61
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
62 if(_callback) {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
63 UiEvent event;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
64 event.obj = _obj;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
65 event.window = event.obj->window;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
66 event.document = event.obj->ctx->document;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
67 event.eventdata = NULL;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
68 event.eventdatatype = 0;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
69 event.intval = _state;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
70 event.set = ui_get_setop();
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
71 _callback(&event, _userdata);
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
72 }
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
73 }
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
74
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
75 @end
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
76
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 static ui_menu_add_f createMenuItem[] = {
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 /* UI_MENU */ add_menu_widget,
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 /* UI_MENU_ITEM */ add_menuitem_widget,
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 /* UI_MENU_CHECK_ITEM */ add_checkitem_widget,
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 /* UI_MENU_RADIO_ITEM */ add_radioitem_widget,
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 /* UI_MENU_ITEM_LIST */ add_menuitem_list_widget,
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 /* UI_MENU_CHECKITEM_LIST */ add_menuitem_list_widget,
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 /* UI_MENU_RADIOITEM_LIST */ add_menuitem_list_widget,
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 /* UI_MENU_SEPARATOR */ add_menuseparator_widget
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 };
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
88 void ui_add_menu_items(UiObject *obj, NSMenu *parent, int i, UiMenu *menu) {
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 UiMenuItemI *it = menu->items_begin;
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 int index = 0;
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 while(it) {
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
92 createMenuItem[it->type](obj, parent, index, it);
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 it = it->next;
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 index++;
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
98 void add_menu_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 UiMenu *it = (UiMenu*)item;
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 NSString *str = [[NSString alloc] initWithUTF8String:it->label];
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 NSMenu *menu = [[NSMenu alloc] initWithTitle: str];
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 NSMenuItem *menuItem = [parent addItemWithTitle:str action:nil keyEquivalent:@""];
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 [parent setSubmenu:menu forItem:menuItem];
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
105 ui_add_menu_items(obj, menu, i, it);
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
108 void add_menuitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 UiMenuItem *it = (UiMenuItem*)item;
569
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
110
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 NSString *str = [[NSString alloc] initWithUTF8String:it->label];
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
112 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuItemAction) keyEquivalent:@""];
569
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
113
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
114 if(it->callback) {
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
115 EventData *event = [[EventData alloc] init:it->callback userdata:it->userdata];
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
116 if(obj) {
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
117 event.obj = obj;
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
118 menuItem.target = event;
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
119 menuItem.action = @selector(handleEvent:);
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
120 }
569
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
121 objc_setAssociatedObject(menuItem, "eventdata", event, OBJC_ASSOCIATION_RETAIN);
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
122 }
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
125 void add_menuseparator_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
126 NSMenuItem *menuItem = [NSMenuItem separatorItem];
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
127 [parent addItem:menuItem];
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
130 static int nItem = 0;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
131
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
132 void add_checkitem_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
133 UiMenuCheckItem *it = (UiMenuCheckItem*)item;
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
135 NSString *str = [[NSString alloc] initWithUTF8String:it->label];
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
136 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuCheckItemAction:) keyEquivalent:@""];
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
137
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
138 MenuItem *mItem = [[MenuItem alloc] init:nItem++];
710
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
139 mItem.menuItem = menuItem;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
140 mItem.obj = obj;
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
141 mItem.callback = it->callback;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
142 mItem.userdata = it->userdata;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
143 mItem.checkItem = it;
710
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
144 if(it->varname) {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
145 mItem.varname = [[NSString alloc] initWithUTF8String:it->varname];
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
146 }
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
147
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
148 objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN);
710
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
149
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
150 if(!obj) {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
151 [bindingItems addObject:mItem];
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
152 } else {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
153 mItem.var = uic_widget_var(obj->ctx, obj->ctx, NULL, it->varname, UI_VAR_INTEGER);
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
154 if(mItem.var) {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
155 UiInteger *i = mItem.var->value;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
156 i->obj = (__bridge void*)mItem;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
157 i->get = ui_menu_toggleitem_get;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
158 i->set = ui_menu_toggleitem_set;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
159 }
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
160 menuItem.target = mItem;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
161 menuItem.action = @selector(handleToggleEvent:);
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
162 }
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
165 void add_radioitem_widget(UiObject *obj, NSMenu *parent, int index, UiMenuItemI *item) {
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
166 UiMenuRadioItem *it = (UiMenuRadioItem*)item;
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
168 NSString *str = [[NSString alloc] initWithUTF8String:it->label];
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
169 NSMenuItem *menuItem = [parent addItemWithTitle:str action:@selector(menuRadioItemAction:) keyEquivalent:@""];
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
170
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
171 MenuItem *mItem = [[MenuItem alloc] init:nItem++];
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
172 mItem.callback = it->callback;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
173 mItem.userdata = it->userdata;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
174 mItem.radioItem = it;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
175
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
176 objc_setAssociatedObject(menuItem, "menuitem", mItem, OBJC_ASSOCIATION_RETAIN);
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
177 [bindingItems addObject:mItem];
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
179
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
180 void add_checkitemnv_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
182 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
184 void add_menuitem_list_widget(UiObject *obj, NSMenu *parent, int i, UiMenuItemI *item) {
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 void ui_menu_init(void) {
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
190 bindingItems = [[NSMutableArray alloc] init];
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
191
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 UiMenu *menus_begin = uic_get_menu_list();
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 UiMenu *ls = menus_begin;
569
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
194 int index = 1;
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 while(ls) {
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 if(ls->item.type == UI_MENU) {
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197 NSString *str = [[NSString alloc] initWithUTF8String:ls->label];
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 NSMenu *menu = [[NSMenu alloc] initWithTitle: str];
569
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
199 NSMenuItem *menuItem = [[NSApp mainMenu] insertItemWithTitle:str action:nil keyEquivalent:@"" atIndex:index];
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200 [[NSApp mainMenu] setSubmenu:menu forItem:menuItem];
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
201
709
131d38916ac7 fix toolbar menuitem event handling (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 708
diff changeset
202 ui_add_menu_items(NULL, menu, 0, ls);
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
203 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
204 ls = (UiMenu*)ls->item.next;
569
5c06bb9ea458 implement menu item callbacks (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 541
diff changeset
205 index++;
541
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
206 }
63289f61fb7f add basic code structure for cocoa menu implementation
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
207 }
570
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
208
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
209 NSArray* ui_get_binding_items(void) {
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
210 return bindingItems;
a2df724b4cb9 implement toggle menu items (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 569
diff changeset
211 }
710
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
212
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
213
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
214 int64_t ui_menu_toggleitem_get(UiInteger *i) {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
215 MenuItem *item = (__bridge MenuItem*)i->obj;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
216 i->value = item.state;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
217 return i->value;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
218 }
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
219
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
220 void ui_menu_toggleitem_set(UiInteger *i, int64_t value) {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
221 MenuItem *item = (__bridge MenuItem*)i->obj;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
222 i->value = value;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
223 if(value != 0) {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
224 item.menuItem.state = NSControlStateValueOn;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
225 } else {
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
226 item.menuItem.state = NSControlStateValueOff;
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
227 }
6c7f700e4900 handle toggle menu items separately when not created as AppMenu item (Cocoa)
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 709
diff changeset
228 }

mercurial