-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNSMenu.c3
125 lines (103 loc) · 3.48 KB
/
NSMenu.c3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// NSMenu.c3
module objc_foundation @if(env::DARWIN) @link(env::DARWIN, "Cocoa.framework");
import std::io;
// Menu item states
enum NSMenuItemState : int {
// MIXED = -1,
OFF,
ON
}
// Create a new menu
fn void* nsMenu_init(char* title) {
void* menuClass = objc_GetClass("NSMenu");
if (menuClass == null) return null;
void* menu = objc_Alloc(menuClass);
if (menu == null) return null;
void* titleStr = createNSString(title);
if (titleStr == null) {
objc_release(menu);
return null;
}
void* sel = sel_registerName("initWithTitle:");
void* result = ((MsgSend1)&objc_msgSend)(menu, sel, titleStr);
objc_release(titleStr);
return result;
}
// Create a menu item
fn void* nsMenuItem_init(char* title, char* action, char* keyEquivalent) {
void* itemClass = objc_GetClass("NSMenuItem");
if (itemClass == null) return null;
void* item = objc_Alloc(itemClass);
if (item == null) return null;
void* titleStr = createNSString(title);
void* keyStr = createNSString(keyEquivalent);
if (titleStr == null || keyStr == null) {
if (titleStr != null) objc_release(titleStr);
if (keyStr != null) objc_release(keyStr);
objc_release(item);
return null;
}
void* sel = sel_registerName("initWithTitle:action:keyEquivalent:");
void* actionSel = action ? sel_registerName(action) : null;
void* result = ((MsgSend3)&objc_msgSend)(item, sel, titleStr, actionSel, keyStr);
objc_release(titleStr);
objc_release(keyStr);
return result;
}
// Add item to menu
fn void nsMenu_addItem(void* menu, void* item) {
if (menu == null || item == null) return;
void* sel = sel_registerName("addItem:");
((MsgSend1)&objc_msgSend)(menu, sel, item);
}
// Add separator
fn void nsMenu_addSeparator(void* menu) {
if (menu == null) return;
void* sel = sel_registerName("addItem:");
void* separator = nsMenuItem_init("-", null, "");
if (separator != null) {
((MsgSend1)&objc_msgSend)(menu, sel, separator);
objc_release(separator);
}
}
// Set menu as application main menu
fn void nsApp_setMainMenu(void* menu) {
if (menu == null) return;
void* app = nsApp_sharedApplication();
if (app == null) return;
void* sel = sel_registerName("setMainMenu:");
((MsgSend1)&objc_msgSend)(app, sel, menu);
}
// Create standard application menu
fn void* nsMenu_createApplicationMenu(char* appName) {
void* mainMenu = nsMenu_init("");
if (mainMenu == null) return null;
// Application menu
void* appMenu = nsMenu_init(appName);
if (appMenu == null) {
objc_release(mainMenu);
return null;
}
// About item
void* aboutItem = nsMenuItem_init("About", "orderFrontStandardAboutPanel:", "");
if (aboutItem != null) {
nsMenu_addItem(appMenu, aboutItem);
objc_release(aboutItem);
}
nsMenu_addSeparator(appMenu);
// Quit item
void* quitItem = nsMenuItem_init("Quit", "terminate:", "q");
if (quitItem != null) {
nsMenu_addItem(appMenu, quitItem);
objc_release(quitItem);
}
// Add app menu to main menu
void* appMenuItem = nsMenuItem_init("", null, "");
if (appMenuItem != null) {
((MsgSend1)&objc_msgSend)(appMenuItem, sel_registerName("setSubmenu:"), appMenu);
nsMenu_addItem(mainMenu, appMenuItem);
objc_release(appMenuItem);
}
objc_release(appMenu);
return mainMenu;
}