模块的C++代码 node_gtknotify.cc
#include <v8.h>
#include <node.h>
#include <string>
#include <gtkmm-3.0/gtkmm.h>
#include <libnotifymm.h>
using namespace v8;
class GtkNotify : node::ObjectWrap{
public:
GtkNotify(){}
~GtkNotify(){}
std::string title;
std::string icon;
static Persistent<FunctionTemplate> persistent_function_template;
static void Init(Handle<Object> target){
HandleScope scope;
Local<FunctionTemplate> local_function_template = FunctionTemplate::New(New);
GtkNotify::persistent_function_template = Persistent<FunctionTemplate>::New(local_function_template);
GtkNotify::persistent_function_template->InstanceTemplate()->SetInternalFieldCount(1);
GtkNotify::persistent_function_template->SetClassName(String::NewSymbol("Notification"));
GtkNotify::persistent_function_template->InstanceTemplate()->SetAccessor(String::New("title"), GetTitle, SetTitle);
GtkNotify::persistent_function_template->InstanceTemplate()->SetAccessor(String::New("icon"), GetIcon, SetIcon);
NODE_SET_PROTOTYPE_METHOD(GtkNotify::persistent_function_template, "send", Send);
target->Set(String::NewSymbol("notification"), GtkNotify::persistent_function_template->GetFunction());
}
static Handle<Value> New(const Arguments& args){
HandleScope scope;
GtkNotify* instance = new GtkNotify();
instance->title = "Node.js";
instance->icon = "terminal";
instance->Wrap(args.This());
return args.This();
}
static Handle<Value> Send(const Arguments& args){
HandleScope scope;
GtkNotify* instance = node::ObjectWrap::Unwrap<GtkNotify>(args.This());
String::Utf8Value v8str(args[0]);
//弹出消息框
Notify::init("Basic");
Notify::Notification n(instance->title.c_str(), *v8str, instance->icon.c_str());
n.show();
return Boolean::New(true);
}
static Handle<Value> GetTitle(Local<String> property, const AccessorInfo& info){
GtkNotify* instance = node::ObjectWrap::Unwrap<GtkNotify>(info.Holder());
return String::New(instance->title.c_str());
}
static Handle<Value> GetIcon(Local<String> property, const AccessorInfo& info){
GtkNotify* instance = node::ObjectWrap::Unwrap<GtkNotify>(info.Holder());
return String::New(instance->icon.c_str());
}
static void SetTitle(Local<String> property, Local<Value> value, const AccessorInfo& info) {
GtkNotify* instance = node::ObjectWrap::Unwrap<GtkNotify>(info.Holder());
String::Utf8Value v8str(value);
instance->title = *v8str;
}
static void SetIcon(Local<String> property, Local<Value> value, const AccessorInfo& info) {
GtkNotify* instance = node::ObjectWrap::Unwrap<GtkNotify>(info.Holder());
String::Utf8Value v8str(value);
instance->icon = *v8str;
}
};
Persistent<FunctionTemplate> GtkNotify::persistent_function_template;
extern "C"{
static void init(Handle<Object> target){
GtkNotify::Init(target);
}
NODE_MODULE(node_gtknotify, init);
}
node-gyp配置文件 binding.gyp
{
"targets": [
{
"target_name": "node_gtknotify",
"sources": [ "src/node_gtknotify.cc" ]
}
]
}
文件夹结构
执行命令
node-gyp configure
node-gyp build
假设没有安装对应的库/路径找不到。中间会出现头文件找不到的错误;
笨拙的解决方法。在build以下的Makefile中加入
CXXFLAGS += -I/usr/include/glibmm-2.4 -I/usr/lib/x86_64-linux-gnu/glibmm-2.4/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/sigc++-2.0 -I/usr/lib/x86_64-linux-gnu/sigc++-2.0/include -I/usr/include/giomm-2.4 -I/usr/include/gdkmm-3.0 -I/usr/lib/x86_64-linux-gnu/gdkmm-3.0/include -I/usr/include/pangomm-1.4 -I/usr/lib/x86_64-linux-gnu/pangomm-1.4/include -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/cairomm-1.0 -I/usr/include/freetype2 -I/usr/include/gtkmm-3.0 -I/usr/lib/x86_64-linux-gnu/gtkmm-3.0/include -I/usr/include/atkmm-1.6 -I/usr/include/atk-1.0 -I/usr/include/libnotifymm-1.0
上述的库是依据错误提示进行安装的
Javascript測试代码
var notify = require("./build/Release/node_gtknotify");
var notification = new notify.notification();
notification.title = "Notification title";
notification.icon = "emblem-default"; // see /usr/share/icons/gnome/16x16
notification.send("hello,world");
注意,执行时可能有错误提示:**符号找不到,这是由于没有加入对应的共享链接库
解决方法:在build/node_gtknotify.target.mk中加入
LIBS := -lglibmm-2.4 -lnotify -lnotifymm-1.0
执行效果