mirror of
				https://github.com/tiyn/dmenu.git
				synced 2025-10-30 18:51:19 +01:00 
			
		
		
		
	center
This commit is contained in:
		| @@ -2,6 +2,8 @@ | |||||||
| /* Default settings; can be overriden by command line. */ | /* Default settings; can be overriden by command line. */ | ||||||
|  |  | ||||||
| static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */ | static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */ | ||||||
|  | static int centered = 0;                    /* -c option; centers dmenu on screen */ | ||||||
|  | static int min_width = 500;                    /* minimum width when centered */ | ||||||
| /* -fn option overrides fonts[0]; default X11 font or font set */ | /* -fn option overrides fonts[0]; default X11 font or font set */ | ||||||
| static const char *fonts[] = { | static const char *fonts[] = { | ||||||
| 	"monospace:size=10" | 	"monospace:size=10" | ||||||
|   | |||||||
							
								
								
									
										120
									
								
								dmenu-center-20200111-8cd37e1.diff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								dmenu-center-20200111-8cd37e1.diff
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | |||||||
|  | From 8cd37e1ab9e7cb025224aeb3543f1a5be8bceb93 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Nihal Jere <nihal@nihaljere.xyz> | ||||||
|  | Date: Sat, 11 Jan 2020 21:16:08 -0600 | ||||||
|  | Subject: [PATCH] center patch now has adjustable minimum width | ||||||
|  |  | ||||||
|  | --- | ||||||
|  |  config.def.h |  2 ++ | ||||||
|  |  dmenu.1      |  3 +++ | ||||||
|  |  dmenu.c      | 39 ++++++++++++++++++++++++++++++++------- | ||||||
|  |  3 files changed, 37 insertions(+), 7 deletions(-) | ||||||
|  |  | ||||||
|  | diff --git a/config.def.h b/config.def.h | ||||||
|  | index 1edb647..88ef264 100644 | ||||||
|  | --- a/config.def.h | ||||||
|  | +++ b/config.def.h | ||||||
|  | @@ -2,6 +2,8 @@ | ||||||
|  |  /* Default settings; can be overriden by command line. */ | ||||||
|  |   | ||||||
|  |  static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */ | ||||||
|  | +static int centered = 0;                    /* -c option; centers dmenu on screen */ | ||||||
|  | +static int min_width = 500;                    /* minimum width when centered */ | ||||||
|  |  /* -fn option overrides fonts[0]; default X11 font or font set */ | ||||||
|  |  static const char *fonts[] = { | ||||||
|  |  	"monospace:size=10" | ||||||
|  | diff --git a/dmenu.1 b/dmenu.1 | ||||||
|  | index 323f93c..c036baa 100644 | ||||||
|  | --- a/dmenu.1 | ||||||
|  | +++ b/dmenu.1 | ||||||
|  | @@ -40,6 +40,9 @@ which lists programs in the user's $PATH and runs the result in their $SHELL. | ||||||
|  |  .B \-b | ||||||
|  |  dmenu appears at the bottom of the screen. | ||||||
|  |  .TP | ||||||
|  | +.B \-c | ||||||
|  | +dmenu appears centered on the screen. | ||||||
|  | +.TP | ||||||
|  |  .B \-f | ||||||
|  |  dmenu grabs the keyboard before reading stdin if not reading from a tty. This | ||||||
|  |  is faster, but will lock up X until stdin reaches end\-of\-file. | ||||||
|  | diff --git a/dmenu.c b/dmenu.c | ||||||
|  | index 65f25ce..041c7f8 100644 | ||||||
|  | --- a/dmenu.c | ||||||
|  | +++ b/dmenu.c | ||||||
|  | @@ -89,6 +89,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) | ||||||
|  |  { | ||||||
|  | @@ -611,6 +620,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))) { | ||||||
|  | @@ -637,9 +647,16 @@ setup(void) | ||||||
|  |  				if (INTERSECT(x, y, 1, 1, info[i])) | ||||||
|  |  					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 | ||||||
|  | @@ -647,11 +664,17 @@ 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 = MIN(inputw, mw/3); | ||||||
|  |  	match(); | ||||||
|  |   | ||||||
|  | @@ -709,6 +732,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; | ||||||
|  | --  | ||||||
|  | 2.24.1 | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								dmenu.1
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								dmenu.1
									
									
									
									
									
								
							| @@ -40,6 +40,9 @@ which lists programs in the user's $PATH and runs the result in their $SHELL. | |||||||
| .B \-b | .B \-b | ||||||
| dmenu appears at the bottom of the screen. | dmenu appears at the bottom of the screen. | ||||||
| .TP | .TP | ||||||
|  | .B \-c | ||||||
|  | dmenu appears centered on the screen. | ||||||
|  | .TP | ||||||
| .B \-f | .B \-f | ||||||
| dmenu grabs the keyboard before reading stdin if not reading from a tty. This | dmenu grabs the keyboard before reading stdin if not reading from a tty. This | ||||||
| is faster, but will lock up X until stdin reaches end\-of\-file. | is faster, but will lock up X until stdin reaches end\-of\-file. | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								dmenu.c
									
									
									
									
									
								
							| @@ -89,6 +89,15 @@ calcoffsets(void) | |||||||
| 			break; | 			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 | static void | ||||||
| cleanup(void) | cleanup(void) | ||||||
| { | { | ||||||
| @@ -611,6 +620,7 @@ setup(void) | |||||||
| 	bh = drw->fonts->h + 2; | 	bh = drw->fonts->h + 2; | ||||||
| 	lines = MAX(lines, 0); | 	lines = MAX(lines, 0); | ||||||
| 	mh = (lines + 1) * bh; | 	mh = (lines + 1) * bh; | ||||||
|  | 	promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; | ||||||
| #ifdef XINERAMA | #ifdef XINERAMA | ||||||
| 	i = 0; | 	i = 0; | ||||||
| 	if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { | 	if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) { | ||||||
| @@ -637,9 +647,16 @@ setup(void) | |||||||
| 				if (INTERSECT(x, y, 1, 1, info[i])) | 				if (INTERSECT(x, y, 1, 1, info[i])) | ||||||
| 					break; | 					break; | ||||||
|  |  | ||||||
|  | 		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; | 			x = info[i].x_org; | ||||||
| 			y = info[i].y_org + (topbar ? 0 : info[i].height - mh); | 			y = info[i].y_org + (topbar ? 0 : info[i].height - mh); | ||||||
| 			mw = info[i].width; | 			mw = info[i].width; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		XFree(info); | 		XFree(info); | ||||||
| 	} else | 	} else | ||||||
| #endif | #endif | ||||||
| @@ -647,11 +664,17 @@ setup(void) | |||||||
| 		if (!XGetWindowAttributes(dpy, parentwin, &wa)) | 		if (!XGetWindowAttributes(dpy, parentwin, &wa)) | ||||||
| 			die("could not get embedding window attributes: 0x%lx", | 			die("could not get embedding window attributes: 0x%lx", | ||||||
| 			    parentwin); | 			    parentwin); | ||||||
|  |  | ||||||
|  | 		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; | 			x = 0; | ||||||
| 			y = topbar ? 0 : wa.height - mh; | 			y = topbar ? 0 : wa.height - mh; | ||||||
| 			mw = wa.width; | 			mw = wa.width; | ||||||
| 		} | 		} | ||||||
| 	promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; | 	} | ||||||
| 	inputw = MIN(inputw, mw/3); | 	inputw = MIN(inputw, mw/3); | ||||||
| 	match(); | 	match(); | ||||||
|  |  | ||||||
| @@ -710,6 +733,8 @@ main(int argc, char *argv[]) | |||||||
| 			topbar = 0; | 			topbar = 0; | ||||||
| 		else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */ | 		else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */ | ||||||
| 			fast = 1; | 			fast = 1; | ||||||
|  | 		else if (!strcmp(argv[i], "-c"))   /* centers dmenu on screen */ | ||||||
|  | 			centered = 1; | ||||||
| 		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ | 		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ | ||||||
| 			fstrncmp = strncasecmp; | 			fstrncmp = strncasecmp; | ||||||
| 			fstrstr = cistrstr; | 			fstrstr = cistrstr; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user