2012-07-18 19 views
5

Se ho un nome di bus, un percorso di oggetto e un'interfaccia, come posso chiamare i metodi DBus da Gjs (in un'estensione gnome-shell)?Chiamare i metodi DBus nella shell Gjs/Gnome

Sto cercando l'equivalente del seguente codice 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")) 

(Si noti che non ho usato esplicitamente l'interfaccia a causa di una certa magia python-dbus, ma ho potuto avere con iface = dbus.interface(obj, "org.gnome.SessionManager.EndSessionDialog"). Dato che ho il nome dell'interfaccia, sto bene con una soluzione che lo interroga. Inoltre, questo esempio sarebbe stupido in Gjs, poiché richiama in gnome-shell)

risposta

1

questo dovrebbe darti un'idea migliore:

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

L'importazione imports.dbus è obsoleta poiché gnome-shell 3.4. Il nuovo modo è quello di utilizzare Gio come descritto here:

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'); 

(Si noti che il post originale utilizza makeProxyClass, corretto è makeProxyWrapper.)

è possibile ottenere la definizione di interfaccia, ad esempio, tramite l'introspezione . Per pidgin/do viola:

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

Ulteriori spiegazioni su introspezione e l'ispezione di interfacce può essere trovato here.

Problemi correlati