Browse Source

Fix waiting for application exit in qubesagent.xdg.launch

This is especially important for qubes-desktop-run used inside DispVM.
The DesktopAppInfo.launch() method returns after just launching the
application. In DispVM case it worked by a coincidence - because the
launched application was keeping stdin/out open, which also prevented
DispVM killing. Use DesktopAppInfo.launch_uris_as_manager which at least
allows to learn PIDs of spawned processes, to track them manually.

This still doesn't fix gnome-terminal issue, or any other application
using either DBus activation, or any other client-server model. But at
least fix basic apps like firefox and xterm.

Fixes QubesOS/qubes-issues#3213
Marek Marczykowski-Górecki 6 years ago
parent
commit
321cd06591
1 changed files with 16 additions and 3 deletions
  1. 16 3
      qubesagent/xdg.py

+ 16 - 3
qubesagent/xdg.py

@@ -1,9 +1,15 @@
 #!/usr/bin/python
 
 from gi.repository import Gio
+from gi.repository import GLib
 import sys
+import os
 
-def launch(desktop, *files):
+def pid_callback(launcher, pid, pid_list):
+    pid_list.append(pid)
+
+def launch(desktop, *files, **kwargs):
+    wait = kwargs.pop('wait', True)
     launcher = Gio.DesktopAppInfo.new_from_filename(desktop)
     try:
         import dbus
@@ -18,10 +24,17 @@ def launch(desktop, *files):
                     bus.start_service_by_name(service_id)
                 except dbus.DBusException:
                     pass
-        return launcher.launch(files, None)
     except ImportError:
         pass
-    launcher.launch(files, None)
+    if wait:
+        pid_list = []
+        flags = GLib.SpawnFlags.SEARCH_PATH | GLib.SpawnFlags.DO_NOT_REAP_CHILD
+        launcher.launch_uris_as_manager(files, None, flags, None, None,
+                pid_callback, pid_list)
+        for pid in pid_list:
+            os.waitpid(pid, 0)
+    else:
+        launcher.launch(files, None)
 
 if __name__ == "__main__":
     launch(*sys.argv[1:])