From f71d2ba1d972c23424f53f6ad5a4d7d0dbc21cee Mon Sep 17 00:00:00 2001 From: "Serge A. Zaitsev" Date: Thu, 12 Jan 2017 13:31:17 +0200 Subject: [PATCH] added nested menus for macos --- tray.h | 53 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/tray.h b/tray.h index 644beee..89b313d 100644 --- a/tray.h +++ b/tray.h @@ -104,10 +104,39 @@ static id statusBarButton; - (void)menuCallback:(id)sender { struct tray_menu *m = (struct tray_menu *)[[sender representedObject] pointerValue]; - m->cb(m); + if (m != NULL && m->cb != NULL) { + m->cb(m); + } } @end +static NSMenu *_tray_menu(struct tray_menu *m) { + NSMenu *menu = [NSMenu new]; + [menu autorelease]; + [menu setAutoenablesItems:NO]; + for (; m != NULL && m->text != NULL; m++) { + if (strcmp(m->text, "-") == 0) { + [menu addItem:[NSMenuItem separatorItem]]; + } else { + NSMenuItem *menuItem = [NSMenuItem alloc]; + [menuItem autorelease]; + [menuItem initWithTitle:[NSString stringWithUTF8String:m->text] + action:@selector(menuCallback:) + keyEquivalent:@""]; + [menuItem setEnabled:(m->disabled ? NO : YES)]; + [menuItem setState:(m->checked ? NSOnState : NSOffState)]; + [menuItem setRepresentedObject:[NSValue valueWithPointer:m]]; + + [menu addItem:menuItem]; + + if (m->submenu != NULL) { + [menu setSubmenu:_tray_menu(m->submenu) forItem:menuItem]; + } + } + } + return menu; +} + static int tray_init(struct tray *tray) { pool = [NSAutoreleasePool new]; [NSApplication sharedApplication]; @@ -143,27 +172,7 @@ static void tray_update(struct tray *tray) { [statusBarButton setImage:[NSImage imageNamed:[NSString stringWithUTF8String:tray->icon]]]; - NSMenu *menu = [NSMenu new]; - [menu autorelease]; - [menu setAutoenablesItems:NO]; - for (struct tray_menu *m = tray->menu; m != NULL && m->text != NULL; m++) { - if (strcmp(m->text, "-") == 0) { - [menu addItem:[NSMenuItem separatorItem]]; - } else { - NSMenuItem *menuItem = [NSMenuItem alloc]; - [menuItem autorelease]; - [menuItem initWithTitle:[NSString stringWithUTF8String:m->text] - action:@selector(menuCallback:) - keyEquivalent:@""]; - [menuItem setEnabled:(m->disabled ? NO : YES)]; - [menuItem setState:(m->checked ? NSOnState : NSOffState)]; - [menuItem setRepresentedObject:[NSValue valueWithPointer:m]]; - - [menu addItem:menuItem]; - } - } - - [statusItem setMenu:menu]; + [statusItem setMenu:_tray_menu(tray->menu)]; } static void tray_exit() { [NSApp terminate:NSApp]; }