diff options
| author | zachir <zachir@librem.one> | 2023-02-21 14:12:54 -0600 | 
|---|---|---|
| committer | zachir <zachir@librem.one> | 2023-02-21 14:12:54 -0600 | 
| commit | f5e21c71896573cccd82fdb1a29cfb9a76818a87 (patch) | |
| tree | b2628e21444faa81ffe30998e5643e2165c43889 /dmenu.c | |
| parent | efffd811301f69ee1e91183c2356ccc8f5115c02 (diff) | |
add rejectnomatch patch
Diffstat (limited to 'dmenu.c')
| -rw-r--r-- | dmenu.c | 21 | 
1 files changed, 19 insertions, 2 deletions
@@ -46,6 +46,7 @@ static char * (*sepchr)(const char *, int);  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; @@ -433,12 +434,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 @@ -1010,7 +1025,7 @@ setup(void)  static void  usage(void)  { -	die("usage: dmenu [-bfivP] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" +	die("usage: dmenu [-bfirvP] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"  	    "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n"              "             [-nhb color] [-nhf color] [-shb color] [-shf color]\n"  	    "             [-d separator] [-D separator] [-h height]"); @@ -1038,8 +1053,10 @@ main(int argc, char *argv[])  		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */  			fstrncmp = strncasecmp;  			fstrstr = cistrstr; -		} else if (!strcmp(argv[i], "-P"))   /* is the input a password */ +		} 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 */  | 
