[mutter/wip/carlosg/unfocus-on-modal] compositor: Focus the no input window during modal plugin operations
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/unfocus-on-modal] compositor: Focus the no input window during modal plugin operations
- Date: Tue, 18 Sep 2018 20:28:39 +0000 (UTC)
commit 197950f0d969b1c9b2b86401dbde933f755e1754
Author: Carlos Garnacho <carlosg gnome org>
Date: Tue Sep 18 19:49:03 2018 +0200
compositor: Focus the no input window during modal plugin operations
Modal operations are usually far from transient, so it makes sense to
unfocus the currently focused window while the operation is going on.
If 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
src/compositor/compositor-private.h | 2 ++
src/compositor/compositor.c | 17 +++++++++++++++++
2 files changed, 19 insertions(+)
---
diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
index 125a0afe8..84aa428d7 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 e45d10c00..b39912478 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -374,6 +374,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;
@@ -417,6 +422,18 @@ 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_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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]