[gnome-shell] appDisplay: Add a menu item to launch on the discrete GPU
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] appDisplay: Add a menu item to launch on the discrete GPU
- Date: Fri, 21 Oct 2016 17:31:06 +0000 (UTC)
commit 009d021e4f93bfce69d1f4497612d804c88972b6
Author: Bastien Nocera <hadess hadess net>
Date: Wed Oct 19 15:58:16 2016 +0200
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 available, but the environment variable will
not be passed through to D-Bus to use when launching the application.
https://bugzilla.gnome.org/show_bug.cgi?id=773117
js/ui/appDisplay.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 51 insertions(+), 0 deletions(-)
---
diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js
index cae1757..f81ab59 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,19 @@ const AppIconMenu = new Lang.Class({
this._appendSeparator();
}
+ if (discreteGpuAvailable &&
+ this._source.app.state == Shell.AppState.STOPPED &&
+ actions.indexOf('activate-discrete-gpu') == -1) {
+ 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)
+ this._source.animateLaunch();
+
+ this._source.app.launch(0, -1, true);
+ 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));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]