summaryrefslogtreecommitdiff
path: root/bin/capsremap.c
diff options
context:
space:
mode:
authorSam Nystrom <sam@samnystrom.dev>2024-02-04 11:13:42 -0500
committerSam Nystrom <sam@samnystrom.dev>2024-02-04 11:13:42 -0500
commitaac5f61dab661d1c14ec62d1464c88a701641a5f (patch)
tree0eac099b46bc27e4add5ced37dbfa2f17b67df38 /bin/capsremap.c
parentdc26126e47d4c2a9cd367a3998b819280ba26794 (diff)
bin/capsremap: fix mapping logic
Diffstat (limited to 'bin/capsremap.c')
-rw-r--r--bin/capsremap.c30
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;