Extended key definition to allow setting explicit symbol for shift modifier. - svkbd - simple virtual keyboard
  HTML git clone git://git.suckless.org/svkbd
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit d10af923a31df4cca4206fbf4f839716482fd1ba
   DIR parent 3be1e21c9f7174f7cca2b8a099990a745f657a92
  HTML Author: Reed Wade <reedwade@misterbanal.net>
       Date:   Sat,  6 Mar 2021 15:09:08 +0100
       
       Extended key definition to allow setting explicit symbol for shift modifier.
       
       This allow key definitions as :
       
       { "?", XK_slash, 1, XK_Shift_L },
       
       Which will press <S-/> wich output `?`
       
       Signed-off-by: Reed Wade <reedwade@misterbanal.net>
       Signed-off-by: Maarten van Gompel <proycon@anaproy.nl>
       
       Diffstat:
         M svkbd.c                             |      28 +++++++++++++++++++---------
       
       1 file changed, 19 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/svkbd.c b/svkbd.c
       @@ -41,6 +41,7 @@ typedef struct {
                char *label;
                KeySym keysym;
                unsigned int width;
       +        KeySym modifier;
                int x, y, w, h;
                Bool pressed;
                Bool highlighted;
       @@ -183,14 +184,20 @@ buttonpress(XEvent *e)
        
                ispressing = True;
        
       -        for (i = 0; i < LENGTH(buttonmods); i++) {
       -                if (ev->button == buttonmods[i].button) {
       -                        mod = buttonmods[i].mod;
       -                        break;
       +        if (!(k = findkey(ev->x, ev->y)))
       +                return;
       +
       +        if (k->modifier)
       +                mod = k->modifier;
       +        else
       +                for (i = 0; i < LENGTH(buttonmods); i++) {
       +                        if (ev->button == buttonmods[i].button) {
       +                                mod = buttonmods[i].mod;
       +                                break;
       +                        }
                        }
       -        }
       -        if ((k = findkey(ev->x, ev->y)))
       -                press(k, mod);
       +
       +        press(k, mod);
        }
        
        void
       @@ -212,8 +219,10 @@ buttonrelease(XEvent *e)
        
                if (ev->x < 0 || ev->y < 0) {
                        unpress(NULL, mod);
       -        } else {
       -                if ((k = findkey(ev->x, ev->y)))
       +        } else if ((k = findkey(ev->x, ev->y))) {
       +                if (k->modifier)
       +                        unpress(k, k->modifier);
       +                else
                                unpress(k, mod);
                }
        }
       @@ -872,6 +881,7 @@ showoverlay(int idx)
                                j++;
                        keys[j].label = overlay[i].label;
                        keys[j].keysym = overlay[i].keysym;
       +                keys[j].modifier = overlay[i].modifier;
                }
                currentoverlay = idx;
                overlaykeysym = ispressingkeysym;