Introduction
Introduction Statistics Contact Development Disclaimer Help
Fix SIGTERM handler - flip terminate flag in sigterm handler & cleanup properly…
git clone git://git.suckless.org/svkbd
Log
Files
Refs
README
LICENSE
---
commit 819f92950e14ca01e097fccfbf47f0039ccf4d90
parent e6e716202bb928b4105c870952b219a553af99ae
Author: Miles Alan <[email protected]>
Date: Sun, 2 Aug 2020 15:46:09 +0200
Fix SIGTERM handler - flip terminate flag in sigterm handler & cleanup properly
Modify run function to use select() with a timeout since X events will be
blocked otherwise and terminate wouldn't apply for a while.
Diffstat:
M svkbd.c | 47 +++++++++++++++++++++--------…
1 file changed, 32 insertions(+), 15 deletions(-)
---
diff --git a/svkbd.c b/svkbd.c
@@ -14,6 +14,8 @@
#include <X11/Xproto.h>
#include <X11/extensions/XTest.h>
#include <signal.h>
+#include <sys/select.h>
+
/* macros */
#define MAX(a, b) ((a) > (b) ? (a) : (b))
@@ -97,10 +99,10 @@ static Bool running = True, isdock = False;
static KeySym pressedmod = 0;
static int rows = 0, ww = 0, wh = 0, wx = 0, wy = 0;
static char *name = "svkbd";
-static int terminate = 0;
Bool ispressing = False;
Bool baselayer = True;
+Bool sigtermd = False;
/* configuration, allows nested code to access above variables */
#include "config.h"
@@ -188,6 +190,21 @@ buttonrelease(XEvent *e) {
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) {
+ for (i = 0; i < LENGTH(keys); i++) {
+ XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, keys[i].k…
+ }
+ }
+ XSync(dpy, False);
+
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
else
@@ -438,13 +455,21 @@ unpress(Key *k, KeySym mod) {
void
run(void) {
XEvent ev;
-
- /* main event loop */
- XSync(dpy, False);
- while(running) {
+ int xfd;
+ fd_set fds;
+ struct timeval tv;
+
+ xfd = ConnectionNumber(dpy);
+ FD_ZERO(&fds);
+ FD_SET(xfd, &fds);
+ tv.tv_usec = 0;
+ tv.tv_sec = 1;
+ while (running) {
+ select(xfd + 1, &fds, NULL, NULL, &tv);
XNextEvent(dpy, &ev);
- if(handler[ev.type])
+ if(handler[ev.type]) {
(handler[ev.type])(&ev); /* call handler */
+ }
}
}
@@ -597,16 +622,8 @@ togglelayer() {
void
sigterm(int sig)
{
- // E.g. Since sometimes we might use svkbd, to kill svkbd - e.g. in
- // terminal or script (pkill svkbd), .. that signal might register bef…
- // the keyup event is processed so X thinks the key is held down forev…
- // so here we keyup every key & exit (XK_Break) to keyup cleanup prope…
- int i;
- for(i = 0; i < LENGTH(keys); i++) {
- XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, keys[i].keysym), False,…
- }
running = False;
- //XTestFakeKeyEvent(dpy, XK_Break, False, 0);
+ sigtermd = True;
}
int
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.