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
This commit is contained in:
Olivier Fourdan 2019-07-15 13:13:45 +02:00 committed by Carlos Garnacho
parent 9c8ff5dbe8
commit ac5d9ec558
4 changed files with 47 additions and 3 deletions

View File

@ -154,6 +154,7 @@ GList *meta_prefs_get_keybindings (void);
void meta_prefs_get_overlay_binding (MetaKeyCombo *combo); void meta_prefs_get_overlay_binding (MetaKeyCombo *combo);
void meta_prefs_get_locate_pointer_binding (MetaKeyCombo *combo); void meta_prefs_get_locate_pointer_binding (MetaKeyCombo *combo);
const char *meta_prefs_get_iso_next_group_option (void); 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_grab_keys (MetaX11Display *x11_display);
void meta_x11_display_ungrab_keys (MetaX11Display *x11_display); void meta_x11_display_ungrab_keys (MetaX11Display *x11_display);

View File

@ -182,6 +182,9 @@ static gboolean process_keyboard_resize_grab (MetaDisplay *display,
MetaWindow *window, MetaWindow *window,
ClutterKeyEvent *event); ClutterKeyEvent *event);
static void maybe_update_locate_pointer_keygrab (MetaDisplay *display,
gboolean grab);
static GHashTable *key_handlers; static GHashTable *key_handlers;
static GHashTable *external_grabs; static GHashTable *external_grabs;
@ -1342,6 +1345,10 @@ prefs_changed_callback (MetaPreference pref,
switch (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: case META_PREF_KEYBINDINGS:
ungrab_key_bindings (display); ungrab_key_bindings (display);
rebuild_key_binding_table (keys); 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); 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 static void
meta_x11_display_change_keygrabs (MetaX11Display *x11_display, meta_x11_display_change_keygrabs (MetaX11Display *x11_display,
gboolean grab) gboolean grab)
@ -1502,9 +1524,7 @@ meta_x11_display_change_keygrabs (MetaX11Display *x11_display,
meta_change_keygrab (keys, x11_display->xroot, meta_change_keygrab (keys, x11_display->xroot,
grab, &keys->overlay_resolved_key_combo); grab, &keys->overlay_resolved_key_combo);
if (keys->locate_pointer_resolved_key_combo.len != 0) maybe_update_locate_pointer_keygrab (x11_display->display, grab);
meta_change_keygrab (keys, x11_display->xroot,
grab, &keys->locate_pointer_resolved_key_combo);
for (i = 0; i < keys->n_iso_next_group_combos; i++) for (i = 0; i < keys->n_iso_next_group_combos; i++)
meta_change_keygrab (keys, x11_display->xroot, meta_change_keygrab (keys, x11_display->xroot,

View File

@ -60,6 +60,7 @@
#define KEY_OVERLAY_KEY "overlay-key" #define KEY_OVERLAY_KEY "overlay-key"
#define KEY_WORKSPACES_ONLY_ON_PRIMARY "workspaces-only-on-primary" #define KEY_WORKSPACES_ONLY_ON_PRIMARY "workspaces-only-on-primary"
#define KEY_LOCATE_POINTER "locate-pointer"
/* These are the different schemas we are keeping /* These are the different schemas we are keeping
* a GSettings instance for */ * a GSettings instance for */
@ -100,6 +101,7 @@ static gboolean bell_is_visible = FALSE;
static gboolean bell_is_audible = TRUE; static gboolean bell_is_audible = TRUE;
static gboolean gnome_accessibility = FALSE; static gboolean gnome_accessibility = FALSE;
static gboolean gnome_animations = TRUE; static gboolean gnome_animations = TRUE;
static gboolean locate_pointer_is_enabled = FALSE;
static char *cursor_theme = NULL; static char *cursor_theme = NULL;
/* cursor_size will, when running as an X11 compositing window manager, be the /* cursor_size will, when running as an X11 compositing window manager, be the
* actual cursor size, multiplied with the global window scaling factor. On * 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 button_layout_handler (GVariant*, gpointer*, gpointer);
static gboolean overlay_key_handler (GVariant*, gpointer*, gpointer); static gboolean overlay_key_handler (GVariant*, gpointer*, gpointer);
static gboolean locate_pointer_key_handler (GVariant*, gpointer*, gpointer); static gboolean locate_pointer_key_handler (GVariant*, gpointer*, gpointer);
static gboolean iso_next_group_handler (GVariant*, gpointer*, gpointer); static gboolean iso_next_group_handler (GVariant*, gpointer*, gpointer);
static void init_bindings (void); static void init_bindings (void);
@ -384,6 +387,13 @@ static MetaBoolPreference preferences_bool[] =
}, },
&auto_maximize, &auto_maximize,
}, },
{
{ KEY_LOCATE_POINTER,
SCHEMA_INTERFACE,
META_PREF_LOCATE_POINTER,
},
&locate_pointer_is_enabled,
},
{ { NULL, 0, 0 }, NULL }, { { NULL, 0, 0 }, NULL },
}; };
@ -960,6 +970,8 @@ meta_prefs_init (void)
G_CALLBACK (settings_changed), NULL); G_CALLBACK (settings_changed), NULL);
g_signal_connect (settings, "changed::" KEY_GNOME_CURSOR_SIZE, g_signal_connect (settings, "changed::" KEY_GNOME_CURSOR_SIZE,
G_CALLBACK (settings_changed), NULL); 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); g_hash_table_insert (settings_schemas, g_strdup (SCHEMA_INTERFACE), settings);
settings = g_settings_new (SCHEMA_INPUT_SOURCES); settings = g_settings_new (SCHEMA_INPUT_SOURCES);
@ -1680,6 +1692,9 @@ meta_preference_to_string (MetaPreference pref)
case META_PREF_AUTO_MAXIMIZE: case META_PREF_AUTO_MAXIMIZE:
return "AUTO_MAXIMIZE"; return "AUTO_MAXIMIZE";
case META_PREF_LOCATE_POINTER:
return "LOCATE_POINTER";
} }
return "(unknown)"; return "(unknown)";
@ -2020,6 +2035,12 @@ meta_prefs_get_locate_pointer_binding (MetaKeyCombo *combo)
*combo = locate_pointer_key_combo; *combo = locate_pointer_key_combo;
} }
gboolean
meta_prefs_is_locate_pointer_enabled (void)
{
return locate_pointer_is_enabled;
}
const char * const char *
meta_prefs_get_iso_next_group_option (void) meta_prefs_get_iso_next_group_option (void)
{ {

View File

@ -65,6 +65,7 @@
* @META_PREF_AUTO_MAXIMIZE: auto-maximize * @META_PREF_AUTO_MAXIMIZE: auto-maximize
* @META_PREF_CENTER_NEW_WINDOWS: center new windows * @META_PREF_CENTER_NEW_WINDOWS: center new windows
* @META_PREF_DRAG_THRESHOLD: drag threshold * @META_PREF_DRAG_THRESHOLD: drag threshold
* @META_PREF_LOCATE_POINTER: show pointer location
*/ */
/* Keep in sync with GSettings schemas! */ /* Keep in sync with GSettings schemas! */
@ -103,6 +104,7 @@ typedef enum
META_PREF_AUTO_MAXIMIZE, META_PREF_AUTO_MAXIMIZE,
META_PREF_CENTER_NEW_WINDOWS, META_PREF_CENTER_NEW_WINDOWS,
META_PREF_DRAG_THRESHOLD, META_PREF_DRAG_THRESHOLD,
META_PREF_LOCATE_POINTER,
} MetaPreference; } MetaPreference;
typedef void (* MetaPrefsChangedFunc) (MetaPreference pref, typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,