core/window: Update workspace MRU list earlier
We want to use the workspace MRU list to decide the default focus but Globally Active Input clients don't call meta_window_set_focused_internal and therefore don't update the MRU list. Move the update to meta_window_focus instead. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2489>
This commit is contained in:
parent
f336911d8f
commit
deae8aa7b1
@ -4576,6 +4576,34 @@ meta_window_focus (MetaWindow *window,
|
|||||||
|
|
||||||
META_WINDOW_GET_CLASS (window)->focus (window, timestamp);
|
META_WINDOW_GET_CLASS (window)->focus (window, timestamp);
|
||||||
|
|
||||||
|
/* Move to the front of the focusing workspace's MRU list.
|
||||||
|
* We should only be "removing" it from the MRU list if it's
|
||||||
|
* not already there. Note that it's possible that we might
|
||||||
|
* be processing this FocusIn after we've changed to a
|
||||||
|
* different workspace; we should therefore update the MRU
|
||||||
|
* list only if the window is actually on the active
|
||||||
|
* workspace.
|
||||||
|
*/
|
||||||
|
if (workspace_manager->active_workspace &&
|
||||||
|
meta_window_located_on_workspace (window,
|
||||||
|
workspace_manager->active_workspace))
|
||||||
|
{
|
||||||
|
GList *link;
|
||||||
|
|
||||||
|
link = g_list_find (workspace_manager->active_workspace->mru_list,
|
||||||
|
window);
|
||||||
|
g_assert (link);
|
||||||
|
|
||||||
|
workspace_manager->active_workspace->mru_list =
|
||||||
|
g_list_remove_link (workspace_manager->active_workspace->mru_list,
|
||||||
|
link);
|
||||||
|
g_list_free (link);
|
||||||
|
|
||||||
|
workspace_manager->active_workspace->mru_list =
|
||||||
|
g_list_prepend (workspace_manager->active_workspace->mru_list,
|
||||||
|
window);
|
||||||
|
}
|
||||||
|
|
||||||
backend = meta_get_backend ();
|
backend = meta_get_backend ();
|
||||||
stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
|
stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
|
||||||
|
|
||||||
@ -5130,41 +5158,12 @@ void
|
|||||||
meta_window_set_focused_internal (MetaWindow *window,
|
meta_window_set_focused_internal (MetaWindow *window,
|
||||||
gboolean focused)
|
gboolean focused)
|
||||||
{
|
{
|
||||||
MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
|
|
||||||
|
|
||||||
if (focused)
|
if (focused)
|
||||||
{
|
{
|
||||||
window->has_focus = TRUE;
|
window->has_focus = TRUE;
|
||||||
if (window->override_redirect)
|
if (window->override_redirect)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Move to the front of the focusing workspace's MRU list.
|
|
||||||
* We should only be "removing" it from the MRU list if it's
|
|
||||||
* not already there. Note that it's possible that we might
|
|
||||||
* be processing this FocusIn after we've changed to a
|
|
||||||
* different workspace; we should therefore update the MRU
|
|
||||||
* list only if the window is actually on the active
|
|
||||||
* workspace.
|
|
||||||
*/
|
|
||||||
if (workspace_manager->active_workspace &&
|
|
||||||
meta_window_located_on_workspace (window,
|
|
||||||
workspace_manager->active_workspace))
|
|
||||||
{
|
|
||||||
GList* link;
|
|
||||||
link = g_list_find (workspace_manager->active_workspace->mru_list,
|
|
||||||
window);
|
|
||||||
g_assert (link);
|
|
||||||
|
|
||||||
workspace_manager->active_workspace->mru_list =
|
|
||||||
g_list_remove_link (workspace_manager->active_workspace->mru_list,
|
|
||||||
link);
|
|
||||||
g_list_free (link);
|
|
||||||
|
|
||||||
workspace_manager->active_workspace->mru_list =
|
|
||||||
g_list_prepend (workspace_manager->active_workspace->mru_list,
|
|
||||||
window);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
meta_frame_queue_draw (window->frame);
|
meta_frame_queue_draw (window->frame);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user