From ff136de7c48a04b0574340cab8891f65f77e7e23 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Oct 21 2016 17:19:45 +0000 Subject: Add patches to allow launching on discrete GPU when available --- diff --git a/0001-f25-shell-app-Add-shell_app_launch_context-helper-AP.patch b/0001-f25-shell-app-Add-shell_app_launch_context-helper-AP.patch new file mode 100644 index 0000000..4d84532 --- /dev/null +++ b/0001-f25-shell-app-Add-shell_app_launch_context-helper-AP.patch @@ -0,0 +1,77 @@ +From 02bcc5fa3d3d3362594a2c68f9bf80556b93dd77 Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Wed, 19 Oct 2016 15:43:37 +0200 +Subject: [PATCH 1/2] shell-app: Add shell_app_launch_context() helper API + +This will allow us to implement a way to launch applications +on the discrete GPU for systems where an "Optimus" system exists, +through the caller setting an environment variable. + +https://bugzilla.gnome.org/show_bug.cgi?id=773117 +--- + src/shell-app.c | 29 +++++++++++++++++++---------- + src/shell-app.h | 4 ++++ + 2 files changed, 23 insertions(+), 10 deletions(-) + +diff --git a/src/shell-app.c b/src/shell-app.c +index 7f61dc3..7eec4ae 100644 +--- a/src/shell-app.c ++++ b/src/shell-app.c +@@ -1227,20 +1227,29 @@ shell_app_launch (ShellApp *app, + + global = shell_global_get (); + context = shell_global_create_app_launch_context (global, timestamp, workspace); ++ ret = shell_app_launch_context (app, context, error); ++ g_object_unref (context); ++ ++ return ret; ++} ++ ++gboolean ++shell_app_launch_context (ShellApp *app, ++ GAppLaunchContext *context, ++ GError **error) ++{ ++ g_return_val_if_fail (app->info != NULL, FALSE); + +- ret = g_desktop_app_info_launch_uris_as_manager (app->info, NULL, +- context, +- G_SPAWN_SEARCH_PATH, ++ return g_desktop_app_info_launch_uris_as_manager (app->info, NULL, ++ context, ++ G_SPAWN_SEARCH_PATH, + #ifdef HAVE_SYSTEMD +- app_child_setup, (gpointer)shell_app_get_id (app), ++ app_child_setup, (gpointer)shell_app_get_id (app), + #else +- NULL, NULL, ++ NULL, NULL, + #endif +- NULL, NULL, +- error); +- g_object_unref (context); +- +- return ret; ++ NULL, NULL, ++ error); + } + + /** +diff --git a/src/shell-app.h b/src/shell-app.h +index 7fc582a..2a7572a 100644 +--- a/src/shell-app.h ++++ b/src/shell-app.h +@@ -56,6 +56,10 @@ gboolean shell_app_launch (ShellApp *app, + int workspace, + GError **error); + ++gboolean shell_app_launch_context (ShellApp *app, ++ GAppLaunchContext *context, ++ GError **error); ++ + void shell_app_launch_action (ShellApp *app, + const char *action_name, + guint timestamp, +-- +2.9.3 + diff --git a/0002-f25-appDisplay-Add-a-menu-item-to-launch-on-the-disc.patch b/0002-f25-appDisplay-Add-a-menu-item-to-launch-on-the-disc.patch new file mode 100644 index 0000000..3a6d34a --- /dev/null +++ b/0002-f25-appDisplay-Add-a-menu-item-to-launch-on-the-disc.patch @@ -0,0 +1,100 @@ +From ba3354d5c9713eeb03980427c32db3d8b9fea9c7 Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Wed, 19 Oct 2016 15:58:16 +0200 +Subject: [PATCH 2/2] appDisplay: Add a menu item to launch on the discrete GPU + +It will only show up when a discrete GPU is available (detected through +the switcheroo-control D-Bus service), and the application hasn't +alreayd been launched. + +Note that this will not currently work for D-Bus activated applications, +eg. the menu item will be not available, as we don't have a way to pass +the environment variable through to D-Bus to use to launch the application. + +https://bugzilla.gnome.org/show_bug.cgi?id=773117 +--- + js/ui/appDisplay.js | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 54 insertions(+) + +diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js +index cae1757..6b1d04f 100644 +--- a/js/ui/appDisplay.js ++++ b/js/ui/appDisplay.js +@@ -60,6 +60,18 @@ const PAGE_SWITCH_TIME = 0.3; + const VIEWS_SWITCH_TIME = 0.4; + const VIEWS_SWITCH_ANIMATION_DELAY = 0.1; + ++const SWITCHEROO_BUS_NAME = 'net.hadess.SwitcherooControl'; ++const SWITCHEROO_OBJECT_PATH = '/net/hadess/SwitcherooControl'; ++ ++const SwitcherooProxyInterface = ' \ ++ \ ++ \ ++ \ ++'; ++ ++const SwitcherooProxy = Gio.DBusProxy.makeProxyWrapper(SwitcherooProxyInterface); ++let discreteGpuAvailable = false; ++ + function _getCategories(info) { + let categoriesStr = info.get_categories(); + if (!categoriesStr) +@@ -969,6 +981,32 @@ const AppDisplay = new Lang.Class({ + initialView = Views.ALL; + this._showView(initialView); + this._updateFrequentVisibility(); ++ ++ Gio.DBus.system.watch_name(SWITCHEROO_BUS_NAME, ++ Gio.BusNameWatcherFlags.NONE, ++ Lang.bind(this, this._switcherooProxyAppeared), ++ Lang.bind(this, function() { ++ this._switcherooProxy = null; ++ this._updateDiscreteGpuAvailable(); ++ })); ++ }, ++ ++ _updateDiscreteGpuAvailable: function() { ++ if (!this._switcherooProxy) ++ discreteGpuAvailable = false; ++ else ++ discreteGpuAvailable = this._switcherooProxy.HasDualGpu; ++ }, ++ ++ _switcherooProxyAppeared: function() { ++ this._switcherooProxy = new SwitcherooProxy(Gio.DBus.system, SWITCHEROO_BUS_NAME, SWITCHEROO_OBJECT_PATH, ++ Lang.bind(this, function(proxy, error) { ++ if (error) { ++ log(error.message); ++ return; ++ } ++ this._updateDiscreteGpuAvailable(); ++ })); + }, + + animate: function(animationDirection, onComplete) { +@@ -1861,6 +1899,22 @@ const AppIconMenu = new Lang.Class({ + this._appendSeparator(); + } + ++ if (discreteGpuAvailable && ++ this._source.app.state == Shell.AppState.STOPPED && ++ !this._source.app.app_info.get_boolean('DBusActivatable')) { ++ this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card")); ++ this._onDiscreteGpuMenuItem.connect('activate', Lang.bind(this, function() { ++ if (this._source.app.state != Shell.AppState.STOPPED) ++ return; ++ ++ let context = global.create_app_launch_context(0, -1); ++ context.setenv('DRI_PRIME', '1'); ++ ++ this._source.app.launch_context(context); ++ this.emit('activate-window', null); ++ })); ++ } ++ + for (let i = 0; i < actions.length; i++) { + let action = actions[i]; + let item = this._appendMenuItem(appInfo.get_action_name(action)); +-- +2.9.3 + diff --git a/gnome-shell.spec b/gnome-shell.spec index 244b4a1..c20f666 100644 --- a/gnome-shell.spec +++ b/gnome-shell.spec @@ -1,6 +1,6 @@ Name: gnome-shell Version: 3.22.1 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Window management and application launching for GNOME Group: User Interface/Desktops @@ -13,6 +13,10 @@ Source0: http://download.gnome.org/sources/gnome-shell/3.22/%{name}-%{ver # Replace Epiphany with Firefox in the default favourite apps list Patch1: gnome-shell-favourite-apps-firefox.patch +# https://bugzilla.gnome.org/show_bug.cgi?id=773117 without the internal API break +Patch2: 0001-f25-shell-app-Add-shell_app_launch_context-helper-AP.patch +Patch3: 0002-f25-appDisplay-Add-a-menu-item-to-launch-on-the-disc.patch + %define gnome_bluetooth_version 1:3.9.0 %define gobject_introspection_version 1.45.4 %define gjs_version 1.39.0 @@ -103,6 +107,8 @@ Requires: gdm-libs%{?_isa} Requires: control-center # needed by some utilities Requires: python3%{_isa} +# needed for the dual-GPU launch menu +Requires: switcheroo-control %description GNOME Shell provides core user interface functions for the GNOME 3 desktop, @@ -114,6 +120,8 @@ easy to use experience. %prep %setup -q %patch1 -p1 -b .firefox +%patch2 -p1 +%patch3 -p1 %build (if ! test -x configure; then NOCONFIGURE=1 ./autogen.sh; fi; @@ -183,6 +191,9 @@ glib-compile-schemas --allow-any-name %{_datadir}/glib-2.0/schemas &> /dev/null %exclude %{_datadir}/gtk-doc %changelog +* Fri Oct 21 2016 Bastien Nocera - 3.22.1-2 +- Add patches to allow launching on discrete GPU when available + * Tue Oct 11 2016 Florian Müllner - 3.22.1 - Update to 3.22.1