From 8e4d020a41727179078fae10d254a01161963aaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 2 Oct 2021 17:33:01 +0200 Subject: [PATCH] =?UTF-8?q?input:=20check=20for=20=E2=80=98effective?= =?UTF-8?q?=E2=80=99=20modifiers,=20not=20=E2=80=98depressed=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When reading XKB modifier state, use XKB_STATE_MODS_EFFECTIVE, not XKB_STATE_MODS_DEPRESSED. This fixes handling of ‘sticky’ modifier keys. --- CHANGELOG.md | 6 ++++++ input.c | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23d92b52..4e3cbc7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,12 @@ ### Deprecated ### Removed ### Fixed + +* ‘Sticky’ modifiers in input handling; when determining modifier + state, foot was looking at **depressed** modifiers, not + **effective** modifiers, like it should. + + ### Security ### Contributors diff --git a/input.c b/input.c index 853bc495..e0adeb5a 100644 --- a/input.c +++ b/input.c @@ -979,7 +979,7 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial, } xkb_mod_mask_t mods = xkb_state_serialize_mods( - seat->kbd.xkb_state, XKB_STATE_MODS_DEPRESSED); + seat->kbd.xkb_state, XKB_STATE_MODS_EFFECTIVE); xkb_mod_mask_t consumed = xkb_state_key_get_consumed_mods( seat->kbd.xkb_state, key); @@ -1237,13 +1237,13 @@ keyboard_modifiers(void *data, struct wl_keyboard *wl_keyboard, uint32_t serial, /* Update state of modifiers we're interested in for e.g mouse events */ seat->kbd.shift = xkb_state_mod_index_is_active( - seat->kbd.xkb_state, seat->kbd.mod_shift, XKB_STATE_MODS_DEPRESSED); + seat->kbd.xkb_state, seat->kbd.mod_shift, XKB_STATE_MODS_EFFECTIVE); seat->kbd.alt = xkb_state_mod_index_is_active( - seat->kbd.xkb_state, seat->kbd.mod_alt, XKB_STATE_MODS_DEPRESSED); + seat->kbd.xkb_state, seat->kbd.mod_alt, XKB_STATE_MODS_EFFECTIVE); seat->kbd.ctrl = xkb_state_mod_index_is_active( - seat->kbd.xkb_state, seat->kbd.mod_ctrl, XKB_STATE_MODS_DEPRESSED); + seat->kbd.xkb_state, seat->kbd.mod_ctrl, XKB_STATE_MODS_EFFECTIVE); seat->kbd.meta = xkb_state_mod_index_is_active( - seat->kbd.xkb_state, seat->kbd.mod_meta, XKB_STATE_MODS_DEPRESSED); + seat->kbd.xkb_state, seat->kbd.mod_meta, XKB_STATE_MODS_EFFECTIVE); } if (seat->kbd_focus && seat->kbd_focus->active_surface == TERM_SURF_GRID) @@ -1953,7 +1953,7 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer, /* Seat has keyboard - use mouse bindings *with* modifiers */ xkb_mod_mask_t mods = xkb_state_serialize_mods( - seat->kbd.xkb_state, XKB_STATE_MODS_DEPRESSED); + seat->kbd.xkb_state, XKB_STATE_MODS_EFFECTIVE); /* Ignore Shift when matching modifiers, since it is * used to enable selection in mouse grabbing client