[gnome-shell] appDisplay: Add a menu item to launch on the discrete GPU



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]