Add patches to allow launching on discrete GPU when available

This commit is contained in:
Bastien Nocera 2016-10-21 18:48:40 +02:00
parent b70e381880
commit ff136de7c4
3 changed files with 189 additions and 1 deletions

View File

@ -0,0 +1,77 @@
From 02bcc5fa3d3d3362594a2c68f9bf80556b93dd77 Mon Sep 17 00:00:00 2001
From: Bastien Nocera <hadess@hadess.net>
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

View File

@ -0,0 +1,100 @@
From ba3354d5c9713eeb03980427c32db3d8b9fea9c7 Mon Sep 17 00:00:00 2001
From: Bastien Nocera <hadess@hadess.net>
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 = '<node> \
+<interface name="net.hadess.SwitcherooControl"> \
+ <property name="HasDualGpu" type="b" access="read"/> \
+</interface> \
+</node>';
+
+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

View File

@ -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 <bnocera@redhat.com> - 3.22.1-2
- Add patches to allow launching on discrete GPU when available
* Tue Oct 11 2016 Florian Müllner <fmuellner@redhat.com> - 3.22.1
- Update to 3.22.1