diff options
| author | zachir <zachir@librem.one> | 2023-02-21 13:48:38 -0600 | 
|---|---|---|
| committer | zachir <zachir@librem.one> | 2023-02-21 13:48:38 -0600 | 
| commit | 59fbcc368693d01182e41ec8f397b9e47325cd8c (patch) | |
| tree | 108cef8fb94eca02ee0a5e768bd5f1ae86daec7e /dmenu.c | |
| parent | addad8d7671563820a8a10cb181e1034d1891678 (diff) | |
add center patch
Diffstat (limited to 'dmenu.c')
| -rw-r--r-- | dmenu.c | 38 | 
1 files changed, 32 insertions, 6 deletions
| @@ -99,6 +99,15 @@ calcoffsets(void)  			break;  } +static int +max_textw(void) +{ +	int len = 0; +	for (struct item *item = items; item && item->text; item++) +		len = MAX(TEXTW(item->text), len); +	return len; +} +  static void  cleanup(void)  { @@ -648,6 +657,7 @@ setup(void)  	bh = drw->fonts->h + 2;  	lines = MAX(lines, 0);  	mh = (lines + 1) * bh; +	promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;  #ifdef XINERAMA  	i = 0;  	if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { @@ -674,9 +684,16 @@ setup(void)  				if (INTERSECT(x, y, 1, 1, info[i]) != 0)  					break; -		x = info[i].x_org; -		y = info[i].y_org + (topbar ? 0 : info[i].height - mh); -		mw = info[i].width; +		if (centered) { +			mw = MIN(MAX(max_textw() + promptw, min_width), info[i].width); +			x = info[i].x_org + ((info[i].width  - mw) / 2); +			y = info[i].y_org + ((info[i].height - mh) / 2); +		} else { +			x = info[i].x_org; +			y = info[i].y_org + (topbar ? 0 : info[i].height - mh); +			mw = info[i].width; +		} +  		XFree(info);  	} else  #endif @@ -684,9 +701,16 @@ setup(void)  		if (!XGetWindowAttributes(dpy, parentwin, &wa))  			die("could not get embedding window attributes: 0x%lx",  			    parentwin); -		x = 0; -		y = topbar ? 0 : wa.height - mh; -		mw = wa.width; + +		if (centered) { +			mw = MIN(MAX(max_textw() + promptw, min_width), wa.width); +			x = (wa.width  - mw) / 2; +			y = (wa.height - mh) / 2; +		} else { +			x = 0; +			y = topbar ? 0 : wa.height - mh; +			mw = wa.width; +		}  	}  	promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;  	inputw = mw / 3; /* input width: ~33% of monitor width */ @@ -748,6 +772,8 @@ main(int argc, char *argv[])  			topbar = 0;  		else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */  			fast = 1; +		else if (!strcmp(argv[i], "-c"))   /* centers dmenu on screen */ +			centered = 1;  		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */  			fstrncmp = strncasecmp;  			fstrstr = cistrstr; | 
