[gnome-shell/benzea/systemd-scopes-stable: 1/2] shell-global: Place launched applications into a systemd scope



commit 5a20c07d3cf22a02674c36f1c656e97995f2b710
Author: Benjamin Berg <bberg redhat com>
Date:   Tue Nov 26 19:45:29 2019 +0100

    shell-global: Place launched applications into a systemd scope
    
    This improves separation from the shells service scope for applications
    launched using an XDG desktop file.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/863
    (cherry picked from commit b60365aa06b18702357bd5da3106cc7c99f3e4f3)

 meson.build        |  2 ++
 src/meson.build    |  2 +-
 src/shell-global.c | 34 ++++++++++++++++++++++++++++++++++
 3 files changed, 37 insertions(+), 1 deletion(-)
---
diff --git a/meson.build b/meson.build
index 402aff3fca..34bfc6b091 100644
--- a/meson.build
+++ b/meson.build
@@ -31,6 +31,7 @@ polkit_req = '>= 0.100'
 schemas_req = '>= 3.33.1'
 startup_req = '>= 0.11'
 ibus_req = '>= 1.5.2'
+gnome_desktop_req = '>= 3.34.2'
 
 bt_req = '>= 3.9.0'
 gst_req = '>= 0.11.92'
@@ -97,6 +98,7 @@ startup_dep = dependency('libstartup-notification-1.0', version: startup_req)
 ibus_dep = dependency('ibus-1.0', version: ibus_req)
 x11_dep = dependency('x11')
 schemas_dep = dependency('gsettings-desktop-schemas', version: schemas_req)
+gnome_desktop_dep = dependency('gnome-desktop-3.0', version: gnome_desktop_req)
 
 bt_dep = dependency('gnome-bluetooth-1.0', version: bt_req, required: false)
 gst_dep = dependency('gstreamer-1.0', version: gst_req, required: false)
diff --git a/src/meson.build b/src/meson.build
index 3523fb16cb..cbf5886ea8 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -192,7 +192,7 @@ libshell_no_gir_sources += dbus_generated
 
 libshell = library('gnome-shell',
   sources: libshell_gir_sources + libshell_no_gir_sources,
-  dependencies: gnome_shell_deps + [libshell_menu_dep, libst_dep, mutter_dep, m_dep],
+  dependencies: gnome_shell_deps + [libshell_menu_dep, libst_dep, mutter_dep, gnome_desktop_dep, m_dep],
   include_directories: [conf_inc, st_inc, include_directories('tray')],
   c_args: gnome_shell_cflags,
   link_with: [libtray],
diff --git a/src/shell-global.c b/src/shell-global.c
index 77e167c107..c3b48272e3 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -29,6 +29,9 @@
 #include <meta/meta-workspace-manager.h>
 #include <meta/meta-x11-display.h>
 
+#define GNOME_DESKTOP_USE_UNSTABLE_API
+#include <libgnome-desktop/gnome-systemd.h>
+
 /* Memory report bits */
 #ifdef HAVE_MALLINFO
 #include <malloc.h>
@@ -43,6 +46,7 @@
 #include "shell-perf-log.h"
 #include "shell-window-tracker.h"
 #include "shell-wm.h"
+#include "shell-util.h"
 #include "st.h"
 
 static ShellGlobal *the_object = NULL;
@@ -1308,6 +1312,29 @@ shell_global_get_current_time (ShellGlobal *global)
   return clutter_get_current_event_time ();
 }
 
+static void
+shell_global_app_launched_cb (GAppLaunchContext *context,
+                              GAppInfo          *info,
+                              GVariant          *platform_data,
+                              gpointer           user_data)
+{
+  gint32 pid;
+  const gchar *app_name;
+
+  if (!g_variant_lookup (platform_data, "pid", "i", &pid))
+    return;
+
+  app_name = g_app_info_get_id (info);
+  if (app_name == NULL)
+    app_name = g_app_info_get_executable (info);
+
+  /* Start async request; we don't care about the result */
+  gnome_start_systemd_scope (app_name,
+                             pid,
+                             NULL,
+                             NULL,
+                             NULL, NULL, NULL);}
+
 /**
  * shell_global_create_app_launch_context:
  * @global: A #ShellGlobal
@@ -1343,6 +1370,13 @@ shell_global_create_app_launch_context (ShellGlobal *global,
 
   meta_launch_context_set_workspace (context, ws);
 
+#ifdef HAVE_SYSTEMD
+  g_signal_connect (context,
+                    "launched",
+                    G_CALLBACK (shell_global_app_launched_cb),
+                    NULL);
+#endif
+
   return (GAppLaunchContext *) context;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]