shell/app: Handle workspace from startup notifications
Launching applications on a particular workspace works through launch contexts and startup notifications. While this is no longer required by a launcher/WM split, in theory this allows us to reliably identify the correct window to apply startup properties to. However in practice we fail more often than not: Missing support in toolkits, differences between display protocols, D-Bus activation and single-instance applications all provide their own pitfalls. So instead, take advantage of the fact that launcher and WM live in the same process, and go with the unsophisticated approach: Just remember the last workspace that was requested when launching an app, then move the next window that is associated with the app to that workspace. This will break X11 applications that set an initial workspace, but that's legacy functionality anyway (given that there's no wayland protocol for that functionality), and seems a price worth paying for making launching apps on workspaces more reliable. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1316>
This commit is contained in:
parent
40b67a140a
commit
9a273e1db2
@ -1081,6 +1081,10 @@ _shell_app_add_window (ShellApp *app,
|
|||||||
if (!app->running_state)
|
if (!app->running_state)
|
||||||
create_running_state (app);
|
create_running_state (app);
|
||||||
|
|
||||||
|
if (app->started_on_workspace >= 0)
|
||||||
|
meta_window_change_workspace_by_index (window, app->started_on_workspace, FALSE);
|
||||||
|
app->started_on_workspace = -1;
|
||||||
|
|
||||||
app->running_state->window_sort_stale = TRUE;
|
app->running_state->window_sort_stale = TRUE;
|
||||||
app->running_state->windows = g_slist_prepend (app->running_state->windows, g_object_ref (window));
|
app->running_state->windows = g_slist_prepend (app->running_state->windows, g_object_ref (window));
|
||||||
g_signal_connect_object (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app, 0);
|
g_signal_connect_object (window, "unmanaged", G_CALLBACK(shell_app_on_unmanaged), app, 0);
|
||||||
@ -1173,17 +1177,15 @@ _shell_app_handle_startup_sequence (ShellApp *app,
|
|||||||
shell_app_state_transition (app, SHELL_APP_STATE_STARTING);
|
shell_app_state_transition (app, SHELL_APP_STATE_STARTING);
|
||||||
meta_display_unset_input_focus (display,
|
meta_display_unset_input_focus (display,
|
||||||
meta_startup_sequence_get_timestamp (sequence));
|
meta_startup_sequence_get_timestamp (sequence));
|
||||||
app->started_on_workspace = meta_startup_sequence_get_workspace (sequence);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!starting)
|
if (starting)
|
||||||
{
|
app->started_on_workspace = meta_startup_sequence_get_workspace (sequence);
|
||||||
if (app->running_state && app->running_state->windows)
|
else if (app->running_state && app->running_state->windows)
|
||||||
shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
|
shell_app_state_transition (app, SHELL_APP_STATE_RUNNING);
|
||||||
else /* application have > 1 .desktop file */
|
else /* application have > 1 .desktop file */
|
||||||
shell_app_state_transition (app, SHELL_APP_STATE_STOPPED);
|
shell_app_state_transition (app, SHELL_APP_STATE_STOPPED);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_app_request_quit:
|
* shell_app_request_quit:
|
||||||
@ -1550,6 +1552,7 @@ static void
|
|||||||
shell_app_init (ShellApp *self)
|
shell_app_init (ShellApp *self)
|
||||||
{
|
{
|
||||||
self->state = SHELL_APP_STATE_STOPPED;
|
self->state = SHELL_APP_STATE_STOPPED;
|
||||||
|
self->started_on_workspace = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user