dmenu

my fork of dmenu
Index Commits Files Refs README LICENSE
commit 7afd296c40a2e8af9477add1c3d02a7c4b444747
parent cc8b3b999ba0153029b1e5a97ebbd59563f9e7bb
Author: Connor Lane Smith <cls@lubutu.com>
Date:   Wed, 30 Jun 2010 00:52:14 +0100

resizing vlist, new dinput binding
Diffstat:
Mdmenu.c | 34++++++++++++++++------------------
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git 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;