[mutter/wip/carlosg/unfocus-on-modal: 485/485] compositor: Focus the no focus window during modal plugin operations
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/unfocus-on-modal: 485/485] compositor: Focus the no focus window during modal plugin operations
- Date: Tue, 19 Feb 2019 18:09:28 +0000 (UTC)
commit e62c9e1c5d6c848044790e7734b66a7e348eac27
Author: Carlos Garnacho <carlosg gnome org>
Date: Tue Sep 18 19:49:03 2018 +0200
compositor: Focus the no focus 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 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
src/compositor/compositor-private.h | 2 ++
src/compositor/compositor.c | 18 ++++++++++++++++++
2 files changed, 20 insertions(+)
---
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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]