aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrsfnrrg <frsfnrrg@users.noreply.github.com>2018-07-29 18:50:20 -0400
committerfrsfnrrg <frsfnrrg@users.noreply.github.com>2018-07-29 19:15:10 -0400
commit8dbbfa5965ca8bfe4bc023100387dd657bafe48e (patch)
tree53bf8301475a9250c2e5ebaa131086ede883ffc5
parente33dfbfa758fb899c276135d06f25359ceee0002 (diff)
downloadsway-8dbbfa5965ca8bfe4bc023100387dd657bafe48e.tar.xz
Bindings use advised keyboard repeat parameters
Now 'repeat_delay' and 'repeat_rate' control the initial delay and rate (per second) of repeated binding invocations. If the repeat delay is zero, binding repetition is disabled. When the repeat rate is zero, the binding is repeated exactly once, assuming no other key events intervene.
-rw-r--r--include/sway/input/keyboard.h2
-rw-r--r--sway/input/keyboard.c18
2 files changed, 10 insertions, 10 deletions
diff --git a/include/sway/input/keyboard.h b/include/sway/input/keyboard.h
index 660cdc9c..6d28454c 100644
--- a/include/sway/input/keyboard.h
+++ b/include/sway/input/keyboard.h
@@ -41,8 +41,6 @@ struct sway_keyboard {
struct wl_event_source *key_repeat_source;
struct sway_binding *repeat_binding;
- int key_repeat_initial_delay; // first key repeat event delay, in ms
- int key_repeat_step_delay; // subsequent repeat delay, in ms
};
struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index be000fb9..160ef10b 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -285,10 +285,10 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) {
}
// Set up (or clear) keyboard repeat for a pressed binding
- if (next_repeat_binding) {
+ if (next_repeat_binding && wlr_device->keyboard->repeat_info.delay > 0) {
keyboard->repeat_binding = next_repeat_binding;
if (wl_event_source_timer_update(keyboard->key_repeat_source,
- keyboard->key_repeat_initial_delay) < 0) {
+ wlr_device->keyboard->repeat_info.delay) < 0) {
wlr_log(WLR_DEBUG, "failed to set key repeat timer");
}
} else if (keyboard->repeat_binding) {
@@ -321,11 +321,15 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) {
static int handle_keyboard_repeat(void *data) {
struct sway_keyboard *keyboard = (struct sway_keyboard *)data;
+ struct wlr_keyboard *wlr_device =
+ keyboard->seat_device->input_device->wlr_device->keyboard;
if (keyboard->repeat_binding) {
- // We queue the next event first, as the command might cancel it
- if (wl_event_source_timer_update(keyboard->key_repeat_source,
- keyboard->key_repeat_step_delay) < 0) {
- wlr_log(WLR_DEBUG, "failed to update key repeat timer");
+ if (wlr_device->repeat_info.rate > 0) {
+ // We queue the next event first, as the command might cancel it
+ if (wl_event_source_timer_update(keyboard->key_repeat_source,
+ 1000 / wlr_device->repeat_info.rate) < 0) {
+ wlr_log(WLR_DEBUG, "failed to update key repeat timer");
+ }
}
seat_execute_command(keyboard->seat_device->sway_seat,
@@ -362,8 +366,6 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
keyboard->key_repeat_source = wl_event_loop_add_timer(server.wl_event_loop,
handle_keyboard_repeat, keyboard);
- keyboard->key_repeat_initial_delay = 660;
- keyboard->key_repeat_step_delay = 40;
return keyboard;
}