Nodejs扩展,实现消息弹窗
来源:互联网 发布:大数据需要的java基础 编辑:程序博客网 时间:2024/06/05 01:28
参考https://github.com/olalonde/node-notify的实现
模块的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
运行效果
- Nodejs扩展,实现消息弹窗
- 通过WCF扩展实现消息压缩
- nodejs+express+websocket+redis实现消息订阅系统
- nodejs+redis以最少的代码实现消息队列
- Google Firebase 消息通知 android + nodejs 以及.net的实现
- nodejs: C++扩展
- 扩展JQuery Ajax请求错误机制,实现服务器端消息回馈。
- 实现可扩展消息传递和到场协议(XMPP)
- 实现可扩展消息传递和到场协议(XMPP)
- 实现可扩展消息传递和到场协议(XMPP)
- 实现可扩展消息传递和到场协议(XMPP)
- C++编写nodejs扩展实战
- NodeJS开发c++扩展模块
- Jquery实现自定义消息弹窗
- nodejs+nodejs-websocket 实现websocket
- Nodejs socket.io 实现私聊:如何给指定客户端发送消息,不是群广播
- Nodejs socket.io 实现私聊:如何给指定客户端发送消息,不是群广播
- nodejs向客户端推送消息
- 8个让程序员追悔莫及的职业建议
- 为Xcode6添加Empty Application选项
- Spring mvc http 406错误的解决之道
- php中重写理解
- centos6.5安装mongodb
- Nodejs扩展,实现消息弹窗
- C++初学者的足迹3 作业报告2 计算正差值
- Maven私服问题汇总
- xcode armv6 armv7 armv7s arm64
- 第七周项目3正差值
- Java枚举
- JBoss AS 6.1.0 Final bootstrap.xml的解析过程
- ios 扩大uibutton的响应区域
- 自定义带边框imageView