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();
|
this._appendSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let wantsDiscreteGpu = appInfo.get_boolean("PreferRunOnDiscreteGPU") ||
|
||||||
|
appInfo.get_boolean("X-KDE-RunOnDiscreteGpu");
|
||||||
if (discreteGpuAvailable &&
|
if (discreteGpuAvailable &&
|
||||||
this._source.app.state == Shell.AppState.STOPPED &&
|
!wantsDiscreteGpu &&
|
||||||
!actions.includes('activate-discrete-gpu')) {
|
this._source.app.state == Shell.AppState.STOPPED) {
|
||||||
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
|
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
|
||||||
this._onDiscreteGpuMenuItem.connect('activate', () => {
|
this._onDiscreteGpuMenuItem.connect('activate', () => {
|
||||||
this._source.animateLaunch();
|
this._source.animateLaunch();
|
||||||
this._source.app.launch(0, -1, true);
|
this._source.app.launch(0, -1, Shell.AppGpuSelection.DISCRETE);
|
||||||
this.emit('activate-window', null);
|
this.emit('activate-window', null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2528,8 +2530,7 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
|||||||
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));
|
||||||
item.connect('activate', (emitter, event) => {
|
item.connect('activate', (emitter, event) => {
|
||||||
if (action == 'new-window' ||
|
if (action == 'new-window')
|
||||||
action == 'activate-discrete-gpu')
|
|
||||||
this._source.animateLaunch();
|
this._source.animateLaunch();
|
||||||
|
|
||||||
this._source.app.launch_action(action, event.get_time(), -1);
|
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:
|
case SHELL_APP_STATE_STOPPED:
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
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;
|
char *msg;
|
||||||
msg = g_strdup_printf (_("Failed to launch “%s”"), shell_app_get_name (app));
|
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
|
* instance (Firefox). There are a few less-sensical cases such
|
||||||
* as say Pidgin.
|
* 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);
|
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:
|
* shell_app_launch:
|
||||||
* @timestamp: Event timestamp, or 0 for current event timestamp
|
* @timestamp: Event timestamp, or 0 for current event timestamp
|
||||||
* @workspace: Start on this workspace, or -1 for default
|
* @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
|
* @error: A #GError
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
shell_app_launch (ShellApp *app,
|
shell_app_launch (ShellApp *app,
|
||||||
guint timestamp,
|
guint timestamp,
|
||||||
int workspace,
|
int workspace,
|
||||||
gboolean discrete_gpu,
|
ShellAppGpuSelection discrete_gpu,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
ShellGlobal *global;
|
ShellGlobal *global;
|
||||||
@ -1289,8 +1307,13 @@ shell_app_launch (ShellApp *app,
|
|||||||
|
|
||||||
global = shell_global_get ();
|
global = shell_global_get ();
|
||||||
context = shell_global_create_app_launch_context (global, timestamp, workspace);
|
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, "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
|
/* Set LEAVE_DESCRIPTORS_OPEN in order to use an optimized gspawn
|
||||||
* codepath. The shell's open file descriptors should be marked CLOEXEC
|
* codepath. The shell's open file descriptors should be marked CLOEXEC
|
||||||
|
@ -18,6 +18,12 @@ typedef enum {
|
|||||||
SHELL_APP_STATE_RUNNING
|
SHELL_APP_STATE_RUNNING
|
||||||
} ShellAppState;
|
} 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);
|
const char *shell_app_get_id (ShellApp *app);
|
||||||
|
|
||||||
GDesktopAppInfo *shell_app_get_app_info (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,
|
gboolean shell_app_launch (ShellApp *app,
|
||||||
guint timestamp,
|
guint timestamp,
|
||||||
int workspace,
|
int workspace,
|
||||||
gboolean discrete_gpu,
|
ShellAppGpuSelection discrete_gpu,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
void shell_app_launch_action (ShellApp *app,
|
void shell_app_launch_action (ShellApp *app,
|
||||||
|
Loading…
Reference in New Issue
Block a user