Compare commits
4 Commits
citadel
...
wip/hadess
Author | SHA1 | Date | |
---|---|---|---|
|
752b1df659 | ||
|
366b06716d | ||
|
4d47b16d33 | ||
|
6526e9edf6 |
@ -2513,13 +2513,15 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
||||
this._appendSeparator();
|
||||
}
|
||||
|
||||
let wantsDiscreteGpu = appInfo.get_boolean("PreferRunOnDiscreteGPU") ||
|
||||
appInfo.get_boolean("X-KDE-RunOnDiscreteGpu");
|
||||
if (discreteGpuAvailable &&
|
||||
this._source.app.state == Shell.AppState.STOPPED &&
|
||||
!actions.includes('activate-discrete-gpu')) {
|
||||
!wantsDiscreteGpu &&
|
||||
this._source.app.state == Shell.AppState.STOPPED) {
|
||||
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
|
||||
this._onDiscreteGpuMenuItem.connect('activate', () => {
|
||||
this._source.animateLaunch();
|
||||
this._source.app.launch(0, -1, true);
|
||||
this._source.app.launch(0, -1, Shell.AppGpuSelection.DISCRETE);
|
||||
this.emit('activate-window', null);
|
||||
});
|
||||
}
|
||||
@ -2528,8 +2530,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
||||
let action = actions[i];
|
||||
let item = this._appendMenuItem(appInfo.get_action_name(action));
|
||||
item.connect('activate', (emitter, event) => {
|
||||
if (action == 'new-window' ||
|
||||
action == 'activate-discrete-gpu')
|
||||
if (action == 'new-window')
|
||||
this._source.animateLaunch();
|
||||
|
||||
this._source.app.launch_action(action, event.get_time(), -1);
|
||||
|
@ -509,7 +509,7 @@ shell_app_activate_full (ShellApp *app,
|
||||
case SHELL_APP_STATE_STOPPED:
|
||||
{
|
||||
GError *error = NULL;
|
||||
if (!shell_app_launch (app, timestamp, workspace, FALSE, &error))
|
||||
if (!shell_app_launch (app, timestamp, workspace, SHELL_APP_GPU_SELECTION_AUTO, &error))
|
||||
{
|
||||
char *msg;
|
||||
msg = g_strdup_printf (_("Failed to launch “%s”"), shell_app_get_name (app));
|
||||
@ -584,7 +584,7 @@ shell_app_open_new_window (ShellApp *app,
|
||||
* instance (Firefox). There are a few less-sensical cases such
|
||||
* as say Pidgin.
|
||||
*/
|
||||
shell_app_launch (app, 0, workspace, FALSE, NULL);
|
||||
shell_app_launch (app, 0, workspace, SHELL_APP_GPU_SELECTION_AUTO, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1255,18 +1255,36 @@ wait_pid (GDesktopAppInfo *appinfo,
|
||||
g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
get_with_discrete_gpu (ShellApp *app,
|
||||
ShellAppGpuSelection discrete_gpu)
|
||||
{
|
||||
switch (discrete_gpu)
|
||||
{
|
||||
case SHELL_APP_GPU_SELECTION_INTEGRATED:
|
||||
return FALSE;
|
||||
case SHELL_APP_GPU_SELECTION_DISCRETE:
|
||||
return TRUE;
|
||||
case SHELL_APP_GPU_SELECTION_AUTO:
|
||||
return g_desktop_app_info_get_boolean (app->info, "PreferRunOnDiscreteGPU") ||
|
||||
g_desktop_app_info_get_boolean (app->info, "X-KDE-RunOnDiscreteGpu");
|
||||
default:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_app_launch:
|
||||
* @timestamp: Event timestamp, or 0 for current event timestamp
|
||||
* @workspace: Start on this workspace, or -1 for default
|
||||
* @discrete_gpu: Whether to start on the discrete GPU
|
||||
* @discrete_gpu: the preferred GPU to launch the application on.
|
||||
* @error: A #GError
|
||||
*/
|
||||
gboolean
|
||||
shell_app_launch (ShellApp *app,
|
||||
guint timestamp,
|
||||
int workspace,
|
||||
gboolean discrete_gpu,
|
||||
ShellAppGpuSelection discrete_gpu,
|
||||
GError **error)
|
||||
{
|
||||
ShellGlobal *global;
|
||||
@ -1289,8 +1307,13 @@ shell_app_launch (ShellApp *app,
|
||||
|
||||
global = shell_global_get ();
|
||||
context = shell_global_create_app_launch_context (global, timestamp, workspace);
|
||||
if (discrete_gpu)
|
||||
/* FIXME: this should probably check whether we're on a dual-GPU system */
|
||||
if (get_with_discrete_gpu (app, discrete_gpu))
|
||||
{
|
||||
g_app_launch_context_setenv (context, "DRI_PRIME", "1");
|
||||
g_app_launch_context_setenv (context, "__NV_PRIME_RENDER_OFFLOAD", "1");
|
||||
g_app_launch_context_setenv (context, "__GLX_VENDOR_LIBRARY_NAME", "nvidia");
|
||||
}
|
||||
|
||||
/* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn
|
||||
* codepath. The shell's open file descriptors should be marked CLOEXEC
|
||||
|
@ -18,6 +18,12 @@ typedef enum {
|
||||
SHELL_APP_STATE_RUNNING
|
||||
} ShellAppState;
|
||||
|
||||
typedef enum {
|
||||
SHELL_APP_GPU_SELECTION_AUTO = -1,
|
||||
SHELL_APP_GPU_SELECTION_INTEGRATED = 0,
|
||||
SHELL_APP_GPU_SELECTION_DISCRETE = 1
|
||||
} ShellAppGpuSelection;
|
||||
|
||||
const char *shell_app_get_id (ShellApp *app);
|
||||
|
||||
GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
|
||||
@ -54,7 +60,7 @@ gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
|
||||
gboolean shell_app_launch (ShellApp *app,
|
||||
guint timestamp,
|
||||
int workspace,
|
||||
gboolean discrete_gpu,
|
||||
ShellAppGpuSelection discrete_gpu,
|
||||
GError **error);
|
||||
|
||||
void shell_app_launch_action (ShellApp *app,
|
||||
|
Loading…
Reference in New Issue
Block a user