如果我有总线名称,对象路径和接口,如何从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)
答案 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);