aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorLinus Heckemann <git@sphalerite.org>2020-03-23 12:34:04 +0100
committerSimon Ser <contact@emersion.fr>2020-03-30 14:18:27 +0200
commitdf48c48123de88a91362844881fa20eddc30f597 (patch)
tree307ec481503f0090519565dbf2c22b14e66ab5c0 /sway
parent5e41e6600beb7e80b5c621021e0b61a2a1dc0ac0 (diff)
downloadsway-df48c48123de88a91362844881fa20eddc30f597.tar.xz
add --no-repeat option for bindings
This allows e.g. triggering one command while a key is held, then triggering another to undo the change performed by it afterwards. One use case for this is triggering push-to-talk functionality for VoIP tools without granting them full access to all input events. Fixes #3151
Diffstat (limited to 'sway')
-rw-r--r--sway/commands/bind.c2
-rw-r--r--sway/input/keyboard.c3
-rw-r--r--sway/sway.5.scd6
3 files changed, 9 insertions, 2 deletions
diff --git a/sway/commands/bind.c b/sway/commands/bind.c
index c86c39dd..4e49982a 100644
--- a/sway/commands/bind.c
+++ b/sway/commands/bind.c
@@ -373,6 +373,8 @@ static struct cmd_results *cmd_bindsym_or_bindcode(int argc, char **argv,
binding->input = strdup(argv[0] + strlen("--input-device="));
} else if (strcmp("--no-warn", argv[0]) == 0) {
warn = false;
+ } else if (strcmp("--no-repeat", argv[0]) == 0) {
+ binding->flags |= BINDING_NOREPEAT;
} else {
break;
}
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index 9c5f190e..30756acb 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -431,7 +431,8 @@ static void handle_key_event(struct sway_keyboard *keyboard,
// Set up (or clear) keyboard repeat for a pressed binding. Since the
// binding may remove the keyboard, the timer needs to be updated first
- if (binding && wlr_device->keyboard->repeat_info.delay > 0) {
+ if (binding && !(binding->flags & BINDING_NOREPEAT) &&
+ wlr_device->keyboard->repeat_info.delay > 0) {
keyboard->repeat_binding = binding;
if (wl_event_source_timer_update(keyboard->key_repeat_source,
wlr_device->keyboard->repeat_info.delay) < 0) {
diff --git a/sway/sway.5.scd b/sway/sway.5.scd
index c9daba5d..1c396dfb 100644
--- a/sway/sway.5.scd
+++ b/sway/sway.5.scd
@@ -356,7 +356,7 @@ runtime.
for_window <criteria> move container to output <output>
*bindsym* [--whole-window] [--border] [--exclude-titlebar] [--release] [--locked] \
-[--to-code] [--input-device=<device>] [--no-warn] [Group<1-4>+]<key combo> \
+[--to-code] [--input-device=<device>] [--no-warn] [--no-repeat] [Group<1-4>+]<key combo> \
<command>
Binds _key combo_ to execute the sway command _command_ when pressed. You
may use XKB key names here (*xev*(1) is a good tool for discovering these).
@@ -382,6 +382,10 @@ runtime.
define bindings which will be exempt from pass-through to such
software. The same preference logic as for _--locked_ applies.
+ Unless the flag _--no-repeat_ is set, the command will be run
+ repeatedly when the key is held, according to the repeat
+ settings specified in the input configuration.
+
Bindings to keysyms are layout-dependent. This can be changed with the
_--to-code_ flag. In this case, the keysyms will be translated into the
corresponding keycodes in the first configured layout.