Merge branch 'dbusactivation-v1'
* dbusactivation-v1: Implement D-Bus Activation of desktop files manually
This commit is contained in:
		
						commit
						feeb4b3816
					
				@ -1,3 +1,5 @@
 | 
			
		||||
import functools
 | 
			
		||||
 | 
			
		||||
from gi.repository import Gio  # pylint: disable=import-error
 | 
			
		||||
from gi.repository import GLib  # pylint: disable=import-error
 | 
			
		||||
import sys
 | 
			
		||||
@ -6,22 +8,51 @@ import os
 | 
			
		||||
def pid_callback(launcher, pid, pid_list):
 | 
			
		||||
    pid_list.append(pid)
 | 
			
		||||
 | 
			
		||||
def dbus_name_change(loop, name, old_owner, new_owner):
 | 
			
		||||
    if not new_owner:
 | 
			
		||||
        loop.quit()
 | 
			
		||||
 | 
			
		||||
def launch(desktop, *files, **kwargs):
 | 
			
		||||
    wait = kwargs.pop('wait', True)
 | 
			
		||||
    launcher = Gio.DesktopAppInfo.new_from_filename(desktop)
 | 
			
		||||
    try:
 | 
			
		||||
        import dbus
 | 
			
		||||
        from dbus.mainloop.glib import DBusGMainLoop
 | 
			
		||||
        if hasattr(launcher, 'get_boolean'):
 | 
			
		||||
            activatable = launcher.get_boolean('DBusActivatable')
 | 
			
		||||
            if activatable:
 | 
			
		||||
                loop = GLib.MainLoop()
 | 
			
		||||
                DBusGMainLoop(set_as_default=True)
 | 
			
		||||
                bus = dbus.SessionBus()
 | 
			
		||||
                service_id = launcher.get_id()
 | 
			
		||||
                # cut the .desktop suffix
 | 
			
		||||
                service_id = service_id[:-8]
 | 
			
		||||
                service_id = service_id[:-len('.desktop')]
 | 
			
		||||
                # see D-Bus Activation Desktop entry specification
 | 
			
		||||
                object_path = '/' + service_id.replace('.', '/').\
 | 
			
		||||
                    replace('-', '_')
 | 
			
		||||
                try:
 | 
			
		||||
                    bus.start_service_by_name(service_id)
 | 
			
		||||
                except dbus.DBusException:
 | 
			
		||||
                    proxy = bus.get_object(service_id, object_path)
 | 
			
		||||
                    match = bus.add_signal_receiver(
 | 
			
		||||
                        functools.partial(dbus_name_change, loop),
 | 
			
		||||
                        'NameOwnerChanged',
 | 
			
		||||
                        dbus.BUS_DAEMON_IFACE,
 | 
			
		||||
                        dbus.BUS_DAEMON_NAME,
 | 
			
		||||
                        dbus.BUS_DAEMON_PATH)
 | 
			
		||||
                    if files:
 | 
			
		||||
                        proxy.Open(files, {},
 | 
			
		||||
                            dbus_interface='org.freedesktop.Application')
 | 
			
		||||
                    else:
 | 
			
		||||
                        proxy.Activate({},
 | 
			
		||||
                            dbus_interface='org.freedesktop.Application')
 | 
			
		||||
                except dbus.DBusException as e:
 | 
			
		||||
                    print(e)
 | 
			
		||||
                    # fallback to non-dbus version
 | 
			
		||||
                    pass
 | 
			
		||||
                else:
 | 
			
		||||
                    if wait:
 | 
			
		||||
                        loop.run()
 | 
			
		||||
                    match.remove()
 | 
			
		||||
                    return
 | 
			
		||||
    except ImportError:
 | 
			
		||||
        pass
 | 
			
		||||
    if wait:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user