input: match unshifted key-bindings before shifted

That is, try to match e.g. Control+shift+a, before trying to match
Control+A.

In most cases, order doesn't matter. There are however a couple of
symbols where the layout consumes the shift-modifier, and the
generated symbol is the same in both the shifted and unshifted
form. One such example is backspace.

Before this patch, key-bindings with shift-backspace would be ignored,
if there were another key-binding with backspace.

So, for example, if we had one key-binding with Control+Backspace, and
another with Control+Shift+Backspace, the latter would never trigger,
as we would always match the first one.

By checking for unshifted matches first, we ensure
Control+Shift+Backspace does match.
This commit is contained in:
Daniel Eklöf 2025-01-31 09:07:42 +01:00
parent bee17a95b8
commit 51128a3484
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
3 changed files with 42 additions and 42 deletions

24
input.c
View file

@ -1584,18 +1584,6 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial,
* User configurable bindings
*/
if (pressed) {
/* Match translated symbol */
tll_foreach(bindings->key, it) {
const struct key_binding *bind = &it->item;
if (bind->k.sym == sym &&
bind->mods == (mods & ~consumed) &&
execute_binding(seat, term, bind, serial, 1))
{
goto maybe_repeat;
}
}
/* Match untranslated symbols */
tll_foreach(bindings->key, it) {
const struct key_binding *bind = &it->item;
@ -1612,6 +1600,18 @@ key_press_release(struct seat *seat, struct terminal *term, uint32_t serial,
}
}
/* Match translated symbol */
tll_foreach(bindings->key, it) {
const struct key_binding *bind = &it->item;
if (bind->k.sym == sym &&
bind->mods == (mods & ~consumed) &&
execute_binding(seat, term, bind, serial, 1))
{
goto maybe_repeat;
}
}
/* Match raw key code */
tll_foreach(bindings->key, it) {
const struct key_binding *bind = &it->item;