• Nodejs扩展,实现消息弹窗


    參考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

      

    执行效果

  • 相关阅读:
    判断单链表中是否有环,找到环的入口节点的理论证明
    交叉熵代价函数(作用及公式推导)
    C#调用C++、Opencv的Dll
    腾讯机器学习一面面经
    C#调用C++类库的几种方式
    2017年腾讯基础研究笔试感受
    关于开源库或者SDK的文档问题
    卷积神经网络Lenet-5实现
    NULL、0、nullptr 区别分析
    C++中,new/delete和malloc/free的区别
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7252475.html
Copyright © 2020-2023  润新知