window: Appear as focused while focusing

Prevent focused window from blinking after switching to another
workspace on X11.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/850
This commit is contained in:
Alexander Mikhaylenko 2019-10-13 05:15:51 +05:00 committed by Alexander Mikhaylenko
parent 03514bb31a
commit 0c03702168
2 changed files with 11 additions and 1 deletions

View File

@ -550,6 +550,9 @@ struct _MetaWindow
guint unmanage_idle_id; guint unmanage_idle_id;
pid_t client_pid; pid_t client_pid;
/* Prevent blinking when focusing */
gboolean focusing;
}; };
struct _MetaWindowClass struct _MetaWindowClass

View File

@ -4782,6 +4782,10 @@ meta_window_focus (MetaWindow *window,
window = modal_transient; window = modal_transient;
} }
/* If the window was already appearing focused, but didn't have has_focus set,
* it will now briefly appear unfocused on X11. Set a flag to prevent that. */
window->focusing = TRUE;
meta_window_flush_calc_showing (window); meta_window_flush_calc_showing (window);
if ((!window->mapped || window->hidden) && !window->shaded) if ((!window->mapped || window->hidden) && !window->shaded)
@ -4789,6 +4793,7 @@ meta_window_focus (MetaWindow *window,
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Window %s is not showing, not focusing after all\n", "Window %s is not showing, not focusing after all\n",
window->desc); window->desc);
window->focusing = FALSE;
return; return;
} }
@ -5274,6 +5279,8 @@ meta_window_set_focused_internal (MetaWindow *window,
{ {
MetaWorkspaceManager *workspace_manager = window->display->workspace_manager; MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
window->focusing = FALSE;
if (focused) if (focused)
{ {
window->has_focus = TRUE; window->has_focus = TRUE;
@ -7272,7 +7279,7 @@ meta_window_appears_focused (MetaWindow *window)
if (workspace && workspace != workspace_manager->active_workspace) if (workspace && workspace != workspace_manager->active_workspace)
default_window = meta_workspace_get_default_focus_window (workspace); default_window = meta_workspace_get_default_focus_window (workspace);
return window->has_focus || (window->attached_focus_window != NULL) || (window == default_window); return window->has_focus || window->focusing || (window->attached_focus_window != NULL) || (window == default_window);
} }
gboolean gboolean