URI: 
       cleaned up code style, fixed buffer overflow in layers configuration, added a printdbg function. - svkbd - simple virtual keyboard
  HTML git clone git://git.suckless.org/svkbd
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 3d03b522e04f94e384aa9b7d87117a20b7ae0268
   DIR parent 8219b6b9d1e86db5f965d94be8c6fdaea1a2b6d1
  HTML Author: Maarten van Gompel <proycon@anaproy.nl>
       Date:   Sun,  2 Aug 2020 20:57:06 +0200
       
       cleaned up code style, fixed buffer overflow in layers configuration, added a printdbg function.
       
       Diffstat:
         M svkbd.c                             |     102 +++++++++++++++++--------------
       
       1 file changed, 55 insertions(+), 47 deletions(-)
       ---
   DIR diff --git a/svkbd.c b/svkbd.c
       @@ -57,6 +57,7 @@ typedef struct {
        } Buttonmod;
        
        /* function declarations */
       +static void printdbg(const char * fmt, ...);
        static void motionnotify(XEvent *e);
        static void buttonpress(XEvent *e);
        static void buttonrelease(XEvent *e);
       @@ -103,9 +104,9 @@ static KeySym pressedmod = 0;
        static struct timeval pressbegin;
        static int currentlayer = 0;
        static int enableoverlays = 1;
       -static int currentoverlay = -1; // -1 = no overlay
       -static KeySym overlaykeysym = 0; //keysym for which the overlay is presented
       -static int releaseprotect = 0; //set to 1 after overlay is shown, protecting against immediate release
       +static int currentoverlay = -1; /* -1 = no overlay */
       +static KeySym overlaykeysym = 0; /* keysym for which the overlay is presented */
       +static int releaseprotect = 0; /* set to 1 after overlay is shown, protecting against immediate release */
        static int tmp_keycode = 1;
        static int rows = 0, ww = 0, wh = 0, wx = 0, wy = 0;
        static char *name = "svkbd";
       @@ -348,7 +349,7 @@ leavenotify(XEvent *e) {
        }
        
        void record_press_begin(KeySym ks) {
       -        //record the begin of the press, don't simulate the actual keypress yet
       +        /* record the begin of the press, don't simulate the actual keypress yet */
                gettimeofday(&pressbegin, NULL);
                ispressingkeysym = ks;
        }
       @@ -359,7 +360,7 @@ press(Key *k, KeySym mod) {
                int overlayidx = -1;
                k->pressed = !k->pressed;
        
       -        if (debug) { printf("Begin press: %ld\n", k->keysym); fflush(stdout); }
       +        if (debug) printdbg("Begin press: %ld\n", k->keysym);
                pressbegin.tv_sec = 0;
                pressbegin.tv_usec = 0;
                ispressingkeysym = 0;
       @@ -369,11 +370,11 @@ press(Key *k, KeySym mod) {
                                overlayidx = hasoverlay(k->keysym);
                        if (enableoverlays && overlayidx != -1) {
                                if (!pressbegin.tv_sec && !pressbegin.tv_usec) {
       -                                //record the begin of the press, don't simulate the actual keypress yet
       +                                /*record the begin of the press, don't simulate the actual keypress yet */
                                        record_press_begin(k->keysym);
                                }
                        } else {
       -                        if (debug) { printf("Simulating press: %ld\n", k->keysym); fflush(stdout); }
       +                        if (debug) printdbg("Simulating press: %ld\n", k->keysym);
                                for(i = 0; i < numkeys; i++) {
                                        if(keys[i].pressed && IsModifierKey(keys[i].keysym)) {
                                                simulate_keypress(keys[i].keysym);
       @@ -454,8 +455,8 @@ unpress(Key *k, KeySym mod) {
                if ((pressbegin.tv_sec || pressbegin.tv_usec) && enableoverlays && k && k->keysym == ispressingkeysym) {
                        if (currentoverlay == -1) {
                                if (get_press_duration() < overlay_delay) {
       -                                if (debug) { printf("Delayed simulation of press after release: %ld\n", k->keysym); fflush(stdout); }
       -                                //simulate the press event, as we postponed it earlier in press()
       +                                if (debug) printdbg("Delayed simulation of press after release: %ld\n", k->keysym);
       +                                /* simulate the press event, as we postponed it earlier in press() */
                                        for(i = 0; i < numkeys; i++) {
                                                if(keys[i].pressed && IsModifierKey(keys[i].keysym)) {
                                                        simulate_keypress(keys[i].keysym);
       @@ -476,9 +477,9 @@ unpress(Key *k, KeySym mod) {
        
                if (debug) {
                        if (k) {
       -                        printf("Simulation of release: %ld\n", k->keysym); fflush(stdout);
       +                        printdbg("Simulation of release: %ld\n", k->keysym);
                        } else {
       -                        printf("Simulation of release (all keys)\n"); fflush(stdout);
       +                        printdbg("Simulation of release (all keys)\n");
                        }
                }
        
       @@ -530,7 +531,6 @@ run(void) {
                tv.tv_sec = 1;
        
        
       -        //XSync(dpy, False);
                XFlush(dpy);
        
                while (running) {
       @@ -546,12 +546,12 @@ run(void) {
                                        }
                                }
                        } else {
       -                        //time-out expired without anything interesting happening, check for long-presses
       +                        /* 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); }
       +                                if (debug == 2) printdbg("%f\n", duration);
                                        if (get_press_duration() >= overlay_delay) {
       -                                        if (debug) { printf("press duration %f\n", duration); fflush(stdout); }
       +                                        if (debug) printdbg("press duration %f\n", duration);
                                                showoverlay(hasoverlay(ispressingkeysym));
                                                pressbegin.tv_sec = 0;
                                                pressbegin.tv_usec = 0;
       @@ -559,20 +559,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;
       -        }
       +                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) printdbg("signal received, releasing all keys");
       +                        for (i = 0; i < numkeys; i++) {
       +                                XTestFakeKeyEvent(dpy, XKeysymToKeycode(dpy, keys[i].keysym), False, 0);
       +                        }
       +                        running = False;
       +                }
                }
        }
        
       @@ -610,7 +610,7 @@ setup(void) {
                        die("no fonts could be loaded.");
                drw_setscheme(drw, scheme[SchemeNorm]);
        
       -        //find an unused keycode to use as a temporary keycode (derived from source: https://stackoverflow.com/questions/44313966/c-xtest-emitting-key-presses-for-every-unicode-character)
       +        /* find an unused keycode to use as a temporary keycode (derived from source: https://stackoverflow.com/questions/44313966/c-xtest-emitting-key-presses-for-every-unicode-character) */
                KeySym *keysyms = NULL;
                int keysyms_per_keycode = 0;
                int keycode_low, keycode_high;
       @@ -743,7 +743,7 @@ usage(char *argv0) {
                fprintf(stderr, "  -O         - Disable overlays\n");
                fprintf(stderr, "  -l         - Comma separated list of layers to enable\n");
                fprintf(stderr, "  -s         - Layer to select on program start\n");
       -        fprintf(stderr, "  -H [int]         - Height fraction, one key row takes 1/x of the screen height");
       +        fprintf(stderr, "  -H [int]   - Height fraction, one key row takes 1/x of the screen height");
                fprintf(stderr, "  -fn [font] - Set font (Xft, e.g: DejaVu Sans:bold:size=20)\n");
                exit(1);
        }
       @@ -758,7 +758,7 @@ cyclelayer() {
                currentlayer++;
                if (currentlayer >= numlayers)
                        currentlayer = 0;
       -        if (debug) { printf("Cycling to layer %d\n", currentlayer); fflush(stdout); }
       +        if (debug) printdbg("Cycling to layer %d\n", currentlayer);
                setlayer();
                updatekeys();
                drawkeyboard();
       @@ -771,7 +771,7 @@ togglelayer() {
                } else if (numlayers > 1) {
                        currentlayer = 1;
                }
       -        if (debug) { printf("Toggling layer %d\n", currentlayer); fflush(stdout); }
       +        if (debug) printdbg("Toggling layer %d\n", currentlayer);
                setlayer();
                updatekeys();
                drawkeyboard();
       @@ -780,9 +780,9 @@ togglelayer() {
        
        void
        showoverlay(int idx) {
       -        if (debug) { printf("Showing overlay %d\n", idx); fflush(stdout); }
       +        if (debug) printdbg("Showing overlay %d\n", idx);
                int i,j;
       -        //unpress existing key (visually only)
       +        /* unpress existing key (visually only) */
                for(i = 0; i < numkeys; i++) {
                        if(keys[i].pressed && !IsModifierKey(keys[i].keysym)) {
                                keys[i].pressed = 0;
       @@ -809,7 +809,7 @@ showoverlay(int idx) {
        
        void
        hideoverlay() {
       -        if (debug) { printf("Hiding overlay %d\n", currentoverlay); fflush(stdout); }
       +        if (debug) printdbg("Hiding overlay %d\n", currentoverlay);
                currentoverlay = -1;
                overlaykeysym = 0;
                currentlayer = -1;
       @@ -822,7 +822,7 @@ sigterm(int sig)
        {
                running = False;
                sigtermd = True;
       -        if (debug) { printf("Sigterm received\n"); fflush(stdout); }
       +        if (debug) printdbg("Sigterm received\n");
        }
        
        
       @@ -868,6 +868,15 @@ init_layers(char * layer_names_list, const char * initial_layer_name) {
                setlayer();
        }
        
       +void
       +printdbg(const char * fmt, ...) {
       +        va_list args;
       +        va_start(args, fmt);
       +        vfprintf(stderr, fmt, args);
       +        va_end(args);
       +        fflush(stderr);
       +}
       +
        int
        main(int argc, char *argv[]) {
                int i, xr, yr, bitm;
       @@ -878,24 +887,24 @@ main(int argc, char *argv[]) {
                signal(SIGTERM, sigterm);
        
        
       -        //parse environment variables
       +        /* parse environment variables */
                if (OVERLAYS <= 1) {
                        enableoverlays = 0;
       -    } else {
       +        } else {
                        const char* enableoverlays_env = getenv("SVKBD_ENABLEOVERLAYS");
                        if (enableoverlays_env != NULL) enableoverlays = atoi(enableoverlays_env);
                }
                const char* layers_env = getenv("SVKBD_LAYERS");
                if (layers_env != NULL) {
       -                layer_names_list = malloc(128);
       -                if (!layer_names_list) die("memory allocation error\n");
       -                strcpy(layer_names_list, layers_env);
       +                if (!strdup(layer_names_list, layers_env)) {
       +                        die("memory allocation error\n");
       +                }
                }
                const char* heightfactor_s = getenv("SVKBD_HEIGHTFACTOR");
                if (heightfactor_s != NULL)
                        heightfactor = atoi(heightfactor_s);
        
       -        //parse command line arguments
       +        /* parse command line arguments */
                for (i = 1; argv[i]; i++) {
                        if(!strcmp(argv[i], "-v")) {
                                die("svkbd-"VERSION", © 2006-2020 svkbd engineers,"
       @@ -932,11 +941,10 @@ main(int argc, char *argv[]) {
                        } else if(!strcmp(argv[i], "-l")) {
                                if(i >= argc - 1)
                                        continue;
       -                        if (layer_names_list == NULL) {
       -                                layer_names_list = malloc(128);
       -                                if (!layer_names_list) die("memory allocation error\n");
       +                        free(layer_names_list);
       +                        if (!strdup(layer_names_list, argv[++i])) {
       +                                die("memory allocation error\n");
                                }
       -                        strcpy(layer_names_list, argv[++i]);
                        } else if(!strcmp(argv[i], "-s")) {
                                if(i >= argc - 1)
                                        continue;