Skip to content

Commit 74eca77

Browse files
committed
Mac is working again, enabling and disabling don't seem to work.
1 parent 2a6494a commit 74eca77

File tree

3 files changed

+96
-45
lines changed

3 files changed

+96
-45
lines changed

examples/video/01-menubar/menubar.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
SDL_Window* window = NULL;
1212
SDL_Renderer* renderer = NULL;
1313

14+
SDL_MenuItem* checkable = NULL;
15+
SDL_MenuItem* disabled = NULL;
1416

1517
typedef enum SDL_EventType_MenuExt
1618
{
1719
MENU_BAR_FILE,
1820
MENU_BAR_FILE_NEW_WINDOW,
19-
MENU_BAR_FILE_AUTOSAVE_TABS_ON_CLOSE,
21+
MENU_BAR_FILE_DISABLE_NEW_WINDOW,
2022
MENU_BAR_BOOKMARKS,
2123
MENU_BAR_BOOKMARKS_TOOLBAR,
2224
MENU_BAR_BOOKMARKS_TOOLBAR_GITHUB,
@@ -33,14 +35,15 @@ typedef enum SDL_EventType_MenuExt
3335

3436
static SDL_EventType_MenuExt EVENT_START = (SDL_EventType_MenuExt)0;
3537

38+
3639
void CreateMenuBar()
3740
{
3841
SDL_MenuItem* bar = SDL_CreateMenuBar(window);
3942

4043
{
4144
SDL_MenuItem* menu = SDL_CreateMenuItem(bar, "File", SDL_MENU, MENU_BAR_LAST);
4245
SDL_CreateMenuItem(menu, "New Window", SDL_MENU_BUTTON, MENU_BAR_FILE_NEW_WINDOW);
43-
SDL_MenuItem* checkable = SDL_CreateMenuItem(menu, "Autosave Tabs on Close", SDL_MENU_CHECKABLE, MENU_BAR_FILE_AUTOSAVE_TABS_ON_CLOSE);
46+
checkable = SDL_CreateMenuItem(menu, "Autosave Tabs on Close", SDL_MENU_CHECKABLE, MENU_BAR_FILE_DISABLE_NEW_WINDOW);
4447

4548
SDL_CheckMenuItem(checkable);
4649
}
@@ -63,7 +66,7 @@ void CreateMenuBar()
6366
SDL_MenuItem* checkable = SDL_CreateMenuItem(bar, "Incognito", SDL_MENU_CHECKABLE, MENU_BAR_INCOGNITO);
6467
SDL_assert(!checkable);
6568

66-
SDL_MenuItem* disabled = SDL_CreateMenuItem(bar, "Disabled Top-Level Button", SDL_MENU_BUTTON, MENU_BAR_TOP_LEVEL_BUTTON);
69+
disabled = SDL_CreateMenuItem(bar, "Disabled Top-Level Button", SDL_MENU_BUTTON, MENU_BAR_TOP_LEVEL_BUTTON);
6770
SDL_DisableMenuItem(disabled);
6871

6972
SDL_CreateMenuItem(bar, "Exit", SDL_MENU_BUTTON, MENU_BAR_EXIT);
@@ -122,6 +125,20 @@ SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event) {
122125
SDL_OpenURL("https://stackoverflow.com/questions");
123126
break;
124127
}
128+
case MENU_BAR_FILE_DISABLE_NEW_WINDOW:
129+
{
130+
bool is_checked = false;
131+
SDL_MenuItemChecked(checkable, &is_checked);
132+
if (is_checked) {
133+
SDL_UncheckMenuItem(checkable);
134+
SDL_EnableMenuItem(disabled);
135+
}
136+
else {
137+
SDL_CheckMenuItem(checkable);
138+
SDL_DisableMenuItem(disabled);
139+
}
140+
break;
141+
}
125142
case MENU_BAR_EXIT:
126143
{
127144
return SDL_APP_SUCCESS;

src/video/cocoa/SDL_cocoavideo.m

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,13 @@ static void Cocoa_DeleteDevice(SDL_VideoDevice *device)
127127
device->SetWindowModal = Cocoa_SetWindowModal;
128128
device->SyncWindow = Cocoa_SyncWindow;
129129
device->CreateMenuBar = Cocoa_CreateMenuBar;
130-
device->CreateMenuBarItem = Cocoa_CreateMenuBarItem;
131-
device->CreateMenuItem = Cocoa_CreateMenuItem;
130+
device->CreateMenuItemAt = Cocoa_CreateMenuItemAt;
132131
device->CheckMenuItem = Cocoa_CheckMenuItem;
132+
device->UncheckMenuItem = Cocoa_UncheckMenuItem;
133+
device->MenuItemChecked = Cocoa_MenuItemChecked;
134+
device->MenuItemEnabled = Cocoa_MenuItemEnabled;
133135
device->EnableMenuItem = Cocoa_EnableMenuItem;
136+
device->DisableMenuItem = Cocoa_DisableMenuItem;
134137
device->DestroyMenuItem = Cocoa_DestroyMenuItem;
135138

136139
#ifdef SDL_VIDEO_OPENGL_CGL
@@ -364,50 +367,35 @@ - (void) Cocoa_PlatformMenuData_MenuButtonClicked: (id)sender;{
364367
@end
365368

366369

367-
bool SDLCALL Cocoa_CreateMenuBar(SDL_MenuBar *menu_bar)
370+
371+
372+
373+
374+
375+
bool Cocoa_CreateMenuBar(SDL_MenuBar *menu_bar)
368376
{
369377
PlatformMenuData* platform_menu =[PlatformMenuData new];
370378
platform_menu->menu = [NSMenu new];
371379
[NSApp setMainMenu:platform_menu->menu];
372380

373381
NSMenuItem *appMenuItem = [NSMenuItem new];
374382
NSMenu *appMenu = [NSMenu new];
375-
[appMenu addItemWithTitle: @"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
383+
//[appMenu addItemWithTitle: @"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
376384
[appMenuItem setSubmenu:appMenu];
377385

378386
[platform_menu->menu addItem:appMenuItem];
379387

380-
menu_bar->common.platform_data = CFBridgingRetain(platform_menu);
388+
menu_bar->common.item_common.platform_data = CFBridgingRetain(platform_menu);
381389

382390
return true;
383-
// **** App Menu **** //
384-
// NSMenuItem *appMenuItem = [NSMenuItem new];
385-
// NSMenu *appMenu = [NSMenu new];
386-
// [appMenu addItemWithTitle: @"Quit" action:@selector(terminate:) keyEquivalent:@"q"];
387-
// [appMenuItem setSubmenu:appMenu];
388-
// [menubar addItem:appMenuItem];
389-
// // **** File Menu **** //
390-
// NSMenuItem *fileMenuItem = [NSMenuItem new];
391-
// NSMenu *fileMenu = [[NSMenu alloc] initWithTitle:@"File"];
392-
// //[fileMenu addItemWithTitle:@"New" action:@selector(menuAction:) keyEquivalent:@""];
393-
// //[fileMenu addItemWithTitle:@"Open" action:@selector(menuAction:) keyEquivalent:@""];
394-
// //[fileMenu addItemWithTitle:@"Save" action:@selector(menuAction:) keyEquivalent:@""];
395-
// NSMenuItem *newItem = [fileMenu addItemWithTitle:@"New" action:@selector(Cocoa_PlatformMenuData_MenuButtonClicked:) keyEquivalent:@""];
396-
// newItem.target = platform_menu;
397-
// [fileMenuItem setSubmenu: fileMenu];
398-
// [menubar addItem: fileMenuItem];
399391
}
400392

401-
bool Cocoa_CreateMenuBarItem(SDL_MenuItem *menu_item, const char *name, Uint16 event_type)
402-
{
403-
return Cocoa_CreateMenuItem((SDL_MenuItem*)menu_item, name, event_type);
404-
}
405-
406-
bool Cocoa_CreateMenuItem(SDL_MenuItem *menu_item, const char *name, Uint16 event_type)
393+
bool Cocoa_CreateMenuItemAt(SDL_MenuItem *menu_item, size_t index, const char *name, Uint16 event_type)
407394
{
408395
PlatformMenuData* platform_data = [PlatformMenuData new];
409396
platform_data->user_event_type = event_type;
410397
menu_item->common.platform_data = CFBridgingRetain(platform_data);
398+
411399
PlatformMenuData* parent_platform_data = (__bridge id _Nullable)(menu_item->common.parent->common.platform_data);
412400
NSString* name_ns = [NSString stringWithUTF8String:name];
413401

@@ -420,27 +408,71 @@ bool Cocoa_CreateMenuItem(SDL_MenuItem *menu_item, const char *name, Uint16 even
420408
[parent_platform_data->menu addItem: platform_data->menu_item];
421409

422410
} else {
423-
platform_data->menu_item = [parent_platform_data->menu addItemWithTitle:name_ns action:@selector(Cocoa_PlatformMenuData_MenuButtonClicked:) keyEquivalent:@""];
411+
platform_data->menu_item = [NSMenuItem alloc];
412+
[platform_data->menu_item setTitle:name_ns];
413+
[platform_data->menu_item setAction:@selector(Cocoa_PlatformMenuData_MenuButtonClicked:)];
414+
[platform_data->menu_item setTarget:platform_data];
415+
[platform_data->menu_item setEnabled:true];
424416

425-
[platform_data->menu_item setTarget:platform_data];
426-
[platform_data->menu_item setEnabled:true];
417+
if ((menu_item->common.parent->common.type == SDL_MENUBAR) && (menu_item->common.type != SDL_MENU)) {
418+
NSMenu* app_menu = [[parent_platform_data->menu itemAtIndex:(NSInteger)0] submenu];
419+
[app_menu addItem:platform_data->menu_item];
420+
421+
} else {
422+
[parent_platform_data->menu insertItem:platform_data->menu_item atIndex:(NSInteger)index];
423+
}
427424
}
428425
return true;
429426
}
430427

431-
bool Cocoa_CheckMenuItem(SDL_MenuItem *menu_item, bool checked)
428+
429+
bool Cocoa_CheckMenuItem(SDL_MenuItem *menu_item)
432430
{
433-
return false;
431+
PlatformMenuData* platform_data = (__bridge PlatformMenuData*)menu_item->common.platform_data;
432+
[platform_data->menu_item setState:NSControlStateValueOn];
433+
return true;
434434
}
435435

436-
bool Cocoa_EnableMenuItem(SDL_MenuItem *menu_item, bool enabled)
436+
bool Cocoa_UncheckMenuItem(SDL_MenuItem *menu_item)
437437
{
438-
return false;
438+
PlatformMenuData* platform_data = (__bridge PlatformMenuData*)menu_item->common.platform_data;
439+
[platform_data->menu_item setState:NSControlStateValueOff];
440+
return true;
439441
}
440442

441-
void Cocoa_DestroyMenuItem(SDL_MenuItem *menu_item)
443+
bool Cocoa_MenuItemChecked(SDL_MenuItem *menu_item, bool *checked)
442444
{
445+
PlatformMenuData* platform_data = (__bridge PlatformMenuData*)menu_item->common.platform_data;
446+
return [platform_data->menu_item state] == NSControlStateValueOn;
447+
}
448+
449+
bool Cocoa_MenuItemEnabled(SDL_MenuItem *menu_item, bool *enabled)
450+
{
451+
PlatformMenuData* platform_data = (__bridge PlatformMenuData*)menu_item->common.platform_data;
452+
return [platform_data->menu_item isEnabled];
453+
}
454+
455+
bool Cocoa_EnableMenuItem(SDL_MenuItem *menu_item)
456+
{
457+
PlatformMenuData* platform_data = (__bridge PlatformMenuData*)menu_item->common.platform_data;
458+
[platform_data->menu_item setEnabled:true];
459+
return true;
460+
}
461+
462+
bool Cocoa_DisableMenuItem(SDL_MenuItem *menu_item)
463+
{
464+
PlatformMenuData* platform_data = (__bridge PlatformMenuData*)menu_item->common.platform_data;
465+
[platform_data->menu_item setEnabled:false];
466+
return true;
467+
}
468+
469+
bool Cocoa_DestroyMenuItem(SDL_MenuItem *menu_item)
470+
{
471+
PlatformMenuData* platform_data = (__bridge PlatformMenuData*)menu_item->common.platform_data;
472+
PlatformMenuData* parent_platform_data = (__bridge id _Nullable)(menu_item->common.parent->common.platform_data);
473+
[parent_platform_data->menu removeItem:platform_data->menu_item];
443474
return false;
444475
}
445476

477+
446478
#endif // SDL_VIDEO_DRIVER_COCOA

src/video/cocoa/SDL_cocoawindow.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,14 @@ extern bool Cocoa_SyncWindow(SDL_VideoDevice *_this, SDL_Window *window);
196196

197197
extern void Cocoa_MenuVisibilityCallback(void *userdata, const char *name, const char *oldValue, const char *newValue);
198198

199-
200-
extern bool SDLCALL Cocoa_CreateMenuBar(SDL_MenuBar *menu_bar);
201-
extern bool Cocoa_CreateMenuBarItem(SDL_MenuItem *menu_item, const char *name, Uint16 event_type);
202-
extern bool Cocoa_CreateMenuItem(SDL_MenuItem *menu_item, const char *name, Uint16 event_type);
203-
extern bool Cocoa_CheckMenuItem(SDL_MenuItem *menu_item, bool checked);
204-
extern bool Cocoa_EnableMenuItem(SDL_MenuItem *menu_item, bool enabled);
205-
extern void Cocoa_DestroyMenuItem(SDL_MenuItem *menu_item);
199+
extern bool Cocoa_CreateMenuBar(SDL_MenuBar *menu_bar);
200+
extern bool Cocoa_CreateMenuItemAt(SDL_MenuItem *menu_item, size_t index, const char *name, Uint16 event_type);
201+
extern bool Cocoa_CheckMenuItem(SDL_MenuItem *menu_item);
202+
extern bool Cocoa_UncheckMenuItem(SDL_MenuItem *menu_item);
203+
extern bool Cocoa_MenuItemChecked(SDL_MenuItem *menu_item, bool *checked);
204+
extern bool Cocoa_MenuItemEnabled(SDL_MenuItem *menu_item, bool *enabled);
205+
extern bool Cocoa_EnableMenuItem(SDL_MenuItem *menu_item);
206+
extern bool Cocoa_DisableMenuItem(SDL_MenuItem *menu_item);
207+
extern bool Cocoa_DestroyMenuItem(SDL_MenuItem *menu_item);
206208

207209
#endif // SDL_cocoawindow_h_

0 commit comments

Comments
 (0)