keybindings: Check the special modifiers specifically

Make sure it is only the special modifier (hardcoded to 1 currently)
which is being pressed (not counting locked modifiers) before notifying
that the special modifier is pressed, as we are interested in it being
pressed alone and not in combination with other modifier keys.

This helps in two ways:
- Pressing alt, then ctrl, then releasing both won't trigger the locate
  pointer action.
- Pressing alt, then ctrl, then down/up to switch workspace won't interpret
  the last up/down keypress as an additional key on top of the special ctrl
  modifier, thus won't be forwarded down to the focused client in the last
  second.

Closes: https://gitlab.gnome.org/GNOME/mutter/issues/812

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1014
This commit is contained in:
Carlos Garnacho 2020-03-12 19:43:15 +01:00
parent 67dd0b4fec
commit 23da6c2426

View File

@ -63,6 +63,15 @@
#define META_KEY_BINDING_PRIMARY_LAYOUT 0 #define META_KEY_BINDING_PRIMARY_LAYOUT 0
#define META_KEY_BINDING_SECONDARY_LAYOUT 1 #define META_KEY_BINDING_SECONDARY_LAYOUT 1
/* Only for special modifier keys */
#define IGNORED_MODIFIERS (CLUTTER_LOCK_MASK | \
CLUTTER_MOD2_MASK | \
CLUTTER_BUTTON1_MASK | \
CLUTTER_BUTTON2_MASK | \
CLUTTER_BUTTON3_MASK | \
CLUTTER_BUTTON4_MASK | \
CLUTTER_BUTTON5_MASK)
static gboolean add_builtin_keybinding (MetaDisplay *display, static gboolean add_builtin_keybinding (MetaDisplay *display,
const char *name, const char *name,
GSettings *settings, GSettings *settings,
@ -2120,6 +2129,7 @@ process_special_modifier_key (MetaDisplay *display,
return TRUE; return TRUE;
} }
else if (event->type == CLUTTER_KEY_PRESS && else if (event->type == CLUTTER_KEY_PRESS &&
(event->modifier_state & ~(IGNORED_MODIFIERS)) == 0 &&
resolved_key_combo_has_keycode (resolved_key_combo, resolved_key_combo_has_keycode (resolved_key_combo,
event->hardware_keycode)) event->hardware_keycode))
{ {