Commit c8235d44 authored by Alberts Muktupāvels's avatar Alberts Muktupāvels

core: preserve focus across decoration changes

Changes in window decoration result in the window being reparented
in and out its frame. This in turn causes unmap/map events, and
FocusOut if the window happened to be focused.

In order to preserve the focused window across the decoration change,
add a flag so that the focus may be restored on MapNotify.

Based on mutter commit:
mutter@8dcac664
parent d820fce9
Pipeline #114849 passed with stage
in 13 minutes and 13 seconds
......@@ -2352,6 +2352,11 @@ event_callback (XEvent *event,
window = meta_window_new (display, event->xmap.window, FALSE,
META_EFFECT_TYPE_CREATE);
}
else if (window && window->restore_focus_on_map)
{
meta_window_focus (window,
meta_display_get_current_time_roundtrip (display));
}
break;
case MapRequest:
if (window == NULL)
......
......@@ -146,6 +146,12 @@ meta_window_ensure_frame (MetaWindow *window)
/* FIXME handle this error */
meta_error_trap_pop (window->display);
/* Ensure focus is restored after the unmap/map events triggered
* by XReparentWindow().
*/
if (meta_window_has_focus (window))
window->restore_focus_on_map = TRUE;
/* stick frame to the window */
window->frame = frame;
......@@ -216,6 +222,12 @@ meta_window_destroy_frame (MetaWindow *window)
meta_ui_destroy_frame_window (window->screen->ui, frame->xwindow);
/* Ensure focus is restored after the unmap/map events triggered
* by XReparentWindow().
*/
if (meta_window_has_focus (window))
window->restore_focus_on_map = TRUE;
meta_display_unregister_x_window (window->display,
frame->xwindow);
......
......@@ -341,6 +341,9 @@ struct _MetaWindow
/* if TRUE, we are freezing updates during a resize */
guint updates_frozen_for_resize : 1;
/* whether focus should be restored on map */
guint restore_focus_on_map : 1;
/* if non-NULL, the bounds of the window frame */
cairo_region_t *frame_bounds;
......
......@@ -4499,6 +4499,9 @@ meta_window_focus (MetaWindow *window,
g_return_if_fail (!window->override_redirect);
/* This is a oneshot flag */
window->restore_focus_on_map = FALSE;
meta_topic (META_DEBUG_FOCUS,
"Setting input focus to window %s, input: %d take_focus: %d\n",
window->desc, window->input, window->take_focus);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment