[gnome-shell/wip/hadess/always-launch-discrete-gpu: 2/4] shell-app: Respect X-KDE-RunOnDiscreteGpu when launching apps



commit 4d47b16d330ca9ab01bcccb8de7a4a60c34f5b14
Author: Bastien Nocera <hadess hadess net>
Date:   Wed Oct 23 11:48:19 2019 +0200

    shell-app: Respect X-KDE-RunOnDiscreteGpu when launching apps
    
    If whether to launch on the discrete GPU or the integrated one isn't
    passed down to us, check whether the application prefers to be launched
    on the discrete GPU.
    
    See: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1804

 src/shell-app.c | 37 ++++++++++++++++++++++++++++---------
 src/shell-app.h | 16 +++++++++++-----
 2 files changed, 39 insertions(+), 14 deletions(-)
---
diff --git a/src/shell-app.c b/src/shell-app.c
index 33d5ec3a7a..b9ceac34b0 100644
--- a/src/shell-app.c
+++ b/src/shell-app.c
@@ -509,7 +509,7 @@ shell_app_activate_full (ShellApp      *app,
       case SHELL_APP_STATE_STOPPED:
         {
           GError *error = NULL;
-          if (!shell_app_launch (app, timestamp, workspace, FALSE, &error))
+          if (!shell_app_launch (app, timestamp, workspace, SHELL_APP_GPU_SELECTION_AUTO, &error))
             {
               char *msg;
               msg = g_strdup_printf (_("Failed to launch ā€œ%sā€"), shell_app_get_name (app));
@@ -584,7 +584,7 @@ shell_app_open_new_window (ShellApp      *app,
    * instance (Firefox).  There are a few less-sensical cases such
    * as say Pidgin.
    */
-  shell_app_launch (app, 0, workspace, FALSE, NULL);
+  shell_app_launch (app, 0, workspace, SHELL_APP_GPU_SELECTION_AUTO, NULL);
 }
 
 /**
@@ -1255,19 +1255,37 @@ wait_pid (GDesktopAppInfo *appinfo,
   g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
 }
 
+static gboolean
+get_with_discrete_gpu (ShellApp             *app,
+                       ShellAppGpuSelection  discrete_gpu)
+{
+  switch (discrete_gpu)
+    {
+      case SHELL_APP_GPU_SELECTION_INTEGRATED:
+        return FALSE;
+      case SHELL_APP_GPU_SELECTION_DISCRETE:
+        return TRUE;
+      case SHELL_APP_GPU_SELECTION_AUTO:
+        return g_desktop_app_info_get_boolean (app->info, "PreferRunOnDiscreteGPU") ||
+               g_desktop_app_info_get_boolean (app->info, "X-KDE-RunOnDiscreteGpu");
+      default:
+        g_assert_not_reached();
+    }
+}
+
 /**
  * shell_app_launch:
  * @timestamp: Event timestamp, or 0 for current event timestamp
  * @workspace: Start on this workspace, or -1 for default
- * @discrete_gpu: Whether to start on the discrete GPU
+ * @discrete_gpu: the preferred GPU to launch the application on.
  * @error: A #GError
  */
 gboolean
-shell_app_launch (ShellApp     *app,
-                  guint         timestamp,
-                  int           workspace,
-                  gboolean      discrete_gpu,
-                  GError      **error)
+shell_app_launch (ShellApp              *app,
+                  guint                  timestamp,
+                  int                    workspace,
+                  ShellAppGpuSelection   discrete_gpu,
+                  GError               **error)
 {
   ShellGlobal *global;
   GAppLaunchContext *context;
@@ -1289,7 +1307,8 @@ shell_app_launch (ShellApp     *app,
 
   global = shell_global_get ();
   context = shell_global_create_app_launch_context (global, timestamp, workspace);
-  if (discrete_gpu)
+  /* FIXME: this should probably check whether we're on a dual-GPU system */
+  if (get_with_discrete_gpu (app, discrete_gpu))
     g_app_launch_context_setenv (context, "DRI_PRIME", "1");
 
   /* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn
diff --git a/src/shell-app.h b/src/shell-app.h
index 8a09b642dc..1557578bda 100644
--- a/src/shell-app.h
+++ b/src/shell-app.h
@@ -18,6 +18,12 @@ typedef enum {
   SHELL_APP_STATE_RUNNING
 } ShellAppState;
 
+typedef enum {
+  SHELL_APP_GPU_SELECTION_AUTO       = -1,
+  SHELL_APP_GPU_SELECTION_INTEGRATED = 0,
+  SHELL_APP_GPU_SELECTION_DISCRETE   = 1
+} ShellAppGpuSelection;
+
 const char *shell_app_get_id (ShellApp *app);
 
 GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
@@ -51,11 +57,11 @@ GSList *shell_app_get_pids (ShellApp *app);
 
 gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
 
-gboolean shell_app_launch (ShellApp     *app,
-                           guint         timestamp,
-                           int           workspace,
-                           gboolean      discrete_gpu,
-                           GError      **error);
+gboolean shell_app_launch (ShellApp               *app,
+                           guint                  timestamp,
+                           int                    workspace,
+                           ShellAppGpuSelection   discrete_gpu,
+                           GError               **error);
 
 void shell_app_launch_action (ShellApp        *app,
                               const char      *action_name,


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