summaryrefslogtreecommitdiff
path: root/dmenu.c
diff options
context:
space:
mode:
authorzachir <zachir@librem.one>2023-02-21 14:12:54 -0600
committerzachir <zachir@librem.one>2023-02-21 14:12:54 -0600
commitf5e21c71896573cccd82fdb1a29cfb9a76818a87 (patch)
treeb2628e21444faa81ffe30998e5643e2165c43889 /dmenu.c
parentefffd811301f69ee1e91183c2356ccc8f5115c02 (diff)
add rejectnomatch patch
Diffstat (limited to 'dmenu.c')
-rw-r--r--dmenu.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/dmenu.c b/dmenu.c
index f698d44..442ca3d 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -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 */