Fix handling of input strings - dmenu - dynamic menu
 (HTM) git clone git://git.suckless.org/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit b6d2cc9aea979cb3557db39dbe65a2870d13e597
 (DIR) parent 2f398981feb562285b0a96cd315bf2b3244c7309
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Fri, 16 Mar 2018 16:51:22 +0100
       
       Fix handling of input strings
       
       Diffstat:
         M dmenu.c                             |      35 +++++++++++++++++++-------------
       
       1 file changed, 21 insertions(+), 14 deletions(-)
       ---
 (DIR) diff --git a/dmenu.c b/dmenu.c
       @@ -308,13 +308,21 @@ keypress(XKeyEvent *ev)
        {
                char buf[32];
                int len;
       -        KeySym ksym = NoSymbol;
       +        KeySym ksym;
                Status status;
        
                len = XmbLookupString(xic, ev, buf, sizeof buf, &ksym, &status);
       -        if (status == XBufferOverflow)
       +        switch (status) {
       +        default: /* XLookupNone, XBufferOverflow */
                        return;
       -        if (ev->state & ControlMask)
       +        case XLookupChars:
       +                goto insert;
       +        case XLookupKeySym:
       +        case XLookupBoth:
       +                break;
       +        }
       +
       +        if (ev->state & ControlMask) {
                        switch(ksym) {
                        case XK_a: ksym = XK_Home;      break;
                        case XK_b: ksym = XK_Left;      break;
       @@ -352,12 +360,10 @@ keypress(XKeyEvent *ev)
                                return;
                        case XK_Left:
                                movewordedge(-1);
       -                        ksym = NoSymbol;
       -                        break;
       +                        goto draw;
                        case XK_Right:
                                movewordedge(+1);
       -                        ksym = NoSymbol;
       -                        break;
       +                        goto draw;
                        case XK_Return:
                        case XK_KP_Enter:
                                break;
       @@ -367,16 +373,14 @@ keypress(XKeyEvent *ev)
                        default:
                                return;
                        }
       -        else if (ev->state & Mod1Mask)
       +        } else if (ev->state & Mod1Mask) {
                        switch(ksym) {
                        case XK_b:
                                movewordedge(-1);
       -                        ksym = NoSymbol;
       -                        break;
       +                        goto draw;
                        case XK_f:
                                movewordedge(+1);
       -                        ksym = NoSymbol;
       -                        break;
       +                        goto draw;
                        case XK_g: ksym = XK_Home;  break;
                        case XK_G: ksym = XK_End;   break;
                        case XK_h: ksym = XK_Up;    break;
       @@ -386,13 +390,14 @@ keypress(XKeyEvent *ev)
                        default:
                                return;
                        }
       +        }
       +
                switch(ksym) {
                default:
       +insert:
                        if (!iscntrl(*buf))
                                insert(buf, len);
                        break;
       -        case NoSymbol:
       -                break;
                case XK_Delete:
                        if (text[cursor] == '\0')
                                return;
       @@ -489,6 +494,8 @@ keypress(XKeyEvent *ev)
                        match();
                        break;
                }
       +
       +draw:
                drawmenu();
        }