applied Connor's next nice patch, thanks a lot!
authorAnselm R Garbe <anselm@garbe.us>
Wed, 31 Mar 2010 21:37:41 +0000 (22:37 +0100)
committerAnselm R Garbe <anselm@garbe.us>
Wed, 31 Mar 2010 21:37:41 +0000 (22:37 +0100)
dmenu.c

diff --git a/dmenu.c b/dmenu.c
index 5f16894..6177906 100644 (file)
--- a/dmenu.c
+++ b/dmenu.c
@@ -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);
@@ -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;
        }
@@ -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:
@@ -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;
                }
@@ -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);
                }
@@ -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();
@@ -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;
@@ -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;
@@ -567,9 +567,6 @@ kpress(XKeyEvent * e) {
                match(text);
                break;
        }
-       len = strlen(text);
-       cursor = MIN(cursor, len);
-       cursor = MAX(cursor, 0);
        drawmenu();
 }
 
@@ -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;
@@ -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);
@@ -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");