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
This commit is contained in:
Bastien Nocera 2019-10-23 11:48:19 +02:00
parent 6526e9edf6
commit 4d47b16d33
2 changed files with 39 additions and 14 deletions

View File

@ -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

View File

@ -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,