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. */ | ||||
|  | ||||
| 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" | ||||
|   | ||||
							
								
								
									
										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 | ||||
| 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. | ||||
|   | ||||
							
								
								
									
										39
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								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(); | ||||
|  | ||||
| @@ -710,6 +733,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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user