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
This commit is contained in:
parent
39a840e2c3
commit
009d021e4f
@ -60,6 +60,18 @@ const PAGE_SWITCH_TIME = 0.3;
|
|||||||
const VIEWS_SWITCH_TIME = 0.4;
|
const VIEWS_SWITCH_TIME = 0.4;
|
||||||
const VIEWS_SWITCH_ANIMATION_DELAY = 0.1;
|
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) {
|
function _getCategories(info) {
|
||||||
let categoriesStr = info.get_categories();
|
let categoriesStr = info.get_categories();
|
||||||
if (!categoriesStr)
|
if (!categoriesStr)
|
||||||
@ -969,6 +981,32 @@ const AppDisplay = new Lang.Class({
|
|||||||
initialView = Views.ALL;
|
initialView = Views.ALL;
|
||||||
this._showView(initialView);
|
this._showView(initialView);
|
||||||
this._updateFrequentVisibility();
|
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) {
|
animate: function(animationDirection, onComplete) {
|
||||||
@ -1861,6 +1899,19 @@ const AppIconMenu = new Lang.Class({
|
|||||||
this._appendSeparator();
|
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++) {
|
for (let i = 0; i < actions.length; i++) {
|
||||||
let action = actions[i];
|
let action = actions[i];
|
||||||
let item = this._appendMenuItem(appInfo.get_action_name(action));
|
let item = this._appendMenuItem(appInfo.get_action_name(action));
|
||||||
|
Loading…
Reference in New Issue
Block a user