Вызов методов DBus в Gjs / Gnome Shell

Если у меня есть имя шины, путь к объекту и интерфейс, как мне вызвать методы DBus из Gjs (в расширении оболочки gnome)?

Я ищу эквивалент следующего кода 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 ответа

Импорт imports.dbus устарела, так как gnome-shell 3.4. Новый способ заключается в использовании 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.)

Вы можете получить определение интерфейса, например, используя интроспекцию. Для пиджин / фиолетовый сделать:

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

Дополнительные пояснения по самоанализу и проверке интерфейсов можно найти здесь.

Это должно дать вам лучшую идею:

gjs> const DBus = imports.dbus;
gjs> for (let i in DBus) log(i);
Другие вопросы по тегам