summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
-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;