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 */ |