Skip to content

Commit

Permalink
[Linux] Basic status icon implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
milani committed Oct 30, 2012
1 parent a97185c commit 1e1a23d
Show file tree
Hide file tree
Showing 19 changed files with 333 additions and 85 deletions.
5 changes: 4 additions & 1 deletion binding.gyp
Original file line number Diff line number Diff line change
Expand Up @@ -243,8 +243,10 @@
'src/appjs_app.cpp',
'src/appjs_window.cpp',
'src/appjs_menu.cpp',
'src/appjs_status_icon.cpp',
'src/native_window/native_window.cpp',
'src/native_menu/native_menu.cpp',
'src/native_status_icon/native_status_icon.cpp',
'src/includes/cef_handler.cpp',
'src/includes/cef.cpp',
'src/includes/cef_loop.cpp',
Expand Down Expand Up @@ -288,7 +290,8 @@
['OS=="linux"', {
'sources': [
'src/native_window/native_window_linux.cpp',
'src/native_menu/native_menu_linux.cpp'
'src/native_menu/native_menu_linux.cpp',
'src/native_status_icon/native_status_icon_linux.cpp'
],
'defines': [
'__LINUX__',
Expand Down
32 changes: 22 additions & 10 deletions lib/App.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
var EventEmitter = require('events').EventEmitter,
Router = require('./router').Router,
Window = require('./window'),
_App = require('./bindings').App,
NativeWindow = require('./bindings').NativeWindow,
NativeMenu = require('./bindings').NativeMenu,
WindowSettings = require('./settings').WindowSettings,
AppSettings = require('./settings').AppSettings;
var EventEmitter = require('events').EventEmitter,
Router = require('./router').Router,
Window = require('./window'),
_App = require('./bindings').App,
NativeWindow = require('./bindings').NativeWindow,
NativeMenu = require('./bindings').NativeMenu,
NativeStatusIcon = require('./bindings').NativeStatusIcon,
WindowSettings = require('./settings').WindowSettings,
AppSettings = require('./settings').AppSettings;

var _init = require('./bindings').init,
decorate = require('./utils').decorate,
Expand Down Expand Up @@ -46,6 +47,16 @@ inherit(App, EventEmitter, [
]);
return nativeMenu;
},
function createStatusIcon(options){
var self = this,
nativeStatusIcon = new NativeStatusIcon(options);
inherit(nativeStatusIcon, EventEmitter, [
function toString(){
return '[object StatusIcon]';
}
]);
return nativeStatusIcon;
},
function createWindow(url, options){
if (!this.settings) {
this.init();
Expand Down Expand Up @@ -106,8 +117,9 @@ inherit(App, EventEmitter, [
]);


NativeMenu.prototype.__proto__ = process.EventEmitter.prototype;
NativeWindow.prototype.__proto__ = process.EventEmitter.prototype;
NativeMenu.prototype.__proto__ = process.EventEmitter.prototype;
NativeWindow.prototype.__proto__ = process.EventEmitter.prototype;
NativeStatusIcon.prototype.__proto__ = process.EventEmitter.prototype;

decorate(NativeWindow.prototype, [
function pipe(event, target){
Expand Down
2 changes: 2 additions & 0 deletions src/appjs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@ void Init(Handle<v8::Object> target) {
App::Init();
Window::Init();
Menu::Init();
StatusIcon::Init();

target->Set(String::NewSymbol("init"), FunctionTemplate::New(InitApp)->GetFunction());
target->Set(String::NewSymbol("App"), App::constructor);
target->Set(String::NewSymbol("NativeWindow"), Window::constructor);
target->Set(String::NewSymbol("NativeMenu"), Menu::constructor);
target->Set(String::NewSymbol("NativeStatusIcon"), StatusIcon::constructor);
}

} /* appjs */
Expand Down
7 changes: 7 additions & 0 deletions src/appjs_app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "appjs_app.h"
#include "appjs_window.h"
#include "appjs_menu.h"
#include "appjs_status_icon.h"
#include "includes/cef.h"
#include "includes/util.h"

Expand All @@ -20,6 +21,7 @@ void App::Init() {
DECLARE_CONSTRUCTOR("App");
DECLARE_PROTOTYPE_METHOD("createWindow",CreateWindow2);
DECLARE_PROTOTYPE_METHOD("createMenu",CreateMenu);
DECLARE_PROTOTYPE_METHOD("createStatusIcon",CreateStatusIcon);
DECLARE_CLASS_FUNCTION(screenWidth, ScreenWidth);
DECLARE_CLASS_FUNCTION(screenHeight, ScreenHeight);
END_CONSTRUCTOR();
Expand Down Expand Up @@ -54,6 +56,11 @@ Handle<Value> App::CreateMenu(const Arguments& args) {
return scope.Close(Menu::NewInstance(args));
}

Handle<Value> App::CreateStatusIcon(const Arguments& args) {
HandleScope scope;
return scope.Close(StatusIcon::NewInstance(args));
}

Handle<Value> App::ScreenWidth(const Arguments& args) {
HandleScope scope;
Handle<Value> width = Integer::New(NativeWindow::ScreenWidth());
Expand Down
2 changes: 2 additions & 0 deletions src/appjs_app.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "appjs.h"
#include "appjs_window.h"
#include "appjs_menu.h"
#include "appjs_status_icon.h"

namespace appjs {

Expand All @@ -16,6 +17,7 @@ class App : public node::ObjectWrap {
DEFINE_CLASS_FUNCTION(ScreenHeight);
DEFINE_PROTOTYPE_METHOD(CreateWindow2);
DEFINE_PROTOTYPE_METHOD(CreateMenu);
DEFINE_PROTOTYPE_METHOD(CreateStatusIcon);

static bool initialized_;
};
Expand Down
48 changes: 48 additions & 0 deletions src/appjs_status_icon.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include <node.h>
#include "appjs.h"
#include "appjs_status_icon.h"
#include "includes/cef_handler.h"
#include "includes/util.h"

extern CefRefPtr<ClientHandler> g_handler;

namespace appjs {

using namespace v8;

StatusIcon::StatusIcon(){}
StatusIcon::~StatusIcon(){}

Persistent<Function> StatusIcon::constructor;

void StatusIcon::Init() {
DECLARE_CONSTRUCTOR("NativeStatusIcon");
DECLARE_PROTOTYPE_METHOD("show",Show);
DECLARE_PROTOTYPE_METHOD("hide",Hide);
END_CONSTRUCTOR();
}

Handle<Value> StatusIcon::New(const Arguments& args) {
HandleScope scope;

Persistent<Object> options = Persistent<Object>::New(args[0]->ToObject());
Settings* settings = new Settings(options);
NativeStatusIcon* statusIcon = new NativeStatusIcon(settings);

Persistent<Object> self = Persistent<Object>::New(args.This());
statusIcon->SetV8Handle(self);
self->SetPointerInInternalField(0, statusIcon);

return scope.Close(args.This());
}

Handle<Value> StatusIcon::NewInstance(const Arguments& args) {
HandleScope scope;
Handle<Value> argv[1] = { args[0] };
return scope.Close(constructor->NewInstance(1, argv));
}

CREATE_PROTOTYPE_INVOKER(StatusIcon, Show)
CREATE_PROTOTYPE_INVOKER(StatusIcon, Hide)

} /* appjs */
19 changes: 19 additions & 0 deletions src/appjs_status_icon.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef APPJS_STATUS_ICON_H
#define APPJS_STATUS_ICON_H
#pragma once

#include "appjs.h"
#include "native_status_icon/native_status_icon.h"

namespace appjs {

using namespace v8;

class StatusIcon : public node::ObjectWrap {
DEFINE_OBJECT_FACTORY(StatusIcon);
DEFINE_PROTOTYPE_METHOD(Show);
DEFINE_PROTOTYPE_METHOD(Hide);
};

} /* appjs */
#endif /* end of APPJS_STATUS_ICON_H */
43 changes: 0 additions & 43 deletions src/appjs_tray.cpp

This file was deleted.

17 changes: 0 additions & 17 deletions src/appjs_tray.h

This file was deleted.

10 changes: 5 additions & 5 deletions src/includes/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ class Settings {
Settings(v8::Local<v8::Object>);
~Settings(){settings_.Dispose();}

bool isNull(const char*);
bool has(const char*);
bool isNull(const char*);
bool has(const char*);
double getNumber(const char*, double);
int getInteger(const char*, int);
bool getBoolean(const char*,bool);
char* getString(const char*, char*);
int getInteger(const char*, int);
bool getBoolean(const char*,bool);
char* getString(const char*, char*);

#ifdef __WIN__
TCHAR* getString(const char*,TCHAR*);
Expand Down
1 change: 1 addition & 0 deletions src/native_menu/native_menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ namespace appjs {
using namespace v8;

NativeMenu::NativeMenu(Settings* settings){
attached_ = false;
Init(settings);
}

Expand Down
6 changes: 4 additions & 2 deletions src/native_menu/native_menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,18 @@ class NativeMenu {
void SetV8Handle(v8::Handle<v8::Object> v8handle) {v8handle_ = v8handle;};
v8::Handle<v8::Object> GetV8Handle() {return v8handle_;};
#ifdef __LINUX__
std::vector<GtkWidget*> GetMenu() {return menuItems_;};
int AddSubMenu(GtkWidget*,Settings*);
#endif
bool Attach(GtkMenuShell*);
#endif

private:
v8::Handle<v8::Object> v8handle_;
bool attached_;

#ifdef __LINUX__
//GtkWidget* menu_;
std::vector<GtkWidget*> menuItems_;
GtkMenuShell* menu_;
#endif

};
Expand Down
19 changes: 18 additions & 1 deletion src/native_menu/native_menu_linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,21 @@ int NativeMenu::AddSubMenu(GtkWidget* menu,Settings* settings){

}

} /* appjs */
bool NativeMenu::Attach(GtkMenuShell* menuBar) {
if(!attached_) {
menu_ = menuBar;

for(std::vector<GtkWidget*>::iterator it = menuItems_.begin(); it != menuItems_.end(); ++it) {
gtk_menu_shell_append(menuBar,(*it));
}

this->Emit("attached");

return true;
} else {
// already attached
return false;
}
}

} /* appjs */
37 changes: 37 additions & 0 deletions src/native_status_icon/native_status_icon.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#include "includes/cef.h"
#include "includes/cef_handler.h"
#include "native_status_icon/native_status_icon.h"

extern CefRefPtr<ClientHandler> g_handler;

namespace appjs {

using namespace v8;

NativeStatusIcon::NativeStatusIcon(Settings* settings){
Init(settings);
}

NativeStatusIcon::~NativeStatusIcon(){
}

void NativeStatusIcon::Emit(Handle<Value>* args,int length){
node::MakeCallback(v8handle_, "emit", length, args);
}

void NativeStatusIcon::Emit(const char* event){
Handle<Value> args[1] = { String::New(event) };
Emit(args,1);
}

void NativeStatusIcon::Emit(const char* event, Handle<Value> arg){

Handle<Value> args[2] = {
String::New(event),
arg
};

Emit(args,2);
}

} /* appjs */
Loading

0 comments on commit 1e1a23d

Please sign in to comment.