| dmenu-rejectnomatch-4.7.diff - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| dmenu-rejectnomatch-4.7.diff (2358B) | |
| --- | |
| 1 diff --git a/dmenu.1 b/dmenu.1 | |
| 2 index 9eab758..61084ab 100644 | |
| 3 --- a/dmenu.1 | |
| 4 +++ b/dmenu.1 | |
| 5 @@ -3,7 +3,7 @@ | |
| 6 dmenu \- dynamic menu | |
| 7 .SH SYNOPSIS | |
| 8 .B dmenu | |
| 9 -.RB [ \-bfiv ] | |
| 10 +.RB [ \-bfirv ] | |
| 11 .RB [ \-l | |
| 12 .IR lines ] | |
| 13 .RB [ \-m | |
| 14 @@ -47,6 +47,9 @@ X until stdin reaches end\-of\-file. | |
| 15 .B \-i | |
| 16 dmenu matches menu items case insensitively. | |
| 17 .TP | |
| 18 +.B \-r | |
| 19 +dmenu will reject any input which would result in no matching option le… | |
| 20 +.TP | |
| 21 .BI \-l " lines" | |
| 22 dmenu lists items vertically, with the given number of lines. | |
| 23 .TP | |
| 24 diff --git a/dmenu.c b/dmenu.c | |
| 25 index d605ab4..7505278 100644 | |
| 26 --- a/dmenu.c | |
| 27 +++ b/dmenu.c | |
| 28 @@ -38,6 +38,7 @@ static char *embed; | |
| 29 static int bh, mw, mh; | |
| 30 static int inputw = 0, promptw; | |
| 31 static int lrpad; /* sum of left and right padding */ | |
| 32 +static int reject_no_match = 0; | |
| 33 static size_t cursor; | |
| 34 static struct item *items = NULL; | |
| 35 static struct item *matches, *matchend; | |
| 36 @@ -268,12 +269,26 @@ insert(const char *str, ssize_t n) | |
| 37 { | |
| 38 if (strlen(text) + n > sizeof text - 1) | |
| 39 return; | |
| 40 + | |
| 41 + static char last[BUFSIZ] = ""; | |
| 42 + if(reject_no_match) { | |
| 43 + /* store last text value in case we need to revert it */ | |
| 44 + memcpy(last, text, BUFSIZ); | |
| 45 + } | |
| 46 + | |
| 47 /* move existing text out of the way, insert new text, and upda… | |
| 48 memmove(&text[cursor + n], &text[cursor], sizeof text - cursor … | |
| 49 if (n > 0) | |
| 50 memcpy(&text[cursor], str, n); | |
| 51 cursor += n; | |
| 52 match(); | |
| 53 + | |
| 54 + if(!matches && reject_no_match) { | |
| 55 + /* revert to last text value if theres no match */ | |
| 56 + memcpy(text, last, BUFSIZ); | |
| 57 + cursor -= n; | |
| 58 + match(); | |
| 59 + } | |
| 60 } | |
| 61 | |
| 62 static size_t | |
| 63 @@ -636,7 +651,7 @@ setup(void) | |
| 64 static void | |
| 65 usage(void) | |
| 66 { | |
| 67 - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [… | |
| 68 + fputs("usage: dmenu [-bfirv] [-l lines] [-p prompt] [-fn font] … | |
| 69 " [-nb color] [-nf color] [-sb color] [-sf co… | |
| 70 exit(1); | |
| 71 } | |
| 72 @@ -659,7 +674,9 @@ main(int argc, char *argv[]) | |
| 73 else if (!strcmp(argv[i], "-i")) { /* case-insensitive … | |
| 74 fstrncmp = strncasecmp; | |
| 75 fstrstr = cistrstr; | |
| 76 - } else if (i + 1 == argc) | |
| 77 + } else if (!strcmp(argv[i], "-r")) /* reject input whic… | |
| 78 + reject_no_match = 1; | |
| 79 + else if (i + 1 == argc) | |
| 80 usage(); | |
| 81 /* these options take one argument */ | |
| 82 else if (!strcmp(argv[i], "-l")) /* number of lines i… |