From 39a840e2c3da5dc55059e25ccf8d80f2240c66cc Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Wed, 19 Oct 2016 15:43:37 +0200 Subject: [PATCH] shell-app: Add "discrete_gpu" option when launching apps And adapt existing callers to the new API. This will allow us to implement a way to launch applications on the discrete GPU for systems where an "Optimus" system exists. https://bugzilla.gnome.org/show_bug.cgi?id=773117 --- js/misc/util.js | 2 +- js/ui/calendar.js | 2 +- js/ui/components/autorunManager.js | 3 ++- js/ui/remoteSearch.js | 2 +- js/ui/status/network.js | 2 +- src/shell-app.c | 8 ++++++-- src/shell-app.h | 1 + 7 files changed, 13 insertions(+), 7 deletions(-) diff --git a/js/misc/util.js b/js/misc/util.js index 748c7b7d5..7c6d11124 100644 --- a/js/misc/util.js +++ b/js/misc/util.js @@ -94,7 +94,7 @@ function spawnApp(argv) { Gio.AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION); let context = global.create_app_launch_context(0, -1); - app.launch([], context); + app.launch([], context, false); } catch(err) { _handleSpawnError(argv[0], err); } diff --git a/js/ui/calendar.js b/js/ui/calendar.js index ec3732e00..2ed812613 100644 --- a/js/ui/calendar.js +++ b/js/ui/calendar.js @@ -902,7 +902,7 @@ const EventsSection = new Lang.Class({ let app = this._getCalendarApp(); if (app.get_id() == 'evolution.desktop') app = Gio.DesktopAppInfo.new('evolution-calendar.desktop'); - app.launch([], global.create_app_launch_context(0, -1)); + app.launch([], global.create_app_launch_context(0, -1), false); }, setDate: function(date) { diff --git a/js/ui/components/autorunManager.js b/js/ui/components/autorunManager.js index 90a296161..4fd08f9cc 100644 --- a/js/ui/components/autorunManager.js +++ b/js/ui/components/autorunManager.js @@ -64,7 +64,8 @@ function startAppForMount(app, mount) { try { retval = app.launch(files, - global.create_app_launch_context(0, -1)) + global.create_app_launch_context(0, -1), + false) } catch (e) { log('Unable to launch the application ' + app.get_name() + ': ' + e.toString()); diff --git a/js/ui/remoteSearch.js b/js/ui/remoteSearch.js index efe6bc28d..baeaa1269 100644 --- a/js/ui/remoteSearch.js +++ b/js/ui/remoteSearch.js @@ -297,7 +297,7 @@ const RemoteSearchProvider = new Lang.Class({ // the provider is not compatible with the new version of the interface, launch // the app itself but warn so we can catch the error in logs log('Search provider ' + this.appInfo.get_id() + ' does not implement LaunchSearch'); - this.appInfo.launch([], global.create_app_launch_context(0, -1)); + this.appInfo.launch([], global.create_app_launch_context(0, -1), false); } }); diff --git a/js/ui/status/network.js b/js/ui/status/network.js index 9f4293ab7..a9cc4d1e6 100644 --- a/js/ui/status/network.js +++ b/js/ui/status/network.js @@ -1501,7 +1501,7 @@ const NMVPNSection = new Lang.Class({ if (nItems > 1) { let appSys = Shell.AppSystem.get_default(); let app = appSys.lookup_app('gnome-network-panel.desktop'); - app.launch(0, -1); + app.launch(0, -1, false); } else { let connection = this._connections[0]; Util.spawnApp(['gnome-control-center', 'network', 'show-device', diff --git a/src/shell-app.c b/src/shell-app.c index 7f61dc369..b383d9ca5 100644 --- a/src/shell-app.c +++ b/src/shell-app.c @@ -505,7 +505,7 @@ shell_app_activate_full (ShellApp *app, case SHELL_APP_STATE_STOPPED: { GError *error = NULL; - if (!shell_app_launch (app, timestamp, workspace, &error)) + if (!shell_app_launch (app, timestamp, workspace, FALSE, &error)) { char *msg; msg = g_strdup_printf (_("Failed to launch ā€œ%sā€"), shell_app_get_name (app)); @@ -549,7 +549,7 @@ shell_app_open_new_window (ShellApp *app, * as say Pidgin. Ideally, we have the application express to us * that it supports an explicit new-window action. */ - shell_app_launch (app, 0, workspace, NULL); + shell_app_launch (app, 0, workspace, FALSE, NULL); } /** @@ -1200,12 +1200,14 @@ app_child_setup (gpointer user_data) * 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 * @error: A #GError */ gboolean shell_app_launch (ShellApp *app, guint timestamp, int workspace, + gboolean discrete_gpu, GError **error) { ShellGlobal *global; @@ -1227,6 +1229,8 @@ shell_app_launch (ShellApp *app, global = shell_global_get (); context = shell_global_create_app_launch_context (global, timestamp, workspace); + if (discrete_gpu) + g_app_launch_context_setenv (context, "DRI_PRIME", "1"); ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL, context, diff --git a/src/shell-app.h b/src/shell-app.h index 7fc582a2a..f02f53a31 100644 --- a/src/shell-app.h +++ b/src/shell-app.h @@ -54,6 +54,7 @@ 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); void shell_app_launch_action (ShellApp *app,