2015-10-07 5 views
3

Я думаю, что D-Bus следует использовать. В принципе, я хочу что-то вроде этого - https://wiki.gnome.org/Gjs/Examples/DBusClient - но наоборот.Как отправить строку в расширение gnome-shell?

В расширении, будет функция:

function f(s) { doSomethingWithS; } 

И эта функция будет вызвана после запуска:

$ <something> "abc" 

... в терминале, с s == "abc".


После предложений от @Jasper и @owen в #gnome-shell на irc.gnome.org, я адаптировал код из https://github.com/GNOME/gnome-shell/blob/master/js/ui/magnifierDBus.js:

const St = imports.gi.St; 
const Gio = imports.gi.Gio; 
const Lang = imports.lang; 
const Main = imports.ui.main; 

let text; 

function init() { 
    text = new St.Label({ text: "0:0", style_class: 'panel-text' }); 
} 

function enable() { 
    Main.panel._rightBox.insert_child_at_index(text, 0); 
} 

function disable() { 
    Main.panel._rightBox.remove_child(text); 
} 

const TextInTaskBarIface = '<node> \ 
<interface name="com.michalrus.TextInTaskBar"> \ 
<method name="setText"> \ 
    <arg type="s" direction="in" /> \ 
</method> \ 
</interface> \ 
</node>'; 

const TextInTaskBar = new Lang.Class({ 
    Name: 'TextInTaskBar', 

    _init: function() { 
     this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(TextInTaskBarIface, this); 
     this._dbusImpl.export(Gio.DBus.session, '/com/michalrus/TextInTaskBar'); 
    }, 

    setText: function(str) { 
     text.text = str; 
    } 
}); 

Теперь, после выпуска:

% dbus-send --dest=com.michalrus.TextInTaskBar /com/michalrus/TextInTaskBar \ 
    com.michalrus.TextInTaskBar.setText string:"123" 

... ничего не происходит.

ответ

6

Final, рабочая версия расширения гном-оболочки D-Bus сервера:

const St = imports.gi.St; 
const Gio = imports.gi.Gio; 
const Lang = imports.lang; 
const Main = imports.ui.main; 

let text = null; 
let textDBusService = null; 

function init() { 
    text = new St.Label({ text: "0:0", style_class: 'panel-text' }); 
    textDBusService = new TextInTaskBar(); 
} 

function enable() { 
    Main.panel._rightBox.insert_child_at_index(text, 0); 
} 

function disable() { 
    Main.panel._rightBox.remove_child(text); 
} 

const TextInTaskBarIface = '<node> \ 
<interface name="com.michalrus.TextInTaskBar"> \ 
<method name="setText"> \ 
    <arg type="s" direction="in" /> \ 
</method> \ 
</interface> \ 
</node>'; 

const TextInTaskBar = new Lang.Class({ 
    Name: 'TextInTaskBar', 

    _init: function() { 
    text.text = "abc"; 
     this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(TextInTaskBarIface, this); 
     this._dbusImpl.export(Gio.DBus.session, '/com/michalrus/TextInTaskBar'); 
    }, 

    setText: function(str) { 
    text.text = str; 
    } 
}); 

Вызов с:

$ gdbus call --session --dest org.gnome.Shell --object-path /com/michalrus/TextInTaskBar --method com.michalrus.TextInTaskBar.setText 'some text'