-r to restrict input to actual options
This commit is contained in:
		
							parent
							
								
									ef9e3d2439
								
							
						
					
					
						commit
						96608c36b5
					
				| @ -5,6 +5,9 @@ Extra stuff added to vanilla dmenu: | ||||
| - reads Xresources (ergo pywal compatible) | ||||
| - alpha patch, which importantly allows this build to be embedded in transparent st | ||||
| - can view color characters like emoji (libxft-bgra is required for this reason) | ||||
| - `-P` for password mode: hide user imput | ||||
| - `-r` to reject non-matching input | ||||
| - dmenu options are mouse clickable | ||||
| 
 | ||||
| ## Installation | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										5
									
								
								dmenu.1
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								dmenu.1
									
									
									
									
									
								
							| @ -3,7 +3,7 @@ | ||||
| dmenu \- dynamic menu | ||||
| .SH SYNOPSIS | ||||
| .B dmenu | ||||
| .RB [ \-bfivP ] | ||||
| .RB [ \-bfirvP ] | ||||
| .RB [ \-l | ||||
| .IR lines ] | ||||
| .RB [ \-m | ||||
| @ -50,6 +50,9 @@ dmenu matches menu items case insensitively. | ||||
| .B \-P | ||||
| dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored. | ||||
| .TP | ||||
| .B \-r | ||||
| dmenu will reject any input which would result in no matching option left. | ||||
| .TP | ||||
| .BI \-l " lines" | ||||
| dmenu lists items vertically, with the given number of lines. | ||||
| .TP | ||||
|  | ||||
							
								
								
									
										19
									
								
								dmenu.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								dmenu.c
									
									
									
									
									
								
							| @ -43,6 +43,7 @@ static char *embed; | ||||
| static int bh, mw, mh; | ||||
| static int inputw = 0, promptw, passwd = 0; | ||||
| static int lrpad; /* sum of left and right padding */ | ||||
| static int reject_no_match = 0; | ||||
| static size_t cursor; | ||||
| static struct item *items = NULL; | ||||
| static struct item *matches, *matchend; | ||||
| @ -323,12 +324,26 @@ insert(const char *str, ssize_t n) | ||||
| { | ||||
| 	if (strlen(text) + n > sizeof text - 1) | ||||
| 		return; | ||||
| 
 | ||||
| 	static char last[BUFSIZ] = ""; | ||||
| 	if(reject_no_match) { | ||||
| 		/* store last text value in case we need to revert it */ | ||||
| 		memcpy(last, text, BUFSIZ); | ||||
| 	} | ||||
| 
 | ||||
| 	/* move existing text out of the way, insert new text, and update cursor */ | ||||
| 	memmove(&text[cursor + n], &text[cursor], sizeof text - cursor - MAX(n, 0)); | ||||
| 	if (n > 0) | ||||
| 		memcpy(&text[cursor], str, n); | ||||
| 	cursor += n; | ||||
| 	match(); | ||||
| 
 | ||||
| 	if(!matches && reject_no_match) { | ||||
| 		/* revert to last text value if theres no match */ | ||||
| 		memcpy(text, last, BUFSIZ); | ||||
| 		cursor -= n; | ||||
| 		match(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| static size_t | ||||
| @ -860,7 +875,7 @@ setup(void) | ||||
| static void | ||||
| usage(void) | ||||
| { | ||||
| 	fputs("usage: dmenu [-bfiPv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" | ||||
| 	fputs("usage: dmenu [-bfiPrv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" | ||||
| 	      "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); | ||||
| 	exit(1); | ||||
| } | ||||
| @ -910,6 +925,8 @@ main(int argc, char *argv[]) | ||||
| 			fstrstr = cistrstr; | ||||
| 		} else if (!strcmp(argv[i], "-P"))   /* is the input a password */ | ||||
| 		        passwd = 1; | ||||
| 		else if (!strcmp(argv[i], "-r")) /* reject input which results in no match */ | ||||
| 			reject_no_match = 1; | ||||
| 		else if (i + 1 == argc) | ||||
| 			usage(); | ||||
| 		/* these options take one argument */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Luke Smith
						Luke Smith