在Gjs / Gnome Shell中调用DBus方法

时间:2012-07-18 15:20:28

标签: dbus gnome-shell gjs

如果我有总线名称,对象路径和接口,如何从Gjs调用DBus方法(在gnome-shell扩展中)?

我正在寻找以下python代码的等价物:

import dbus
bus = dbus.SessionBus()
obj = bus.get_object("org.gnome.Caribou.Keyboard", "/org/gnome/SessionManager/EndSessionDialog")
obj.Open(0, 0, 120, dbus.Array(signature="o"))

(请注意,由于某些python-dbus魔法,我没有明确地使用该接口,但我可以使用iface = dbus.interface(obj, "org.gnome.SessionManager.EndSessionDialog")。因为我有接口名称,所以我很好查询它的解决方案。另请注意,这个例子在Gjs中会很愚蠢,因为它会调用回gnome-shell)

2 个答案:

答案 0 :(得分:8)

自gnome-shell 3.4以来,不推荐使用import imports.dbus。 新方法是使用here所述的Gio

const Gio = imports.gi.Gio;

const MyIface = '<interface name="org.example.MyInterface">\
<method name="Activate" />\
</interface>';
const MyProxy = Gio.DBusProxy.makeProxyWrapper(MyIface);

let instance = new MyProxy(Gio.DBus.session, 'org.example.BusName',
'/org/example/Path');

(请注意,原始帖子使用makeProxyClass,正确为makeProxyWrapper。)

您可以通过使用内省来获取接口定义。 对于pidgin / purple do:

$ dbus-send --print-reply --dest=im.pidgin.purple.PurpleService \
/im/pidgin/purple/PurpleObject org.freedesktop.DBus.Introspectable.Introspect

可以找到关于界面内省和检查的进一步解释here

答案 1 :(得分:1)

这应该会给你一个更好的想法:

gjs> const DBus = imports.dbus;
gjs> for (let i in DBus) log(i);