svkbd

simple virtual keyboard
git clone git://git.suckless.org/svkbd
Log | Files | Refs | README | LICENSE

commit eae90f28d998af064ec163074a026a585ccb6417
parent 12fe4c89234fcd4172fceead572b1950815228af
Author: Maarten van Gompel <proycon@anaproy.nl>
Date:   Sun,  2 Aug 2020 15:46:18 +0200

fixed the select() logic in run() to handle sigterm situations

Diffstat:
Msvkbd.c | 40++++++++++++++++++----------------------
1 file changed, 18 insertions(+), 22 deletions(-)

diff --git a/svkbd.c b/svkbd.c @@ -208,27 +208,6 @@ void cleanup(void) { int i; - // E.g. Generally in scripts we call SIGTERM on svkbd in which case - // if the user is holding for example the enter key (to execute - // the kill or script that does the kill), that causes an issue - // since then X doesn't know the keyup is never coming.. (since - // process will be dead before finger lifts - in that case we - // just trigger out fake up presses for all keys - if (sigtermd) { - //handle last pending events - XEvent ev; - while (XPending(dpy)) { - XNextEvent(dpy, &ev); - if(handler[ev.type]) { - (handler[ev.type])(&ev); /* call handler */ - } - } - if (debug) { printf("Cleanup: simulating key release\n"); fflush(stdout); } - for (i = 0; i < numkeys; i++) { - XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, keys[i].keysym), False, 0); - } - } - for (i = 0; i < SchemeLast; i++) free(scheme[i]); drw_sync(drw); @@ -542,6 +521,7 @@ run(void) { fd_set fds; struct timeval tv; double duration = 0.0; + int i, r; xfd = ConnectionNumber(dpy); @@ -556,7 +536,8 @@ run(void) { usleep(100000L); FD_ZERO(&fds); FD_SET(xfd, &fds); - if (select(xfd + 1, &fds, NULL, NULL, &tv)) { + r = select(xfd + 1, &fds, NULL, NULL, &tv); + if (r) { while (XPending(dpy)) { XNextEvent(dpy, &ev); if(handler[ev.type]) { @@ -564,6 +545,7 @@ run(void) { } } } else { + //time-out expired without anything interesting happening, check for long-presses if (ispressing && ispressingkeysym) { duration = get_press_duration(); if (debug == 2) { printf("%f\n", duration); fflush(stdout); } @@ -576,6 +558,20 @@ run(void) { } } } + if (r == -1 || sigtermd) { + // an error occurred or we received a signal + // E.g. Generally in scripts we want to call SIGTERM on svkbd in which case + // if the user is holding for example the enter key (to execute + // the kill or script that does the kill), that causes an issue + // since then X doesn't know the keyup is never coming.. (since + // process will be dead before finger lifts - in that case we + // just trigger out fake up presses for all keys + if (debug) { printf("signal received, releasing all keys"); fflush(stdout); } + for (i = 0; i < numkeys; i++) { + XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, keys[i].keysym), False, 0); + } + running = False; + } } }