diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/frame.c | 12 | ||||
-rw-r--r-- | src/core/window-private.h | 3 | ||||
-rw-r--r-- | src/core/window.c | 3 |
3 files changed, 18 insertions, 0 deletions
diff --git a/src/core/frame.c b/src/core/frame.c index dc0109208..cfd284bc9 100644 --- a/src/core/frame.c +++ b/src/core/frame.c @@ -109,6 +109,12 @@ meta_window_ensure_frame (MetaWindow *window) /* FIXME handle this error */ meta_x11_error_trap_pop (x11_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; @@ -201,6 +207,12 @@ meta_window_destroy_frame (MetaWindow *window) meta_ui_frame_unmanage (frame->ui_frame); + /* 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_x11_display_unregister_x_window (x11_display, frame->xwindow); window->frame = NULL; diff --git a/src/core/window-private.h b/src/core/window-private.h index 8eb462be3..ea3353506 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -408,6 +408,9 @@ struct _MetaWindow /* whether or not the window is from a program running on another machine */ guint is_remote : 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; diff --git a/src/core/window.c b/src/core/window.c index e32366838..f9c90d1b6 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -4641,6 +4641,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); |