resizing vlist, new dinput binding
authorConnor Lane Smith <cls@lubutu.com>
Tue, 29 Jun 2010 23:52:14 +0000 (00:52 +0100)
committerConnor Lane Smith <cls@lubutu.com>
Tue, 29 Jun 2010 23:52:14 +0000 (00:52 +0100)
dmenu.c

diff --git a/dmenu.c b/dmenu.c
index 2d53f9b..764e0f0 100644 (file)
--- a/dmenu.c
+++ b/dmenu.c
@@ -109,6 +109,7 @@ calcoffsetsv(void) {
        next = prev = curr;
        for(i = 0; i < lines && next; i++)
                next = next->right;
+       mh = (dc.font.height + 2) * (i + 1);
        for(i = 0; i < lines && prev && prev->left; i++)
                prev = prev->left;
 }
@@ -166,6 +167,8 @@ drawmenu(void) {
        dc.w = mw;
        dc.h = mh;
        drawtext(&dc, NULL, normcol, False);
+       dc.h = dc.font.height + 2;
+       dc.y = topbar ? 0 : mh - dc.h;
        /* print prompt? */
        if(prompt) {
                dc.w = promptw;
@@ -177,12 +180,10 @@ drawmenu(void) {
        if(cmdw && item && lines == 0)
                dc.w = cmdw;
        drawtext(&dc, *text ? text : NULL, normcol, False);
-       if(curr) {
-               if(lines > 0)
-                       drawmenuv();
-               else
-                       drawmenuh();
-       }
+       if(lines > 0)
+               drawmenuv();
+       else
+               drawmenuh();
        XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0);
        XFlush(dpy);
 }
@@ -193,7 +194,7 @@ drawmenuh(void) {
 
        dc.x += cmdw;
        dc.w = spaceitem;
-       drawtext(&dc, curr->left ? "<" : NULL, normcol, False);
+       drawtext(&dc, curr && curr->left ? "<" : NULL, normcol, False);
        dc.x += dc.w;
        for(i = curr; i != next; i = i->right) {
                dc.w = MIN(textw(&dc, i->text), mw / 3);
@@ -208,16 +209,17 @@ drawmenuh(void) {
 void
 drawmenuv(void) {
        Item *i;
+       XWindowAttributes wa;
 
+       dc.y = topbar ? dc.h : 0;
        dc.w = mw - dc.x;
-       dc.h = dc.font.height + 2;
-       dc.y = dc.h;
        for(i = curr; i != next; i = i->right) {
                drawtext(&dc, i->text, (sel == i) ? selcol : normcol, False);
                dc.y += dc.h;
        }
-       dc.h = mh - dc.y;
-       drawtext(&dc, NULL, normcol, False);
+       if(!XGetWindowAttributes(dpy, win, &wa))
+               eprint("cannot get window attributes");
+       XMoveResizeWindow(dpy, win, wa.x, wa.y + (topbar ? 0 : wa.height - mh), mw, mh);
 }
 
 Bool
@@ -299,9 +301,6 @@ kpress(XKeyEvent *e) {
                        text[++i] = '\0';
                        match(text);
                        break;
-               case XK_x:
-                       dinput();
-                       break;
                }
        }
        switch(ksym) {
@@ -360,10 +359,9 @@ kpress(XKeyEvent *e) {
                calcoffsets();
                break;
        case XK_Return:
-               if((e->state & ShiftMask) || !sel)
-                       fprintf(stdout, "%s", text);
-               else
-                       fprintf(stdout, "%s", sel->text);
+               if(e->state & ShiftMask)
+                       dinput();
+               fprintf(stdout, "%s", sel ? sel->text : text);
                fflush(stdout);
                running = False;
                return;