diff options
| author | Sam Nystrom <sam@samnystrom.dev> | 2024-02-04 11:13:42 -0500 |
|---|---|---|
| committer | Sam Nystrom <sam@samnystrom.dev> | 2024-02-04 11:13:42 -0500 |
| commit | aac5f61dab661d1c14ec62d1464c88a701641a5f (patch) | |
| tree | 0eac099b46bc27e4add5ced37dbfa2f17b67df38 | |
| parent | dc26126e47d4c2a9cd367a3998b819280ba26794 (diff) | |
bin/capsremap: fix mapping logic
| -rw-r--r-- | bin/capsremap.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/bin/capsremap.c b/bin/capsremap.c index 284eadd..8a78f4b 100644 --- a/bin/capsremap.c +++ b/bin/capsremap.c @@ -40,6 +40,10 @@ int main(int argc, char** argv) { enum { START, CAPSLOCK_HELD, CAPSLOCK_IS_MODIFIER } state = START; + // Handle cases where caps lock is released before hjkl is released so + // the subsequent hjkl release is properly rewritten as an arrow key + int down_key = KEY_RESERVED; + struct input_event event; while (fread(&event, sizeof(event), 1, stdin) == 1) { if (event.type == EV_MSC && event.code == MSC_SCAN) { @@ -55,6 +59,10 @@ int main(int argc, char** argv) { if (event.type == EV_KEY && event.code == KEY_CAPSLOCK && event.value) { state = CAPSLOCK_HELD; } else { + if (event.type == EV_KEY && event.code == down_key && event.value == 0) { + hjkl_to_arrow(&event); + down_key = KEY_RESERVED; + } fwrite(&event, sizeof(event), 1, stdout); } break; @@ -67,11 +75,16 @@ int main(int argc, char** argv) { fwrite(&esc_up, sizeof(esc_up), 1, stdout); state = START; } - } else if (event.type == EV_KEY && event.value) { - hjkl_to_arrow(&event); - fwrite(&event, sizeof(event), 1, stdout); - state = CAPSLOCK_IS_MODIFIER; } else { + if (event.type == EV_KEY && event.value) { + down_key = event.code; + hjkl_to_arrow(&event); + state = CAPSLOCK_IS_MODIFIER; + } + if (event.type == EV_KEY && event.code == down_key && event.value == 0) { + down_key = KEY_RESERVED; + hjkl_to_arrow(&event); + } fwrite(&event, sizeof(event), 1, stdout); } break; @@ -81,7 +94,14 @@ int main(int argc, char** argv) { state = START; } } else { - hjkl_to_arrow(&event); + if (event.type == EV_KEY && event.value) { + down_key = event.code; + hjkl_to_arrow(&event); + } + if (event.type == EV_KEY && event.code == down_key && event.value == 0) { + down_key = KEY_RESERVED; + hjkl_to_arrow(&event); + } fwrite(&event, sizeof(event), 1, stdout); } break; |
