| dmenu-dynamicoptions-20200526-01e2dfc7.diff - sites - public wiki contents of s… | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| dmenu-dynamicoptions-20200526-01e2dfc7.diff (3809B) | |
| --- | |
| 1 From 01e2dfc79126a7600463b4cf9fa16b4be6886cae Mon Sep 17 00:00:00 2001 | |
| 2 From: Tiago Teles <[email protected]> | |
| 3 Date: Tue, 26 May 2020 19:55:55 +0100 | |
| 4 Subject: [PATCH] -dy flag for dynamic menu updating | |
| 5 | |
| 6 This patch adds a flag (`-dy`) which makes dmenu run the command given t… | |
| 7 whenever input is changed with the current input as the last argument and | |
| 8 update the option list according to the output of that command. | |
| 9 --- | |
| 10 config.def.h | 1 + | |
| 11 dmenu.c | 43 ++++++++++++++++++++++++++++++++++++------- | |
| 12 2 files changed, 37 insertions(+), 7 deletions(-) | |
| 13 | |
| 14 diff --git a/config.def.h b/config.def.h | |
| 15 index 1edb6477..035b8777 100644 | |
| 16 --- a/config.def.h | |
| 17 +++ b/config.def.h | |
| 18 @@ -7,6 +7,7 @@ static const char *fonts[] = { | |
| 19 "monospace:size=10" | |
| 20 }; | |
| 21 static const char *prompt = NULL; /* -p option; prompt to th… | |
| 22 +static const char *dynamic = NULL; /* -dy option; dynamic comm… | |
| 23 static const char *colors[SchemeLast][2] = { | |
| 24 /* fg bg */ | |
| 25 [SchemeNorm] = { "#bbbbbb", "#222222" }, | |
| 26 diff --git a/dmenu.c b/dmenu.c | |
| 27 index 6b8f51b5..356d4cc9 100644 | |
| 28 --- a/dmenu.c | |
| 29 +++ b/dmenu.c | |
| 30 @@ -210,9 +210,33 @@ grabkeyboard(void) | |
| 31 die("cannot grab keyboard"); | |
| 32 } | |
| 33 | |
| 34 +static void readstdin(FILE* stream); | |
| 35 + | |
| 36 +static void | |
| 37 +refreshoptions(){ | |
| 38 + int dynlen = strlen(dynamic); | |
| 39 + char* cmd= malloc(dynlen + strlen(text)+2); | |
| 40 + if(cmd == NULL) | |
| 41 + die("malloc:"); | |
| 42 + sprintf(cmd,"%s %s",dynamic, text); | |
| 43 + FILE *stream = popen(cmd, "r"); | |
| 44 + if(!stream) | |
| 45 + die("popen(%s):",cmd); | |
| 46 + readstdin(stream); | |
| 47 + int pc = pclose(stream); | |
| 48 + if(pc == -1) | |
| 49 + die("pclose:"); | |
| 50 + free(cmd); | |
| 51 + curr = sel = items; | |
| 52 +} | |
| 53 + | |
| 54 static void | |
| 55 match(void) | |
| 56 { | |
| 57 + if(dynamic && *dynamic){ | |
| 58 + refreshoptions(); | |
| 59 + } | |
| 60 + | |
| 61 static char **tokv = NULL; | |
| 62 static int tokn = 0; | |
| 63 | |
| 64 @@ -234,7 +258,7 @@ match(void) | |
| 65 for (i = 0; i < tokc; i++) | |
| 66 if (!fstrstr(item->text, tokv[i])) | |
| 67 break; | |
| 68 - if (i != tokc) /* not all tokens match */ | |
| 69 + if (i != tokc && !(dynamic && *dynamic)) /* not all tok… | |
| 70 continue; | |
| 71 /* exact matches go first, then prefixes, then substrin… | |
| 72 if (!tokc || !fstrncmp(text, item->text, textsize)) | |
| 73 @@ -519,14 +543,14 @@ paste(void) | |
| 74 } | |
| 75 | |
| 76 static void | |
| 77 -readstdin(void) | |
| 78 +readstdin(FILE* stream) | |
| 79 { | |
| 80 char buf[sizeof text], *p; | |
| 81 size_t i, imax = 0, size = 0; | |
| 82 unsigned int tmpmax = 0; | |
| 83 | |
| 84 /* read each line from stdin and add it to the item list */ | |
| 85 - for (i = 0; fgets(buf, sizeof buf, stdin); i++) { | |
| 86 + for (i = 0; fgets(buf, sizeof buf, stream); i++) { | |
| 87 if (i + 1 >= size / sizeof *items) | |
| 88 if (!(items = realloc(items, (size += BUFSIZ)))) | |
| 89 die("cannot realloc %u bytes:", size); | |
| 90 @@ -544,7 +568,8 @@ readstdin(void) | |
| 91 if (items) | |
| 92 items[i].text = NULL; | |
| 93 inputw = items ? TEXTW(items[imax].text) : 0; | |
| 94 - lines = MIN(lines, i); | |
| 95 + if (!dynamic || !*dynamic) | |
| 96 + lines = MIN(lines, i); | |
| 97 } | |
| 98 | |
| 99 static void | |
| 100 @@ -683,7 +708,7 @@ static void | |
| 101 usage(void) | |
| 102 { | |
| 103 fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [… | |
| 104 - " [-nb color] [-nf color] [-sb color] [-sf co… | |
| 105 + " [-nb color] [-nf color] [-sb color] [-sf co… | |
| 106 exit(1); | |
| 107 } | |
| 108 | |
| 109 @@ -726,6 +751,8 @@ main(int argc, char *argv[]) | |
| 110 colors[SchemeSel][ColFg] = argv[++i]; | |
| 111 else if (!strcmp(argv[i], "-w")) /* embedding window … | |
| 112 embed = argv[++i]; | |
| 113 + else if (!strcmp(argv[i], "-dy")) /* dynamic command t… | |
| 114 + dynamic = argv[++i]; | |
| 115 else | |
| 116 usage(); | |
| 117 | |
| 118 @@ -754,9 +781,11 @@ main(int argc, char *argv[]) | |
| 119 | |
| 120 if (fast && !isatty(0)) { | |
| 121 grabkeyboard(); | |
| 122 - readstdin(); | |
| 123 + if(!(dynamic && *dynamic)) | |
| 124 + readstdin(stdin); | |
| 125 } else { | |
| 126 - readstdin(); | |
| 127 + if(!(dynamic && *dynamic)) | |
| 128 + readstdin(stdin); | |
| 129 grabkeyboard(); | |
| 130 } | |
| 131 setup(); | |
| 132 -- | |
| 133 2.26.2 | |
| 134 |