URI: 
       fix custom key handling. - st - simple terminal
  HTML git clone https://git.parazyd.org/st
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 6f260ba164ee302b50398e529f71e305e435504a
   DIR parent 8503f954a1cb2d08124fe2c1f0227bd23dffff46
  HTML Author: Aurélien Aptel <aurelien.aptel@gmail.com>
       Date:   Sun, 14 Aug 2011 17:13:59 +0200
       
       fix custom key handling.
       
       Diffstat:
         M config.def.h                        |      52 +++++++++++++++++--------------
         M st.c                                |       9 +++++++--
       
       2 files changed, 36 insertions(+), 25 deletions(-)
       ---
   DIR diff --git a/config.def.h b/config.def.h
       @@ -25,34 +25,40 @@ static const char *colorname[] = {
                "white"
        };
        
       -/* Default colors (colorname index) */
       -/* foreground, background, cursor   */
       +/* Default colors (colorname index)
       +   foreground, background, cursor   */
        #define DefaultFG 7
        #define DefaultBG 0
        #define DefaultCS 1
        
       -/* Special keys (change & recompile st.info accordingly) */
       -/*    key,        mask,  output */
       +/* Special keys (change & recompile st.info accordingly)
       +   Keep in mind that kpress() in st.c hardcodes some keys.
       +
       +   Mask value:
       +   * Use XK_ANY_MOD to match the key no matter modifiers state
       +   * Use XK_NO_MOD to match the key alone (no modifiers)
       +   
       +      key,        mask,  output */
        static Key key[] = {
       -        { XK_BackSpace, 0, "\177" },
       -        { XK_Insert,    0, "\033[2~" },
       -        { XK_Delete,    0, "\033[3~" },
       -        { XK_Home,      0, "\033[1~" },
       -        { XK_End,       0, "\033[4~" },
       -        { XK_Prior,     0, "\033[5~" },
       -        { XK_Next,      0, "\033[6~" },
       -        { XK_F1,        0, "\033OP"   },
       -        { XK_F2,        0, "\033OQ"   },
       -        { XK_F3,        0, "\033OR"   },
       -        { XK_F4,        0, "\033OS"   },
       -        { XK_F5,        0, "\033[15~" },
       -        { XK_F6,        0, "\033[17~" },
       -        { XK_F7,        0, "\033[18~" },
       -        { XK_F8,        0, "\033[19~" },
       -        { XK_F9,        0, "\033[20~" },
       -        { XK_F10,       0, "\033[21~" },
       -        { XK_F11,       0, "\033[23~" },
       -        { XK_F12,       0, "\033[24~" },
       +        { XK_BackSpace, XK_NO_MOD, "\177" },
       +           { XK_Insert,    XK_NO_MOD, "\033[2~" },
       +        { XK_Delete,    XK_NO_MOD, "\033[3~" },
       +        { XK_Home,      XK_NO_MOD, "\033[1~" },
       +        { XK_End,       XK_NO_MOD, "\033[4~" },
       +        { XK_Prior,     XK_NO_MOD, "\033[5~" },
       +        { XK_Next,      XK_NO_MOD, "\033[6~" },
       +        { XK_F1,        XK_NO_MOD, "\033OP"   },
       +        { XK_F2,        XK_NO_MOD, "\033OQ"   },
       +        { XK_F3,        XK_NO_MOD, "\033OR"   },
       +        { XK_F4,        XK_NO_MOD, "\033OS"   },
       +        { XK_F5,        XK_NO_MOD, "\033[15~" },
       +        { XK_F6,        XK_NO_MOD, "\033[17~" },
       +        { XK_F7,        XK_NO_MOD, "\033[18~" },
       +        { XK_F8,        XK_NO_MOD, "\033[19~" },
       +        { XK_F9,        XK_NO_MOD, "\033[20~" },
       +        { XK_F10,       XK_NO_MOD, "\033[21~" },
       +        { XK_F11,       XK_NO_MOD, "\033[23~" },
       +        { XK_F12,       XK_NO_MOD, "\033[24~" },
        };
        
        /* Line drawing characters (sometime specific to each font...) */
   DIR diff --git a/st.c b/st.c
       @@ -43,6 +43,8 @@
        #define ESC_ARG_SIZ   16
        #define DRAW_BUF_SIZ  1024
        #define UTF_SIZ       4
       +#define XK_NO_MOD     UINT_MAX
       +#define XK_ANY_MOD    0
        
        #define SERRNO strerror(errno)
        #define MIN(a, b)  ((a) < (b) ? (a) : (b))
       @@ -1833,9 +1835,12 @@ focus(XEvent *ev) {
        char*
        kmap(KeySym k, unsigned int state) {
                int i;
       -        for(i = 0; i < LEN(key); i++)
       -                if(key[i].k == k && (key[i].mask == 0 || key[i].mask & state))
       +        state &= ~Mod2Mask;
       +        for(i = 0; i < LEN(key); i++) {
       +                unsigned int mask = key[i].mask;
       +                if(key[i].k == k && ((state & mask) == mask || (mask == XK_NO_MOD && !state)))
                                return (char*)key[i].s;
       +        }
                return NULL;
        }