Move key-matching functions into x.c - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ed132e11271d18a5d8aa163096bc6192c694bc47
 (DIR) parent dbe8676d7d69651132bde2b6d9ec3787cbbc552a
 (HTM) Author: Devin J. Pohly <djpohly@gmail.com>
       Date:   Wed, 11 Oct 2017 08:47:14 -0500
       
       Move key-matching functions into x.c
       
       Modifiers and keysyms are specific to X, and the functions match and
       kmap are only used in x.c.  Needed to global-ize the key arrays and
       lengths from config.h (for now).
       
       Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
       
       Diffstat:
         M config.def.h                        |       6 +++---
         M st.c                                |      58 ++-----------------------------
         M st.h                                |      18 +++++++++++++++---
         M x.c                                 |      48 +++++++++++++++++++++++++++++++
       
       4 files changed, 68 insertions(+), 62 deletions(-)
       ---
 (DIR) diff --git a/config.def.h b/config.def.h
       @@ -209,13 +209,13 @@ Shortcut shortcuts[] = {
         * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF)
         * to be mapped below, add them to this array.
         */
       -static KeySym mappedkeys[] = { -1 };
       +KeySym mappedkeys[] = { -1 };
        
        /*
         * State bits to ignore when matching key or button events.  By default,
         * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored.
         */
       -static uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
       +uint ignoremod = Mod2Mask|XK_SWITCH_MOD;
        
        /*
         * Override mouse-select while mask is active (when MODE_MOUSE is set).
       @@ -228,7 +228,7 @@ uint forceselmod = ShiftMask;
         * This is the huge key array which defines all compatibility to the Linux
         * world. Please decide about changes wisely.
         */
       -static Key key[] = {
       +Key key[] = {
                /* keysym           mask            string      appkey appcursor crlf */
                { XK_KP_Home,       ShiftMask,      "\033[2J",       0,   -1,    0},
                { XK_KP_Home,       ShiftMask,      "\033[1;2H",     0,   +1,    0},
 (DIR) diff --git a/st.c b/st.c
       @@ -110,16 +110,6 @@ typedef struct {
                int narg;              /* nb of args */
        } STREscape;
        
       -typedef struct {
       -        KeySym k;
       -        uint mask;
       -        char *s;
       -        /* three valued logic variables: 0 indifferent, 1 on, -1 off */
       -        signed char appkey;    /* application keypad */
       -        signed char appcursor; /* application cursor */
       -        signed char crlf;      /* crlf mode          */
       -} Key;
       -
        /* function definitions used in config.h */
        static void clipcopy(const Arg *);
        static void clippaste(const Arg *);
       @@ -223,6 +213,8 @@ size_t colornamelen = LEN(colorname);
        size_t mshortcutslen = LEN(mshortcuts);
        size_t shortcutslen = LEN(shortcuts);
        size_t selmaskslen = LEN(selmasks);
       +size_t keyslen = LEN(key);
       +size_t mappedkeyslen = LEN(mappedkeys);
        
        ssize_t
        xwrite(int fd, const char *s, size_t len)
       @@ -2550,54 +2542,8 @@ redraw(void)
                draw();
        }
        
       -int
       -match(uint mask, uint state)
       -{
       -        return mask == XK_ANY_MOD || mask == (state & ~ignoremod);
       -}
       -
        void
        numlock(const Arg *dummy)
        {
                term.numlock ^= 1;
        }
       -
       -char*
       -kmap(KeySym k, uint state)
       -{
       -        Key *kp;
       -        int i;
       -
       -        /* Check for mapped keys out of X11 function keys. */
       -        for (i = 0; i < LEN(mappedkeys); i++) {
       -                if (mappedkeys[i] == k)
       -                        break;
       -        }
       -        if (i == LEN(mappedkeys)) {
       -                if ((k & 0xFFFF) < 0xFD00)
       -                        return NULL;
       -        }
       -
       -        for (kp = key; kp < key + LEN(key); kp++) {
       -                if (kp->k != k)
       -                        continue;
       -
       -                if (!match(kp->mask, state))
       -                        continue;
       -
       -                if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0)
       -                        continue;
       -                if (term.numlock && kp->appkey == 2)
       -                        continue;
       -
       -                if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0)
       -                        continue;
       -
       -                if (IS_SET(MODE_CRLF) ? kp->crlf < 0 : kp->crlf > 0)
       -                        continue;
       -
       -                return kp->s;
       -        }
       -
       -        return NULL;
       -}
 (DIR) diff --git a/st.h b/st.h
       @@ -176,6 +176,16 @@ typedef struct {
                const Arg arg;
        } Shortcut;
        
       +typedef struct {
       +        KeySym k;
       +        uint mask;
       +        char *s;
       +        /* three valued logic variables: 0 indifferent, 1 on, -1 off */
       +        signed char appkey;    /* application keypad */
       +        signed char appcursor; /* application cursor */
       +        signed char crlf;      /* crlf mode          */
       +} Key;
       +
        void die(const char *, ...);
        void redraw(void);
        
       @@ -184,7 +194,6 @@ void tnew(int, int);
        void tresize(int, int);
        void tsetdirt(int, int);
        void tsetdirtattr(int);
       -int match(uint, uint);
        void ttynew(void);
        size_t ttyread(void);
        void ttyresize(int, int);
       @@ -193,9 +202,7 @@ void ttywrite(const char *, size_t);
        
        void resettitle(void);
        
       -char *kmap(KeySym, uint);
        void selclear(void);
       -
        void selinit(void);
        void selnormalize(void);
        int selected(int, int);
       @@ -255,7 +262,12 @@ extern MouseShortcut mshortcuts[];
        extern size_t mshortcutslen;
        extern Shortcut shortcuts[];
        extern size_t shortcutslen;
       +extern KeySym mappedkeys[];
       +extern size_t mappedkeyslen;
       +extern uint ignoremod;
        extern uint forceselmod;
       +extern Key key[];
       +extern size_t keyslen;
        extern uint selmasks[];
        extern size_t selmaskslen;
        extern char ascii_printable[];
 (DIR) diff --git a/x.c b/x.c
       @@ -116,6 +116,8 @@ static void selrequest(XEvent *);
        static void selcopy(Time);
        static void getbuttoninfo(XEvent *);
        static void mousereport(XEvent *);
       +static char *kmap(KeySym, uint);
       +static int match(uint, uint);
        
        static void run(void);
        static void usage(void);
       @@ -1603,6 +1605,52 @@ focus(XEvent *ev)
                }
        }
        
       +int
       +match(uint mask, uint state)
       +{
       +        return mask == XK_ANY_MOD || mask == (state & ~ignoremod);
       +}
       +
       +char*
       +kmap(KeySym k, uint state)
       +{
       +        Key *kp;
       +        int i;
       +
       +        /* Check for mapped keys out of X11 function keys. */
       +        for (i = 0; i < mappedkeyslen; i++) {
       +                if (mappedkeys[i] == k)
       +                        break;
       +        }
       +        if (i == mappedkeyslen) {
       +                if ((k & 0xFFFF) < 0xFD00)
       +                        return NULL;
       +        }
       +
       +        for (kp = key; kp < key + keyslen; kp++) {
       +                if (kp->k != k)
       +                        continue;
       +
       +                if (!match(kp->mask, state))
       +                        continue;
       +
       +                if (IS_SET(MODE_APPKEYPAD) ? kp->appkey < 0 : kp->appkey > 0)
       +                        continue;
       +                if (term.numlock && kp->appkey == 2)
       +                        continue;
       +
       +                if (IS_SET(MODE_APPCURSOR) ? kp->appcursor < 0 : kp->appcursor > 0)
       +                        continue;
       +
       +                if (IS_SET(MODE_CRLF) ? kp->crlf < 0 : kp->crlf > 0)
       +                        continue;
       +
       +                return kp->s;
       +        }
       +
       +        return NULL;
       +}
       +
        void
        kpress(XEvent *ev)
        {