diff options
Diffstat (limited to 'marsond.c')
| -rw-r--r-- | marsond.c | 42 |
1 files changed, 32 insertions, 10 deletions
@@ -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); |
