[mutter] keybindings: Do not grab the locate-pointer key if unnecessary



commit ac5d9ec5581e2ac3e4efe87e88b69ebe02ee736c
Author: Olivier Fourdan <ofourdan redhat com>
Date:   Mon Jul 15 13:13:45 2019 +0200

    keybindings: Do not grab the locate-pointer key if unnecessary
    
    On X11, mutter needs to keep a grab on the locate-pointer key to be able
    to trigger the functionality time the corresponding key combo is
    pressed.
    
    However, doing so may have side effects on other X11 clients that would
    want to have a grab on the same key.
    
    Make sure we only actually grab the key combo for "locate-pointer" only
    when the feature is actually enabled, so that having the locate pointer
    feature turned off (the default) would not cause side effects on other
    X11 clients that might want to use the same key for their own use.
    
    Fixes: https://gitlab.gnome.org/GNOME/mutter/issues/647

 src/core/keybindings-private.h |  1 +
 src/core/keybindings.c         | 26 +++++++++++++++++++++++---
 src/core/prefs.c               | 21 +++++++++++++++++++++
 src/meta/prefs.h               |  2 ++
 4 files changed, 47 insertions(+), 3 deletions(-)
---
diff --git a/src/core/keybindings-private.h b/src/core/keybindings-private.h
index fd1c14212..ab1ab52fe 100644
--- a/src/core/keybindings-private.h
+++ b/src/core/keybindings-private.h
@@ -154,6 +154,7 @@ GList *meta_prefs_get_keybindings (void);
 void meta_prefs_get_overlay_binding (MetaKeyCombo *combo);
 void meta_prefs_get_locate_pointer_binding (MetaKeyCombo *combo);
 const char *meta_prefs_get_iso_next_group_option (void);
+gboolean meta_prefs_is_locate_pointer_enabled (void);
 
 void meta_x11_display_grab_keys   (MetaX11Display *x11_display);
 void meta_x11_display_ungrab_keys (MetaX11Display *x11_display);
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 6857d7613..e21d4568e 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -182,6 +182,9 @@ static gboolean process_keyboard_resize_grab (MetaDisplay     *display,
                                               MetaWindow      *window,
                                               ClutterKeyEvent *event);
 
+static void maybe_update_locate_pointer_keygrab (MetaDisplay *display,
+                                                 gboolean     grab);
+
 static GHashTable *key_handlers;
 static GHashTable *external_grabs;
 
