aboutsummaryrefslogtreecommitdiff
path: root/marsond.c
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2026-01-05 18:30:08 -0500
committerB. Watson <urchlay@slackware.uk>2026-01-05 18:30:08 -0500
commita089029d7dad58b59825f1644da36416a55ef757 (patch)
tree21e86cb6511ad97961e57bd9afbbe74fedb58cd4 /marsond.c
parenta2efec71b505f0273a1df980e42a851053e3a0e7 (diff)
downloadmarsond-a089029d7dad58b59825f1644da36416a55ef757.tar.gz
Workaround for Shift/Enter timing problem.
Diffstat (limited to 'marsond.c')
-rw-r--r--marsond.c42
1 files changed, 32 insertions, 10 deletions
diff --git a/marsond.c b/marsond.c
index 3a50404..7aeb52d 100644
--- a/marsond.c
+++ b/marsond.c
@@ -319,10 +319,20 @@ void print_device_name(void) {
debug("virtual keyboard device node: %s", name);
}
+void write_event(struct input_event *ev) {
+ if(write(outfd, ev, sizeof(*ev)) < 0) {
+ if(foreground) {
+ die("write to /dev/uinput failed: %s", strerror(errno));
+ } else {
+ exit(1);
+ }
+ }
+}
+
int main(int argc, char **argv) {
- int i;
+ int i, was_shift = 0;
struct uinput_user_dev dev;
- struct input_event ev;
+ struct input_event ev, shift_release;
set_self(argv[0]);
@@ -420,10 +430,28 @@ int main(int argc, char **argv) {
}
if(foreground) {
- debug("got event: type %d, code %d, value %d",
+ debug("got event: type %d, code 0x%02x, value %d",
ev.type, ev.code, ev.value);
}
+ if(ev.type == EV_KEY && ev.code == KEY_RIGHTSHIFT) {
+ was_shift = ev.value;
+ }
+
+ if(ev.type == EV_KEY && ev.code == KEY_ENTER && ev.value == 1) {
+ if(was_shift) {
+ if(foreground) {
+ debug("!!! got Enter keypress with was_shift==1, sending "
+ "Shift key release before Enter keypress");
+ }
+ memcpy(&shift_release, &ev, sizeof(ev));
+ shift_release.code = KEY_RIGHTSHIFT;
+ shift_release.value = 0;
+ write_event(&shift_release);
+ was_shift = 0;
+ }
+ }
+
/* value == 0 means key release (a 1 would be a press) */
if(ev.type == EV_KEY && ev.code == KEY_ENTER && ev.value == 0) {
if(foreground) {
@@ -432,13 +460,7 @@ int main(int argc, char **argv) {
usleep(delay_ms * 1000);
}
- if(write(outfd, &ev, sizeof(ev)) < 0) {
- if(foreground) {
- die("write to /dev/uinput failed: %s", strerror(errno));
- } else {
- exit(1);
- }
- }
+ write_event(&ev);
}
exit(1);