Fix Shift + Insert shortcut - st - Simple Terminal
       
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 90e1427632d6c5852d10c8d2bafa787012903eb9
 (DIR) parent cc86d148cb4092a57af2b58eeae96bbd721de803
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Thu, 15 Nov 2012 19:01:16 +0100
       
       Fix Shift + Insert shortcut
       
       This patch apply the same code for shortcuts that it is used now for defined
       keys. So it is possible use now XK_NO_MOD and XK_ANY_MOD for defining shortcuts.
       ---
        st.c |   35 ++++++++++++++++++++---------------
        1 file changed, 20 insertions(+), 15 deletions(-)
       Diffstat:
         st.c                                |      35 ++++++++++++++++++-------------
       
       1 file changed, 20 insertions(+), 15 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -65,7 +65,6 @@
        #define REDRAW_TIMEOUT (80*1000) /* 80 ms */
        
        /* macros */
       -#define CLEANMASK(mask) (mask & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
        #define SERRNO strerror(errno)
        #define MIN(a, b)  ((a) < (b) ? (a) : (b))
        #define MAX(a, b)  ((a) < (b) ? (b) : (a))
       @@ -329,6 +328,7 @@ static void tsetmode(bool, bool, int *, int);
        static void tfulldirt(void);
        static void techo(char *, int);
        
       +static inline bool match(uint, uint);
        static void ttynew(void);
        static void ttyread(void);
        static void ttyresize(void);
       @@ -2696,23 +2696,29 @@ focus(XEvent *ev) {
                }
        }
        
       +inline bool
       +match(uint mask, uint state) {
       +        if(mask == XK_NO_MOD && state)
       +                return false;
       +        if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
       +                return false;
       +        if((state & mask) != state)
       +                return false;
       +        return true;
       +}
       +
        char*
        kmap(KeySym k, uint state) {
                uint mask;
                Key *kp;
        
       -        state &= ~Mod2Mask;
                for(kp = key; kp < key + LEN(key); kp++) {
                        mask = kp->mask;
        
                        if(kp->k != k)
                                continue;
        
       -                if(mask == XK_NO_MOD && state)
       -                        continue;
       -                if(mask != XK_ANY_MOD && mask != XK_NO_MOD && !state)
       -                        continue;
       -                if((state & mask) != state)
       +                if(!match(mask, state))
                                continue;
        
                        if((kp->appkey < 0 && IS_SET(MODE_APPKEYPAD)) ||
       @@ -2741,21 +2747,20 @@ kpress(XEvent *ev) {
                XKeyEvent *e = &ev->xkey;
                KeySym ksym;
                char xstr[31], buf[32], *customkey, *cp = buf;
       -        int len, i;
       +        int len;
                Status status;
       +        Shortcut *bp;
        
                if (IS_SET(MODE_KBDLOCK))
                        return;
        
                len = XmbLookupString(xw.xic, e, xstr, sizeof(xstr), &ksym, &status);
       -
       +        e->state &= ~Mod2Mask;
                /* 1. shortcuts */
       -        for(i = 0; i < LEN(shortcuts); i++) {
       -                if((ksym == shortcuts[i].keysym)
       -                                && (CLEANMASK(shortcuts[i].mod) == \
       -                                        CLEANMASK(e->state))
       -                                && shortcuts[i].func) {
       -                        shortcuts[i].func(&(shortcuts[i].arg));
       +        for(bp = shortcuts; bp < shortcuts + LEN(shortcuts); bp++) {
       +                if(ksym == bp->keysym && match(bp->mod, e->state)) {
       +                        bp->func(&(bp->arg));
       +                        return;
                        }
                }