summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/frame.c12
-rw-r--r--src/core/window-private.h3
-rw-r--r--src/core/window.c3
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);