summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2018-09-18 19:49:03 +0200
committerJonas Ã…dahl <jadahl@gmail.com>2019-02-19 18:09:01 +0000
commite62c9e1c5d6c848044790e7734b66a7e348eac27 (patch)
tree3fd7c5bda96855ecae8ec3fd116889cb6272b079
parent7bd668e6d0081ff4a22617625347e54ca7138819 (diff)
downloadmutter-wip/carlosg/unfocus-on-modal.tar.gz
compositor: Focus the no focus window during modal plugin operationswip/carlosg/unfocus-on-modal
Modal operations are usually far from transient, so it makes sense to unfocus the currently focused window while the operation is going on. If no other window was focused and the window is still alive when the modal operation is finished, focus will be restored back. Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/452
-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);