diff options
Diffstat (limited to 'lib/systray_darwin.c')
| -rw-r--r-- | lib/systray_darwin.c | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/lib/systray_darwin.c b/lib/systray_darwin.c new file mode 100644 index 0000000..50a37d8 --- /dev/null +++ b/lib/systray_darwin.c @@ -0,0 +1,165 @@ +#import <Cocoa/Cocoa.h> +#include "../systray.h" + +@interface MenuItem : NSObject +{ + @public + NSString* menuId; + NSString* title; + NSString* tooltip; + short disabled; + short checked; +} +-(id) initWithId: (const char*)theMenuId + withTitle: (const char*)theTitle + withTooltip: (const char*)theTooltip + withDisabled: (short)theDisabled + withChecked: (short)theChecked; + @end + @implementation MenuItem + -(id) initWithId: (const char*)theMenuId + withTitle: (const char*)theTitle + withTooltip: (const char*)theTooltip + withDisabled: (short)theDisabled + withChecked: (short)theChecked +{ + menuId = [[NSString alloc] initWithCString:theMenuId + encoding:NSUTF8StringEncoding]; + title = [[NSString alloc] initWithCString:theTitle + encoding:NSUTF8StringEncoding]; + tooltip = [[NSString alloc] initWithCString:theTooltip + encoding:NSUTF8StringEncoding]; + disabled = theDisabled; + checked = theChecked; + return self; +} +@end + +@interface AppDelegate: NSObject <NSApplicationDelegate> + - (void) add_or_update_menu_item:(MenuItem*) item; + - (IBAction)menuHandler:(id)sender; + @property (assign) IBOutlet NSWindow *window; + @end + + @implementation AppDelegate +{ + NSStatusItem *statusItem; + NSMenu *menu; + NSCondition* cond; +} + +@synthesize window = _window; +#pragma GCC diagnostic ignored "-Wunused-parameter" +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + self->statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; + NSZone *menuZone = [NSMenu menuZone]; + self->menu = [[NSMenu allocWithZone:menuZone] init]; + [self->menu setAutoenablesItems: FALSE]; + [self->statusItem setMenu:self->menu]; + systray_ready(); +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification +{ + [[NSStatusBar systemStatusBar] removeStatusItem: statusItem]; +} +#pragma GCC diagnostic warning "-Wunused-parameter" + +- (void)setIcon:(NSImage *)image { + [statusItem setImage:image]; +} + +- (void)setTitle:(NSString *)title { + [statusItem setTitle:title]; +} + +- (void)setTooltip:(NSString *)tooltip { + [statusItem setToolTip:tooltip]; +} + +- (IBAction)menuHandler:(id)sender +{ + NSString* menuId = [sender representedObject]; + systray_menu_item_selected((char*)[menuId cStringUsingEncoding: NSUTF8StringEncoding]); +} + +- (void) add_or_update_menu_item:(MenuItem*) item +{ + NSMenuItem* menuItem; + int existedMenuIndex = [menu indexOfItemWithRepresentedObject: item->menuId]; + if (existedMenuIndex == -1) { + menuItem = [menu addItemWithTitle:item->title action:@selector(menuHandler:) keyEquivalent:@""]; + [menuItem setTarget:self]; + [menuItem setRepresentedObject: item->menuId]; + + } + else { + menuItem = [menu itemAtIndex: existedMenuIndex]; + [menuItem setTitle:item->title]; + } + [menuItem setToolTip:item->tooltip]; + if (item->disabled == 1) { + [menuItem setEnabled:FALSE]; + } else { + [menuItem setEnabled:TRUE]; + } + if (item->checked == 1) { + [menuItem setState:NSOnState]; + } else { + [menuItem setState:NSOffState]; + } +} + +- (void) quit +{ + [NSApp terminate:self]; +} + +@end + +int nativeLoop(void) { + AppDelegate *delegate = [[AppDelegate alloc] init]; + [[NSApplication sharedApplication] setDelegate:delegate]; + [NSApp run]; + return EXIT_SUCCESS; +} + +void runInMainThread(SEL method, id object) { + [(AppDelegate*)[NSApp delegate] + performSelectorOnMainThread:method + withObject:object + waitUntilDone: YES]; +} + +void setIcon(const char* iconBytes, int length) { + NSData* buffer = [NSData dataWithBytes: iconBytes length:length]; + NSImage *image = [[NSImage alloc] initWithData:buffer]; + runInMainThread(@selector(setIcon:), (id)image); +} + +void setTitle(char* ctitle) { + NSString* title = [[NSString alloc] initWithCString:ctitle + encoding:NSUTF8StringEncoding]; + free(ctitle); + runInMainThread(@selector(setTitle:), (id)title); +} + +void setTooltip(char* ctooltip) { + NSString* tooltip = [[NSString alloc] initWithCString:ctooltip + encoding:NSUTF8StringEncoding]; + free(ctooltip); + runInMainThread(@selector(setTooltip:), (id)tooltip); +} + +void add_or_update_menu_item(char* menuId, char* title, char* tooltip, short disabled, short checked) { + MenuItem* item = [[MenuItem alloc] initWithId: menuId withTitle: title withTooltip: tooltip withDisabled: disabled withChecked: checked]; + free(menuId); + free(title); + free(tooltip); + runInMainThread(@selector(add_or_update_menu_item:), (id)item); +} + +void quit() { + runInMainThread(@selector(quit), nil); +} |
