Skip to content

Commit

Permalink
[OSX] Implement StatusIcon
Browse files Browse the repository at this point in the history
  • Loading branch information
milani committed Oct 31, 2012
1 parent c415963 commit e2ef58b
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 2 deletions.
3 changes: 2 additions & 1 deletion binding.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@
['OS=="mac"', {
'sources': [
'src/native_window/native_window_mac.mm',
'src/native_menu/native_menu_mac.mm'
'src/native_menu/native_menu_mac.mm',
'src/native_status_icon/native_status_icon_mac.mm'
],
'defines': [
'__MAC__',
Expand Down
8 changes: 7 additions & 1 deletion src/native_status_icon/native_status_icon.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
#define APPJS_BASE_NATIVE_STATUS_ICON_H
#pragma once

#ifdef __MAC__
#import <Cocoa/Cocoa.h>
#endif

#include "appjs.h"
#include "include/cef_browser.h"
#include "includes/util.h"
Expand Down Expand Up @@ -32,7 +36,9 @@ class NativeStatusIcon {
#ifdef __LINUX__
GtkStatusIcon* statusIconHandle_;
#endif

#ifdef __MAC__
NSStatusItem* statusIconHandle_;
#endif
};

} /* appjs */
Expand Down
82 changes: 82 additions & 0 deletions src/native_status_icon/native_status_icon_mac.mm
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,95 @@
#include "includes/cef_handler.h"
#include "native_status_icon/native_status_icon.h"


@interface StatusIconActionManager : NSObject {
appjs::NativeStatusIcon* me_;
}
- (id)initWithObject2:(appjs::NativeStatusIcon*)me_;

@end

@interface StatusIconActionManager ()
@property (nonatomic,readwrite,assign)appjs::NativeStatusIcon* me;
@end

@implementation StatusIconActionManager

@synthesize me = me_;

- (id)initWithObject2:(appjs::NativeStatusIcon*)obj {
self = [super init];
if(self != nil){
self.me = obj;
}
return self;
}

- (void)emitClick:(id)sender {
self.me->Emit("click");
}

- (void)emitPopup:(id)sender {
self.me->Emit("popup");
}
@end

// The global ClientHandler reference.
extern CefRefPtr<ClientHandler> g_handler;

namespace appjs {

void NativeStatusIcon::Init(Settings* settings) {
NSString* iconFile = [NSString stringWithUTF8String:settings->getString("icon","")];
NSString* tooltip = [NSString stringWithUTF8String:settings->getString("tooltip","")];
bool visible = settings->getBoolean("visible",true);

// TODO local or persistent?
v8::Local<v8::Object> menu = settings->getObject("menu");

NativeMenu* nativeMenu;
NSStatusBar* bar = [NSStatusBar systemStatusBar];
NSStatusItem* statusIcon = [bar statusItemWithLength:NSSquareStatusItemLength];
[statusIcon retain];

if( settings->has("icon") ) {
[statusIcon setImage:[[NSImage alloc] initByReferencingFile:iconFile]];
} else {
//?
}

statusIconHandle_ = statusIcon;

if( settings->has("tooltip") ) {
[statusIcon setTitle:tooltip];
}

if( settings->has("menu") ) {

NSMenu* nsmenu = [[NSMenu alloc] initWithTitle:tooltip];
nativeMenu = (NativeMenu*)menu->GetPointerFromInternalField(0);
nativeMenu->Attach(nsmenu);

[statusIcon setMenu:nsmenu];

}

StatusIconActionManager* statusIconManager = [[StatusIconActionManager alloc] initWithObject2:this];

[statusIcon setTarget:statusIconManager];
[statusIcon setAction:@selector(emitClick:)];
[statusIcon setDoubleAction:@selector(emitPopup:)];
[statusIcon setEnabled:visible];
}

void NativeStatusIcon::Show(){
[statusIconHandle_ setEnabled:NO];
this->Emit("show");
}

void NativeStatusIcon::Hide(){
[statusIconHandle_ setEnabled:YES];
this->Emit("hide");
}

} /* appjs */
Expand Down

0 comments on commit e2ef58b

Please sign in to comment.