mirror of
https://github.com/swaywm/sway.git
synced 2024-11-29 03:11:27 +00:00
Merge pull request #3021 from Snaipe/singlekey-binding-trigger
binding: match single-key bindings if no multi-key binding matched
This commit is contained in:
commit
c18cd9dd03
|
@ -24,6 +24,7 @@ struct sway_shortcut_state {
|
||||||
uint32_t last_keycode;
|
uint32_t last_keycode;
|
||||||
uint32_t last_raw_modifiers;
|
uint32_t last_raw_modifiers;
|
||||||
size_t npressed;
|
size_t npressed;
|
||||||
|
uint32_t current_key;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sway_keyboard {
|
struct sway_keyboard {
|
||||||
|
|
|
@ -32,6 +32,7 @@ static void state_erase_key(struct sway_shortcut_state *state,
|
||||||
state->pressed_keys[state->npressed] = 0;
|
state->pressed_keys[state->npressed] = 0;
|
||||||
state->pressed_keycodes[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_keys[i] = key_id;
|
||||||
state->pressed_keycodes[i] = keycode;
|
state->pressed_keycodes[i] = keycode;
|
||||||
state->npressed++;
|
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;
|
bool binding_release = binding->flags & BINDING_RELEASE;
|
||||||
|
|
||||||
if (modifiers ^ binding->modifiers ||
|
if (modifiers ^ binding->modifiers ||
|
||||||
state->npressed != (size_t)binding->keys->length ||
|
|
||||||
release != binding_release ||
|
release != binding_release ||
|
||||||
locked > binding_locked ||
|
locked > binding_locked ||
|
||||||
(strcmp(binding->input, input) != 0 &&
|
(strcmp(binding->input, input) != 0 &&
|
||||||
|
@ -102,13 +103,22 @@ static void get_active_binding(const struct sway_shortcut_state *state,
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool match = true;
|
bool match = false;
|
||||||
for (size_t j = 0; j < state->npressed; j++) {
|
if (state->npressed == (size_t)binding->keys->length) {
|
||||||
uint32_t key = *(uint32_t *)binding->keys->items[j];
|
match = true;
|
||||||
if (key != state->pressed_keys[j]) {
|
for (size_t j = 0; j < state->npressed; j++) {
|
||||||
match = false;
|
uint32_t key = *(uint32_t *)binding->keys->items[j];
|
||||||
break;
|
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) {
|
if (!match) {
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Reference in a new issue