diff options
| -rw-r--r-- | dmenu.c | 34 |
1 files changed, 16 insertions, 18 deletions
| @@ -109,6 +109,7 @@ calcoffsetsv(void) { | |||
| 109 | next = prev = curr; | 109 | next = prev = curr; |
| 110 | for(i = 0; i < lines && next; i++) | 110 | for(i = 0; i < lines && next; i++) |
| 111 | next = next->right; | 111 | next = next->right; |
| 112 | mh = (dc.font.height + 2) * (i + 1); | ||
| 112 | for(i = 0; i < lines && prev && prev->left; i++) | 113 | for(i = 0; i < lines && prev && prev->left; i++) |
| 113 | prev = prev->left; | 114 | prev = prev->left; |
| 114 | } | 115 | } |
| @@ -166,6 +167,8 @@ drawmenu(void) { | |||
| 166 | dc.w = mw; | 167 | dc.w = mw; |
| 167 | dc.h = mh; | 168 | dc.h = mh; |
| 168 | drawtext(&dc, NULL, normcol, False); | 169 | drawtext(&dc, NULL, normcol, False); |
| 170 | dc.h = dc.font.height + 2; | ||
| 171 | dc.y = topbar ? 0 : mh - dc.h; | ||
| 169 | /* print prompt? */ | 172 | /* print prompt? */ |
| 170 | if(prompt) { | 173 | if(prompt) { |
| 171 | dc.w = promptw; | 174 | dc.w = promptw; |
| @@ -177,12 +180,10 @@ drawmenu(void) { | |||
| 177 | if(cmdw && item && lines == 0) | 180 | if(cmdw && item && lines == 0) |
| 178 | dc.w = cmdw; | 181 | dc.w = cmdw; |
| 179 | drawtext(&dc, *text ? text : NULL, normcol, False); | 182 | drawtext(&dc, *text ? text : NULL, normcol, False); |
| 180 | if(curr) { | 183 | if(lines > 0) |
| 181 | if(lines > 0) | 184 | drawmenuv(); |
| 182 | drawmenuv(); | 185 | else |
| 183 | else | 186 | drawmenuh(); |
| 184 | drawmenuh(); | ||
| 185 | } | ||
| 186 | XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); | 187 | XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); |
| 187 | XFlush(dpy); | 188 | XFlush(dpy); |
| 188 | } | 189 | } |
| @@ -193,7 +194,7 @@ drawmenuh(void) { | |||
| 193 | 194 | ||
| 194 | dc.x += cmdw; | 195 | dc.x += cmdw; |
| 195 | dc.w = spaceitem; | 196 | dc.w = spaceitem; |
| 196 | drawtext(&dc, curr->left ? "<" : NULL, normcol, False); | 197 | drawtext(&dc, curr && curr->left ? "<" : NULL, normcol, False); |
| 197 | dc.x += dc.w; | 198 | dc.x += dc.w; |
| 198 | for(i = curr; i != next; i = i->right) { | 199 | for(i = curr; i != next; i = i->right) { |
| 199 | dc.w = MIN(textw(&dc, i->text), mw / 3); | 200 | dc.w = MIN(textw(&dc, i->text), mw / 3); |
| @@ -208,16 +209,17 @@ drawmenuh(void) { | |||
| 208 | void | 209 | void |
| 209 | drawmenuv(void) { | 210 | drawmenuv(void) { |
| 210 | Item *i; | 211 | Item *i; |
| 212 | XWindowAttributes wa; | ||
| 211 | 213 | ||
| 214 | dc.y = topbar ? dc.h : 0; | ||
| 212 | dc.w = mw - dc.x; | 215 | dc.w = mw - dc.x; |
| 213 | dc.h = dc.font.height + 2; | ||
| 214 | dc.y = dc.h; | ||
| 215 | for(i = curr; i != next; i = i->right) { | 216 | for(i = curr; i != next; i = i->right) { |
| 216 | drawtext(&dc, i->text, (sel == i) ? selcol : normcol, False); | 217 | drawtext(&dc, i->text, (sel == i) ? selcol : normcol, False); |
| 217 | dc.y += dc.h; | 218 | dc.y += dc.h; |
| 218 | } | 219 | } |
| 219 | dc.h = mh - dc.y; | 220 | if(!XGetWindowAttributes(dpy, win, &wa)) |
| 220 | drawtext(&dc, NULL, normcol, False); | 221 | eprint("cannot get window attributes"); |
| 222 | XMoveResizeWindow(dpy, win, wa.x, wa.y + (topbar ? 0 : wa.height - mh), mw, mh); | ||
| 221 | } | 223 | } |
| 222 | 224 | ||
| 223 | Bool | 225 | Bool |
| @@ -299,9 +301,6 @@ kpress(XKeyEvent *e) { | |||
| 299 | text[++i] = '\0'; | 301 | text[++i] = '\0'; |
| 300 | match(text); | 302 | match(text); |
| 301 | break; | 303 | break; |
| 302 | case XK_x: | ||
| 303 | dinput(); | ||
| 304 | break; | ||
| 305 | } | 304 | } |
| 306 | } | 305 | } |
| 307 | switch(ksym) { | 306 | switch(ksym) { |
| @@ -360,10 +359,9 @@ kpress(XKeyEvent *e) { | |||
| 360 | calcoffsets(); | 359 | calcoffsets(); |
| 361 | break; | 360 | break; |
| 362 | case XK_Return: | 361 | case XK_Return: |
| 363 | if((e->state & ShiftMask) || !sel) | 362 | if(e->state & ShiftMask) |
| 364 | fprintf(stdout, "%s", text); | 363 | dinput(); |
| 365 | else | 364 | fprintf(stdout, "%s", sel ? sel->text : text); |
| 366 | fprintf(stdout, "%s", sel->text); | ||
| 367 | fflush(stdout); | 365 | fflush(stdout); |
| 368 | running = False; | 366 | running = False; |
| 369 | return; | 367 | return; |
