summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compositor/compositor-private.h2
-rw-r--r--src/compositor/compositor.c18
2 files changed, 20 insertions, 0 deletions
diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
index 0f92d42da..84844c2a9 100644
--- a/src/compositor/compositor-private.h
+++ b/src/compositor/compositor-private.h
@@ -40,6 +40,8 @@ struct _MetaCompositor
MetaPluginManager *plugin_mgr;
+ MetaWindow *restore_focus_window;
+
gboolean frame_has_updated_xsurfaces;
gboolean have_x11_sync_object;
};
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 0854a198b..b7e48d719 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -375,6 +375,11 @@ meta_begin_modal_for_plugin (MetaCompositor *compositor,
if (!grab_devices (options, timestamp))
return FALSE;
+ g_set_object (&compositor->restore_focus_window,
+ meta_display_get_focus_window (display));
+ meta_x11_display_focus_the_no_focus_window (display->x11_display,
+ timestamp);
+
display->grab_op = META_GRAB_OP_COMPOSITOR;
display->event_route = META_EVENT_ROUTE_COMPOSITOR_GRAB;
display->grab_window = NULL;
@@ -418,6 +423,19 @@ meta_end_modal_for_plugin (MetaCompositor *compositor,
display->grab_have_pointer = FALSE;
display->grab_have_keyboard = FALSE;
+ if (compositor->restore_focus_window)
+ {
+ if (!compositor->restore_focus_window->unmanaging &&
+ !meta_display_get_focus_window (display))
+ {
+ meta_x11_display_set_input_focus_window (display->x11_display,
+ compositor->restore_focus_window,
+ FALSE, timestamp);
+ }
+
+ g_clear_object (&compositor->restore_focus_window);
+ }
+
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp);
meta_backend_ungrab_device (backend, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);