From dbc01459e7c0a70a69e5e7c6be884048a48179c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 6 Oct 2021 20:12:17 +0200 Subject: [PATCH] input: filter out non-significant modifiers when matching mouse bindings Closes #736 --- input.c | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/input.c b/input.c index e0adeb5a..aed9675e 100644 --- a/input.c +++ b/input.c @@ -927,6 +927,29 @@ UNITTEST xassert(strcmp(info->seq, "\033[27;6;9~") == 0); } +static void +get_current_modifiers(const struct seat *seat, + xkb_mod_mask_t *effective, + xkb_mod_mask_t *consumed, uint32_t key) +{ + const xkb_mod_mask_t ctrl = 1 << seat->kbd.mod_ctrl; + const xkb_mod_mask_t alt = 1 << seat->kbd.mod_alt; + const xkb_mod_mask_t shift = 1 << seat->kbd.mod_shift; + const xkb_mod_mask_t meta = 1 << seat->kbd.mod_meta; + const xkb_mod_mask_t significant = ctrl | alt | shift | meta; + + if (effective != NULL) { + *effective = xkb_state_serialize_mods( + seat->kbd.xkb_state, XKB_STATE_MODS_EFFECTIVE); + *effective &= significant; + } + + if (consumed != NULL) { + *consumed = xkb_state_key_get_consumed_mods(seat->kbd.xkb_state, key); + *consumed &= significant; + } +} + static void key_press_release(struct seat *seat, struct terminal *term, uint32_t serial, uint32_t key, uint32_t state) @@ -938,10 +961,6 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial, return; } - const xkb_mod_mask_t ctrl = 1 << seat->kbd.mod_ctrl; - const xkb_mod_mask_t alt = 1 << seat->kbd.mod_alt; - const xkb_mod_mask_t shift = 1 << seat->kbd.mod_shift; - const xkb_mod_mask_t meta = 1 << seat->kbd.mod_meta; if (state == XKB_KEY_UP) { stop_repeater(seat, key); @@ -978,14 +997,8 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial, return; } - xkb_mod_mask_t mods = xkb_state_serialize_mods( - seat->kbd.xkb_state, XKB_STATE_MODS_EFFECTIVE); - xkb_mod_mask_t consumed = xkb_state_key_get_consumed_mods( - seat->kbd.xkb_state, key); - - xkb_mod_mask_t significant = ctrl | alt | shift | meta; - mods &= significant; - consumed &= significant; + xkb_mod_mask_t mods, consumed; + get_current_modifiers(seat, &mods, &consumed, key); xkb_layout_index_t layout_idx = xkb_state_key_get_layout(seat->kbd.xkb_state, key); @@ -1155,7 +1168,7 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial, } else { - if (mods & alt) { + if (mods & (1 << seat->kbd.mod_alt)) { /* * When the alt modifier is pressed, we do one out of three things: * @@ -1952,8 +1965,8 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer, if (seat->wl_keyboard != NULL && seat->kbd.xkb_state != NULL) { /* Seat has keyboard - use mouse bindings *with* modifiers */ - xkb_mod_mask_t mods = xkb_state_serialize_mods( - seat->kbd.xkb_state, XKB_STATE_MODS_EFFECTIVE); + xkb_mod_mask_t mods; + get_current_modifiers(seat, &mods, NULL, 0); /* Ignore Shift when matching modifiers, since it is * used to enable selection in mouse grabbing client