aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Jamison <jackqjamison@gmail.com>2025-10-12 00:11:33 -0400
committerJack Jamison <jackqjamison@gmail.com>2025-10-12 00:11:33 -0400
commitd58f2e870b8f998262609b98f91d290b65ab80d3 (patch)
treeacb51286dc7855396e64c228f0fd0a968d41e851
parent60585faf7951cffb6046280bdd5f91275fb97d65 (diff)
improved key repeat
-rw-r--r--input_field.c11
-rw-r--r--input_field.h3
-rw-r--r--keyboard.c26
3 files changed, 22 insertions, 18 deletions
diff --git a/input_field.c b/input_field.c
index 026a22c..114019a 100644
--- a/input_field.c
+++ b/input_field.c
@@ -3,7 +3,7 @@
#include "input_field.h"
#include "array.h"
-void type_key(client_state* state, xkb_keysym_t keysym) {
+bool type_key(client_state* state, xkb_keysym_t keysym) {
bool ctrl = xkb_state_mod_name_is_active(state->xkb_state, XKB_MOD_NAME_CTRL, XKB_STATE_MODS_EFFECTIVE);
// exit app
@@ -12,13 +12,13 @@ void type_key(client_state* state, xkb_keysym_t keysym) {
(keysym == XKB_KEY_Escape)) {
state->running = false;
- return;
+ return false;
}
// submit line
if (keysym == XKB_KEY_Return || keysym == XKB_KEY_KP_Enter) {
submit_line(state);
- return;
+ return false;
}
// delete
@@ -28,7 +28,7 @@ void type_key(client_state* state, xkb_keysym_t keysym) {
} else {
array_pop(state->input_buffer);
}
- return;
+ return true;
}
// type char into buffer
@@ -38,7 +38,10 @@ void type_key(client_state* state, xkb_keysym_t keysym) {
for (int i = 0; i < strlen(buf); i++) {
array_add(state->input_buffer, buf[i]);
}
+ return true;
}
+
+ return false;
}
void submit_line(client_state* state) {
diff --git a/input_field.h b/input_field.h
index 64cb557..f3379d4 100644
--- a/input_field.h
+++ b/input_field.h
@@ -3,7 +3,8 @@
#include "state.h"
-void type_key(client_state* state, xkb_keysym_t keysym);
+// returns true if the key should repeat
+bool type_key(client_state* state, xkb_keysym_t keysym);
void submit_line(client_state* state);
#endif
diff --git a/keyboard.c b/keyboard.c
index 3be61a9..5460570 100644
--- a/keyboard.c
+++ b/keyboard.c
@@ -79,19 +79,19 @@ void wl_keyboard_key(void *data, struct wl_keyboard *wl_keyboard,
xkb_keysym_t keysym = xkb_state_key_get_one_sym(state->xkb_state, key + 8);
if (key_state == WL_KEYBOARD_KEY_STATE_PRESSED) {
- type_key(state, keysym);
-
- // start repeat
- state->repeat_key = keysym;
- struct itimerspec timer = {0};
- if (state->key_repeat_rate > 1)
- timer.it_interval.tv_nsec = 1000000000 / state->key_repeat_rate;
- else
- timer.it_interval.tv_sec = 1;
- timer.it_value.tv_sec = state->key_repeat_delay / 1000;
- timer.it_value.tv_nsec = (state->key_repeat_delay % 1000) * 1000000;
- if (timerfd_settime(state->key_repeat_timer_fd, 0, &timer, NULL) == -1) {
- printf("error setting key repeat timer\n");
+ if(type_key(state, keysym)) {
+ // start repeat
+ state->repeat_key = keysym;
+ struct itimerspec timer = {0};
+ if (state->key_repeat_rate > 1)
+ timer.it_interval.tv_nsec = 1000000000 / state->key_repeat_rate;
+ else
+ timer.it_interval.tv_sec = 1;
+ timer.it_value.tv_sec = state->key_repeat_delay / 1000;
+ timer.it_value.tv_nsec = (state->key_repeat_delay % 1000) * 1000000;
+ if (timerfd_settime(state->key_repeat_timer_fd, 0, &timer, NULL) == -1) {
+ printf("error setting key repeat timer\n");
+ }
}
} else if (key_state == WL_KEYBOARD_KEY_STATE_RELEASED) {