Re: Gio.DBusObjectManagerClient not updating
- From: infirit <infirit gmail com>
- To: Hayden Lau <HaydenL aercoustics com>, "python-hackers-list gnome org" <python-hackers-list gnome org>
- Subject: Re: Gio.DBusObjectManagerClient not updating
- Date: Sat, 13 Jan 2018 18:26:50 +0100
Op 01/13/2018 om 05:19 PM schreef Hayden Lau:
I understand this is a dev mailing list, but I’m not sure where to post this question otherwise.
You can try the Gtk user mailinglist but I have not had much answers in
there regarding Gio's DBus classes.
I’m attempting to write an application that interacts with UDisks2 over DBus with PyGObject. However, I’m
finding that after instantiating the proper Gio.DBusObjectManagerClient, I seem to be unable to get
updates on the ObjectManager’s state. Am I missing something? The only example code that I could find
that had similar functionality was in udiskie (https://github.com/coldfix/udiskie), but that application
uses Gio.DBusProxy directly. Is that the recommended approach? My (non-working) proof of concept code
pasted below. It prints the initial set of objects reported by the ‘org.freedesktop.UDisks2’ object
manager, but does not print changes (either via signal or polling) when disks are added or removed.
The object manager is there as the name suggest to manage dbus objects.
From it you can easily create proxies for all the objects it manages. If
you like some other examples of how to use Gio's dbus classes have a
look at
https://github.com/blueman-project/blueman/tree/master/blueman/bluez.
Now for the actual problem. Gio dbus implementation require a eventloop
to update. If you do not intend to use any Gtk widgets you can use
GLib.MainLoop if you do then call Gtk.main at the end of your module
========================
from time import sleep
import gi
gi.require_version('Gio', '2.0')
from gi.repository import Gio
from gi.repository import GLib
udisks2 = Gio.DBusObjectManagerClient.new_for_bus_sync(
Gio.BusType.SYSTEM,
Gio.DBusObjectManagerClientFlags.NONE,
'org.freedesktop.UDisks2',
'/org/freedesktop/UDisks2',
None,
None,
None
)
def new_obj_handler(obj):
print('New Object: ', obj)
def new_iface_handler(obj):
print('New Interface: ', obj)
def get_paths(objmgr):
return [obj.get_object_path() for obj in objmgr.get_objects()]
udisks2.connect('interface-added', new_iface_handler)
udisks2.connect('object-added', new_obj_handler)
loop = GLib.MainLoop()
loop.run()
paths = []
while(True):
if paths != get_paths(udisks2):
paths = get_paths(udisks2)
print(paths)
sleep(1)
Above is not going to work when you use an eventloop. You will need to
schedule a function to be run, for example with GLib.timeout_add_seconds
[1].
~infirit
[1]
https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-timeout-add-seconds
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]