shell-app: Add PrefersNonDefaultGPU support to shell_app_launch()
Read the "PrefersNonDefaultGPU" key in desktop files to figure out whether the application prefers running on the discrete GPU, or the default GPU, and apply that. Update the "Launch..." contextual menu to allow launching on the default GPU if the application "prefers [the] non default GPU". See: https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html#recognized-keys https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/1804
This commit is contained in:
parent
13dcd78be1
commit
34da48453e
@ -2512,10 +2512,16 @@ var AppIconMenu = class AppIconMenu extends PopupMenu.PopupMenu {
|
|||||||
|
|
||||||
if (discreteGpuAvailable &&
|
if (discreteGpuAvailable &&
|
||||||
this._source.app.state == Shell.AppState.STOPPED) {
|
this._source.app.state == Shell.AppState.STOPPED) {
|
||||||
this._onDiscreteGpuMenuItem = this._appendMenuItem(_("Launch using Dedicated Graphics Card"));
|
const appPrefersNonDefaultGPU = appInfo.get_boolean('PrefersNonDefaultGPU');
|
||||||
this._onDiscreteGpuMenuItem.connect('activate', () => {
|
const gpuPref = appPrefersNonDefaultGPU
|
||||||
|
? Shell.AppLaunchGpu.DEFAULT
|
||||||
|
: Shell.AppLaunchGpu.DISCRETE;
|
||||||
|
this._onGpuMenuItem = this._appendMenuItem(appPrefersNonDefaultGPU
|
||||||
|
? _('Launch using Integrated Graphics Card')
|
||||||
|
: _('Launch using Discrete Graphics Card'));
|
||||||
|
this._onGpuMenuItem.connect('activate', () => {
|
||||||
this._source.animateLaunch();
|
this._source.animateLaunch();
|
||||||
this._source.app.launch(0, -1, true);
|
this._source.app.launch(0, -1, gpuPref);
|
||||||
this.emit('activate-window', null);
|
this.emit('activate-window', null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -531,7 +531,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_LAUNCH_GPU_APP_PREF, &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));
|
||||||
@ -606,7 +606,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_LAUNCH_GPU_APP_PREF, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1339,20 +1339,21 @@ apply_discrete_gpu_env (GAppLaunchContext *context,
|
|||||||
* 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
|
* @gpu_pref: the GPU to prefer launching 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,
|
ShellAppLaunchGpu gpu_pref,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
ShellGlobal *global;
|
ShellGlobal *global;
|
||||||
GAppLaunchContext *context;
|
GAppLaunchContext *context;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
GSpawnFlags flags;
|
GSpawnFlags flags;
|
||||||
|
gboolean discrete_gpu = FALSE;
|
||||||
|
|
||||||
if (app->info == NULL)
|
if (app->info == NULL)
|
||||||
{
|
{
|
||||||
@ -1369,6 +1370,11 @@ 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 (gpu_pref == SHELL_APP_LAUNCH_GPU_APP_PREF)
|
||||||
|
discrete_gpu = g_desktop_app_info_get_boolean (app->info, "PrefersNonDefaultGPU");
|
||||||
|
else
|
||||||
|
discrete_gpu = (gpu_pref == SHELL_APP_LAUNCH_GPU_DISCRETE);
|
||||||
|
|
||||||
if (discrete_gpu)
|
if (discrete_gpu)
|
||||||
apply_discrete_gpu_env (context, global);
|
apply_discrete_gpu_env (context, global);
|
||||||
|
|
||||||
|
@ -18,6 +18,12 @@ typedef enum {
|
|||||||
SHELL_APP_STATE_RUNNING
|
SHELL_APP_STATE_RUNNING
|
||||||
} ShellAppState;
|
} ShellAppState;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
SHELL_APP_LAUNCH_GPU_APP_PREF = 0,
|
||||||
|
SHELL_APP_LAUNCH_GPU_DISCRETE,
|
||||||
|
SHELL_APP_LAUNCH_GPU_DEFAULT
|
||||||
|
} ShellAppLaunchGpu;
|
||||||
|
|
||||||
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);
|
||||||
@ -51,11 +57,11 @@ GSList *shell_app_get_pids (ShellApp *app);
|
|||||||
|
|
||||||
gboolean shell_app_is_on_workspace (ShellApp *app, MetaWorkspace *workspace);
|
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,
|
ShellAppLaunchGpu gpu_pref,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
void shell_app_launch_action (ShellApp *app,
|
void shell_app_launch_action (ShellApp *app,
|
||||||
const char *action_name,
|
const char *action_name,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user