如何将字符串发送到 gnome-shell 扩展?

Posted

技术标签:

【中文标题】如何将字符串发送到 gnome-shell 扩展?【英文标题】:How to send a string to a gnome-shell extension? 【发布时间】:2016-01-05 05:08:07 【问题描述】:

我认为应该使用 D-Bus。基本上,我想要类似的东西——https://wiki.gnome.org/Gjs/Examples/DBusClient——但反过来。

在扩展中,会有一个函数:

function f(s)  doSomethingWithS; 

并且这个函数会在运行后被调用:

$ <something> "abc"

…在终端中,s == "abc"


根据@Jasper 和@owen 在#gnome-shell on 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"

……什么也没发生。

【问题讨论】:

【参考方案1】:

gnome-shell 扩展 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'

【讨论】:

以上是关于如何将字符串发送到 gnome-shell 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

修改gnome-shell扩展“Applications Menu”的菜单区域宽度。

应用程序扩展 iOS9:如何将字符串 / URL 从共享视图发送到我的应用程序?

Chrome 扩展如何将数据从内容脚本发送到 popup.html

如何将可扩展列表视图的选定子视图数据从片段发送到父活动?

linux中gnome-shell主题怎么安装??

如何使用应用程序扩展中的 IPC 将信息异步发送到 iOS 上的包含应用程序?