diff options
author | Franklin "Snaipe" Mathieu <me@snai.pe> | 2018-10-29 12:25:15 +0000 |
---|---|---|
committer | Franklin "Snaipe" Mathieu <me@snai.pe> | 2018-10-29 13:04:19 +0000 |
commit | f8e83ee20aee1f583378b50040445c38eae91f24 (patch) | |
tree | f0bdf5c13d00edfcfa8c4c4803c40d2d675076fa /sway/input/keyboard.c | |
parent | 1e8e7e16e73cb3c633cf52fbe5bc9c625e4cd029 (diff) |
binding: match single-key bindings if no multi-key binding matched
This makes bindings more snappy when the user is typing faster than
his keycaps are releasing.
Signed-off-by: Franklin "Snaipe" Mathieu <me@snai.pe>
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r-- | sway/input/keyboard.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 5c1e7ae6..c1b53237 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -32,6 +32,7 @@ static void state_erase_key(struct sway_shortcut_state *state, state->pressed_keys[state->npressed] = 0; state->pressed_keycodes[state->npressed] = 0; } + state->current_key = 0; } /** @@ -56,6 +57,7 @@ static void state_add_key(struct sway_shortcut_state *state, state->pressed_keys[i] = key_id; state->pressed_keycodes[i] = keycode; state->npressed++; + state->current_key = key_id; } /** @@ -94,7 +96,6 @@ static void get_active_binding(const struct sway_shortcut_state *state, bool binding_release = binding->flags & BINDING_RELEASE; if (modifiers ^ binding->modifiers || - state->npressed != (size_t)binding->keys->length || release != binding_release || locked > binding_locked || (strcmp(binding->input, input) != 0 && @@ -102,13 +103,22 @@ static void get_active_binding(const struct sway_shortcut_state *state, continue; } - bool match = true; - for (size_t j = 0; j < state->npressed; j++) { - uint32_t key = *(uint32_t *)binding->keys->items[j]; - if (key != state->pressed_keys[j]) { - match = false; - break; + bool match = false; + if (state->npressed == (size_t)binding->keys->length) { + match = true; + for (size_t j = 0; j < state->npressed; j++) { + uint32_t key = *(uint32_t *)binding->keys->items[j]; + if (key != state->pressed_keys[j]) { + match = false; + break; + } } + } else if (binding->keys->length == 1) { + /* + * If no multiple-key binding has matched, try looking for + * single-key bindings that match the newly-pressed key. + */ + match = state->current_key == *(uint32_t *)binding->keys->items[0]; } if (!match) { continue; |