xdg.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. from gi.repository import Gio # pylint: disable=import-error
  2. from gi.repository import GLib # pylint: disable=import-error
  3. import sys
  4. import os
  5. def pid_callback(launcher, pid, pid_list):
  6. pid_list.append(pid)
  7. def launch(desktop, *files, **kwargs):
  8. wait = kwargs.pop('wait', True)
  9. launcher = Gio.DesktopAppInfo.new_from_filename(desktop)
  10. try:
  11. import dbus
  12. if hasattr(launcher, 'get_boolean'):
  13. activatable = launcher.get_boolean('DBusActivatable')
  14. if activatable:
  15. bus = dbus.SessionBus()
  16. service_id = launcher.get_id()
  17. # cut the .desktop suffix
  18. service_id = service_id[:-8]
  19. try:
  20. bus.start_service_by_name(service_id)
  21. except dbus.DBusException:
  22. pass
  23. except ImportError:
  24. pass
  25. if wait:
  26. pid_list = []
  27. flags = GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD
  28. launcher.launch_uris_as_manager(files, None, flags, None, None,
  29. pid_callback, pid_list)
  30. for pid in pid_list:
  31. os.waitpid(pid, 0)
  32. else:
  33. launcher.launch(files, None)
  34. if __name__ == "__main__":
  35. launch(*sys.argv[1:])