dmenu-instant-20160702-3c91eed.diff (2048B)
1 diff --git a/config.def.h b/config.def.h 2 index dcffd38..a42d28b 100644 3 --- a/config.def.h 4 +++ b/config.def.h 5 @@ -1,6 +1,7 @@ 6 /* See LICENSE file for copyright and license details. */ 7 /* Default settings; can be overriden by command line. */ 8 9 +static int instant = 0; 10 static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ 11 /* -fn option overrides fonts[0]; default X11 font or font set */ 12 static const char *fonts[] = { 13 diff --git a/dmenu.1 b/dmenu.1 14 index d3ab805..8806d4d 100644 15 --- a/dmenu.1 16 +++ b/dmenu.1 17 @@ -6,6 +6,7 @@ dmenu \- dynamic menu 18 .RB [ \-b ] 19 .RB [ \-f ] 20 .RB [ \-i ] 21 +.RB [ \-n ] 22 .RB [ \-l 23 .RB [ \-m 24 .IR monitor ] 25 @@ -48,6 +49,9 @@ X until stdin reaches end\-of\-file. 26 .B \-i 27 dmenu matches menu items case insensitively. 28 .TP 29 +.B \-n 30 +dmenu instantly selects if only one match. 31 +.TP 32 .BI \-l " lines" 33 dmenu lists items vertically, with the given number of lines. 34 .TP 35 diff --git a/dmenu.c b/dmenu.c 36 index e0c2f80..f079479 100644 37 --- a/dmenu.c 38 +++ b/dmenu.c 39 @@ -250,6 +250,13 @@ match(void) 40 matchend = substrend; 41 } 42 curr = sel = matches; 43 + 44 + if(instant && matches && matches==matchend && !lsubstr) { 45 + puts(matches->text); 46 + cleanup(); 47 + exit(0); 48 + } 49 + 50 calcoffsets(); 51 } 52 53 @@ -610,7 +617,7 @@ setup(void) 54 static void 55 usage(void) 56 { 57 - fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 58 + fputs("usage: dmenu [-b] [-f] [-i] [-n] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 59 " [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr); 60 exit(1); 61 } 62 @@ -632,7 +639,9 @@ main(int argc, char *argv[]) 63 else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ 64 fstrncmp = strncasecmp; 65 fstrstr = cistrstr; 66 - } else if (i + 1 == argc) 67 + } else if (!strcmp(argv[i], "-n")) /* instant select only match */ 68 + instant = 1; 69 + else if (i + 1 == argc) 70 usage(); 71 /* these options take one argument */ 72 else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */