diff options
| -rw-r--r-- | dmenu.c | 34 | 
1 files changed, 16 insertions, 18 deletions
| @@ -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; | 