@@ -1342,6 +1345,10 @@ prefs_changed_callback (MetaPreference pref,
 
   switch (pref)
     {
+    case META_PREF_LOCATE_POINTER:
+      maybe_update_locate_pointer_keygrab (display,
+                                           meta_prefs_is_locate_pointer_enabled());
+      break;
     case META_PREF_KEYBINDINGS:
       ungrab_key_bindings (display);
       rebuild_key_binding_table (keys);
@@ -1491,6 +1498,21 @@ change_binding_keygrabs (MetaKeyBindingManager *keys,
   g_hash_table_foreach (keys->key_bindings, change_keygrab_foreach, &data);
 }
 
+static void
+maybe_update_locate_pointer_keygrab (MetaDisplay *display,
+                                     gboolean     grab)
+{
+  MetaKeyBindingManager *keys = &display->key_binding_manager;
+
+  if (!display->x11_display)
+    return;
+
+  if (keys->locate_pointer_resolved_key_combo.len != 0)
+    meta_change_keygrab (keys, display->x11_display->xroot,
+                         (!!grab & !!meta_prefs_is_locate_pointer_enabled()),
+                         &keys->locate_pointer_resolved_key_combo);
+}
+
 static void
 meta_x11_display_change_keygrabs (MetaX11Display *x11_display,
                                   gboolean        grab)
@@ -1502,9 +1524,7 @@ meta_x11_display_change_keygrabs (MetaX11Display *x11_display,
     meta_change_keygrab (keys, x11_display->xroot,
                          grab, &keys->overlay_resolved_key_combo);
 
-  if (keys->locate_pointer_resolved_key_combo.len != 0)
-    meta_change_keygrab (keys, x11_display->xroot,
-                         grab, &keys->locate_pointer_resolved_key_combo);
+  maybe_update_locate_pointer_keygrab (x11_display->display, grab);
 
   for (i = 0; i < keys->n_iso_next_group_combos; i++)
     meta_change_keygrab (keys, x11_display->xroot,
diff --git a/src/core/prefs.c b/src/core/prefs.c
index ca503bc3f..e3ee9119b 100644
--- a/src/core/prefs.c
+++ b/src/core/prefs.c
@@ -60,6 +60,7 @@
 
 #define KEY_OVERLAY_KEY "overlay-key"
 #define KEY_WORKSPACES_ONLY_ON_PRIMARY "workspaces-only-on-primary"
+#define KEY_LOCATE_POINTER "locate-pointer"
 
 /* These are the different schemas we are keeping
  * a GSettings instance for */
@@ -100,6 +101,7 @@ static gboolean bell_is_visible = FALSE;
 static gboolean bell_is_audible = TRUE;
 static gboolean gnome_accessibility = FALSE;
 static gboolean gnome_animations = TRUE;
+static gboolean locate_pointer_is_enabled = FALSE;
 static char *cursor_theme = NULL;
 /* cursor_size will, when running as an X11 compositing window manager, be the
  * actual cursor size, multiplied with the global window scaling factor. On
@@ -147,6 +149,7 @@ static gboolean mouse_button_mods_handler (GVariant*, gpointer*, gpointer);
 static gboolean button_layout_handler (GVariant*, gpointer*, gpointer);
 static gboolean overlay_key_handler (GVariant*, gpointer*, gpointer);
 static gboolean locate_pointer_key_handler (GVariant*, gpointer*, gpointer);
+
 static gboolean iso_next_group_handler (GVariant*, gpointer*, gpointer);
 
 static void     init_bindings             (void);
@@ -384,6 +387,13 @@ static MetaBoolPreference preferences_bool[] =
       },
       &auto_maximize,
     },
+    {
+      { KEY_LOCATE_POINTER,
+        SCHEMA_INTERFACE,
+        META_PREF_LOCATE_POINTER,
+      },
+      &locate_pointer_is_enabled,
+    },
     { { NULL, 0, 0 }, NULL },
   };
 
@@ -960,6 +970,8 @@ meta_prefs_init (void)
                     G_CALLBACK (settings_changed), NULL);
   g_signal_connect (settings, "changed::" KEY_GNOME_CURSOR_SIZE,
                     G_CALLBACK (settings_changed), NULL);
+  g_signal_connect (settings, "changed::" KEY_LOCATE_POINTER,
+                    G_CALLBACK (settings_changed), NULL);
   g_hash_table_insert (settings_schemas, g_strdup (SCHEMA_INTERFACE), settings);
 
   settings = g_settings_new (SCHEMA_INPUT_SOURCES);
@@ -1680,6 +1692,9 @@ meta_preference_to_string (MetaPreference pref)
 
     case META_PREF_AUTO_MAXIMIZE:
       return "AUTO_MAXIMIZE";
+
+    case META_PREF_LOCATE_POINTER:
+      return "LOCATE_POINTER";
     }
 
   return "(unknown)";
@@ -2020,6 +2035,12 @@ meta_prefs_get_locate_pointer_binding (MetaKeyCombo *combo)
   *combo = locate_pointer_key_combo;
 }
 
+gboolean
+meta_prefs_is_locate_pointer_enabled (void)
+{
+  return locate_pointer_is_enabled;
+}
+
 const char *
 meta_prefs_get_iso_next_group_option (void)
 {
diff --git a/src/meta/prefs.h b/src/meta/prefs.h
index 36ebc1fa1..c5e91a435 100644
--- a/src/meta/prefs.h
+++ b/src/meta/prefs.h
@@ -65,6 +65,7 @@
  * @META_PREF_AUTO_MAXIMIZE: auto-maximize
  * @META_PREF_CENTER_NEW_WINDOWS: center new windows
  * @META_PREF_DRAG_THRESHOLD: drag threshold
+ * @META_PREF_LOCATE_POINTER: show pointer location
  */
 
 /* Keep in sync with GSettings schemas! */
@@ -103,6 +104,7 @@ typedef enum
   META_PREF_AUTO_MAXIMIZE,
   META_PREF_CENTER_NEW_WINDOWS,
   META_PREF_DRAG_THRESHOLD,
+  META_PREF_LOCATE_POINTER,
 } MetaPreference;
 
 typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]