tapplied Connor's next nice patch, thanks a lot! - dmenu - Dmenu fork with xft fonts.
 (HTM) git clone git://r-36.net/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit eededaa76fb12c10d6de3cb5fcf1479efd39ad75
 (DIR) parent 8e3e61170bd34d8a8269e376c30cb3afa25343a2
 (HTM) Author: Anselm R Garbe <anselm@garbe.us>
       Date:   Wed, 31 Mar 2010 22:37:41 +0100
       
       applied Connor's next nice patch, thanks a lot!
       Diffstat:
         dmenu.c                             |      65 ++++++++++++++-----------------
       
       1 file changed, 29 insertions(+), 36 deletions(-)
       ---
 (DIR) diff --git a/dmenu.c b/dmenu.c
       t@@ -52,6 +52,7 @@ static void calcoffsetsh(void);
        static void calcoffsetsv(void);
        static char *cistrstr(const char *s, const char *sub);
        static void cleanup(void);
       +static void drawcursor(void);
        static void drawmenu(void);
        static void drawmenuh(void);
        static void drawmenuv(void);
       t@@ -247,9 +248,7 @@ drawmenuh(void) {
                dc.x += dc.w;
                /* determine maximum items */
                for(i = curr; i != next; i=i->right) {
       -                dc.w = textw(i->text);
       -                if(dc.w > mw / 3)
       -                        dc.w = mw / 3;
       +                dc.w = MIN(textw(i->text), mw / 3);
                        drawtext(i->text, (sel == i) ? dc.sel : dc.norm);
                        dc.x += dc.w;
                }
       t@@ -395,7 +394,8 @@ kpress(XKeyEvent * e) {
                        switch (ksym) {
                        default:        /* ignore other control sequences */
                                return;
       -                case XK_bracketleft:
       +                case XK_c:
       +                case XK_C:
                                ksym = XK_Escape;
                                break;
                        case XK_h:
       t@@ -414,18 +414,16 @@ kpress(XKeyEvent * e) {
                        case XK_U:
                                text[0] = 0;
                                match(text);
       -                        drawmenu();
                                break;
                        case XK_w:
                        case XK_W:
       -                        if(len) {
       -                                i = len - 1;
       -                                while(i >= 0 && text[i] == ' ')
       -                                        text[i--] = 0;
       -                                while(i >= 0 && text[i] != ' ')
       -                                        text[i--] = 0;
       +                        if(cursor > 0) {
       +                                i = cursor;
       +                                while(i-- > 0 && text[i] == ' ');
       +                                while(i-- > 0 && text[i] != ' ');
       +                                memmove(text + i + 1, text + cursor, sizeof text - cursor);
       +                                cursor = i + 1;
                                        match(text);
       -                                drawmenu();
                                }
                                break;
                        }
       t@@ -473,14 +471,14 @@ kpress(XKeyEvent * e) {
                        num = MIN(num, sizeof text - cursor);
                        if(num && !iscntrl((int) buf[0])) {
                                memmove(text + cursor + num, text + cursor, sizeof text - cursor - num);
       -                        memmove(text + cursor, buf, num);
       +                        memcpy(text + cursor, buf, num);
                                cursor+=num;
                                match(text);
                        }
                        break;
                case XK_BackSpace:
                        if(cursor > 0) {
       -                        memmove(text + cursor + -1, text + cursor, sizeof text - cursor);
       +                        memmove(text + cursor - 1, text + cursor, sizeof text - cursor + 1);
                                cursor--;
                                match(text);
                        }
       t@@ -490,8 +488,10 @@ kpress(XKeyEvent * e) {
                        match(text);
                        break;
                case XK_End:
       -                if(!item)
       -                        return;
       +                if(cursor < len) {
       +                        cursor = len;
       +                        break;
       +                }
                        while(next) {
                                sel = curr = next;
                                calcoffsets();
       t@@ -504,8 +504,10 @@ kpress(XKeyEvent * e) {
                        running = False;
                        break;
                case XK_Home:
       -                if(!item)
       -                        return;
       +                if(sel == item) {
       +                        cursor = 0;
       +                        break;
       +                }
                        sel = curr = item;
                        calcoffsets();
                        break;
       t@@ -536,12 +538,10 @@ kpress(XKeyEvent * e) {
                        calcoffsets();
                        break;
                case XK_Return:
       -                if((e->state & ShiftMask) && *text)
       +                if((e->state & ShiftMask) || !sel)
                                fprintf(stdout, "%s", text);
       -                else if(sel)
       +                else
                                fprintf(stdout, "%s", sel->text);
       -                else if(*text)
       -                        fprintf(stdout, "%s", text);
                        fflush(stdout);
                        running = False;
                        break;
       t@@ -567,9 +567,6 @@ kpress(XKeyEvent * e) {
                        match(text);
                        break;
                }
       -        len = strlen(text);
       -        cursor = MIN(cursor, len);
       -        cursor = MAX(cursor, 0);
                drawmenu();
        }
        
       t@@ -620,13 +617,13 @@ readstdin(void) {
                unsigned int len = 0, max = 0;
                Item *i, *new;
        
       -        i = 0;
       +        i = NULL;
                while(fgets(buf, sizeof buf, stdin)) {
                        len = strlen(buf);
       -                if (buf[len - 1] == '\n')
       -                        buf[len - 1] = 0;
       +                if(buf[len-1] == '\n')
       +                        buf[--len] = '\0';
                        if(!(p = strdup(buf)))
       -                        eprint("fatal: could not strdup() %u bytes\n", strlen(buf));
       +                        eprint("fatal: could not strdup() %u bytes\n", len);
                        if(max < len) {
                                maxname = p;
                                max = len;
       t@@ -734,13 +731,9 @@ setup(Bool topbar) {
                if(!dc.font.set)
                        XSetFont(dpy, dc.gc, dc.font.xfont->fid);
                if(maxname)
       -                cmdw = textw(maxname);
       -        if(cmdw > mw / 3)
       -                cmdw = mw / 3;
       +                cmdw = MIN(textw(maxname), mw / 3);
                if(prompt)
       -                promptw = textw(prompt);
       -        if(promptw > mw / 5)
       -                promptw = mw / 5;
       +                promptw = MIN(textw(prompt), mw / 5);
                text[0] = 0;
                match(text);
                XMapRaised(dpy, win);
       t@@ -799,7 +792,7 @@ main(int argc, char *argv[]) {
                                if(++i < argc) selfgcolor = argv[i];
                        }
                        else if(!strcmp(argv[i], "-v"))
       -                        eprint("dmenu-"VERSION", © 2006-2009 dmenu engineers, see LICENSE for details\n");
       +                        eprint("dmenu-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n");
                        else
                                eprint("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>] [-nf <color>]\n"
                                       "             [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n");