Re: Gio.DBusObjectManagerClient not updating



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]