input: mouse: match binding if binding’s click count is *less*

Allow a mouse binding to match even if its click count is less than
the actual click count.

If there are multiple bindings that match, use the one with the
highest click count (that less than, or equal to the actual click
count).

Closes #146
This commit is contained in:
Daniel Eklöf 2020-09-27 14:31:39 +02:00
parent d263cb9723
commit 6a089c92ca
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
2 changed files with 25 additions and 6 deletions

View file

@ -20,6 +20,13 @@
### Deprecated
### Removed
### Fixed
* Mouse bindings now match even if the actual click count is larger
than specified in the binding. This allows you to, for example,
quickly press the middle-button to paste multiple times
(https://codeberg.org/dnkl/foot/issues/146).
### Security
### Contributors

24
input.c
View file

@ -1526,6 +1526,8 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
* applications */
mods &= ~(1 << seat->kbd.mod_shift);
const struct mouse_binding *match = NULL;
tll_foreach(seat->mouse.bindings, it) {
const struct mouse_binding *binding = &it->item;
@ -1539,19 +1541,25 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
continue;
}
if (binding->count != seat->mouse.count) {
if (binding->count > seat->mouse.count) {
/* Not correct click count */
continue;
}
if (match == NULL || binding->count > match->count)
match = binding;
}
if (match != NULL) {
seat->mouse.consumed = execute_binding(
seat, term, binding->action, NULL, serial);
break;
seat, term, match->action, NULL, serial);
}
}
else {
/* Seat does NOT have a keyboard - use mouse bindings *without* modifiers */
const struct config_mouse_binding *match = NULL;
tll_foreach(seat->wayl->conf->bindings.mouse, it) {
const struct config_mouse_binding *binding = &it->item;
@ -1560,7 +1568,7 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
continue;
}
if (binding->count != seat->mouse.count) {
if (binding->count > seat->mouse.count) {
/* Incorrect click count */
continue;
}
@ -1571,9 +1579,13 @@ wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
continue;
}
if (match == NULL || binding->count > match->count)
match = binding;
}
if (match != NULL) {
seat->mouse.consumed = execute_binding(
seat, term, binding->action, NULL, serial);
break;
seat, term, match->action, NULL, serial);
}
}