[mutter/wip/carlosg/unfocus-on-modal] compositor: Focus the no focus window during modal plugin operations



commit b1debc1f4013df8ed661bbc1232045eba95bd44e
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 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..5ab4413bf 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,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]