diff options
Diffstat (limited to 'lib/systray_darwin.c')
| -rw-r--r-- | lib/systray_darwin.c | 163 | 
1 files changed, 163 insertions, 0 deletions
| diff --git a/lib/systray_darwin.c b/lib/systray_darwin.c new file mode 100644 index 0000000..fffc49e --- /dev/null +++ b/lib/systray_darwin.c @@ -0,0 +1,163 @@ +#import <Cocoa/Cocoa.h> +#include "../systray.h" + +@interface MenuItem : NSObject +{ +  @public +    NSNumber* menuId; +    NSString* title; +    NSString* tooltip; +    short disabled; +    short checked; +} +-(id) initWithId: (int)theMenuId +       withTitle: (const char*)theTitle +     withTooltip: (const char*)theTooltip +    withDisabled: (short)theDisabled +     withChecked: (short)theChecked; +     @end +     @implementation MenuItem +     -(id) initWithId: (int)theMenuId +            withTitle: (const char*)theTitle +          withTooltip: (const char*)theTooltip +         withDisabled: (short)theDisabled +          withChecked: (short)theChecked +{ +  menuId = [NSNumber numberWithInt:theMenuId]; +  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 +{ +  NSNumber* menuId = [sender representedObject]; +  systray_menu_item_selected(menuId.intValue); +} + +- (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(int menuId, char* title, char* tooltip, short disabled, short checked) { +  MenuItem* item = [[MenuItem alloc] initWithId: menuId withTitle: title withTooltip: tooltip withDisabled: disabled withChecked: checked]; +  free(title); +  free(tooltip); +  runInMainThread(@selector(add_or_update_menu_item:), (id)item); +} + +void quit() { +  runInMainThread(@selector(quit), nil); +} | 
