--- config.def.h | 1 + dmenu.c | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/config.def.h b/config.def.h index 1edb647..035b877 100644 --- a/config.def.h +++ b/config.def.h _AT_@ -7,6 +7,7 @@ static const char *fonts[] = { "monospace:size=10" }; static const char *prompt = NULL; /* -p option; prompt to the left of input field */ +static const char *dynamic = NULL; /* -dy option; dynamic command to run on input change */ static const char *colors[SchemeLast][2] = { /* fg bg */ [SchemeNorm] = { "#bbbbbb", "#222222" }, diff --git a/dmenu.c b/dmenu.c index 6b8f51b..6a0eb01 100644 --- a/dmenu.c +++ b/dmenu.c _AT_@ -210,9 +210,28 @@ grabkeyboard(void) die("cannot grab keyboard"); } +static void readstdin(FILE* stream); + +static void +refreshoptions(){ + int dynlen = strlen(dynamic); + char cmd[dynlen + strlen(text)]; + strcpy(cmd, dynamic); + cmd[dynlen] = ' '; + strcpy(&cmd[dynlen] + 1, text); + FILE *stream = popen(cmd, "r"); + readstdin(stream); + pclose(stream); + curr = sel = items; +} + static void match(void) { + if(dynamic && *dynamic){ + refreshoptions(); + } + static char **tokv = NULL; static int tokn = 0; _AT_@ -234,7 +253,7 @@ match(void) for (i = 0; i < tokc; i++) if (!fstrstr(item->text, tokv[i])) break; - if (i != tokc) /* not all tokens match */ + if (i != tokc && !(dynamic && *dynamic)) /* not all tokens match */ continue; /* exact matches go first, then prefixes, then substrings */ if (!tokc || !fstrncmp(text, item->text, textsize)) _AT_@ -519,14 +538,14 @@ paste(void) } static void -readstdin(void) +readstdin(FILE* stream) { char buf[sizeof text], *p; size_t i, imax = 0, size = 0; unsigned int tmpmax = 0; /* read each line from stdin and add it to the item list */ - for (i = 0; fgets(buf, sizeof buf, stdin); i++) { + for (i = 0; fgets(buf, sizeof buf, stream); i++) { if (i + 1 >= size / sizeof *items) if (!(items = realloc(items, (size += BUFSIZ)))) die("cannot realloc %u bytes:", size); _AT_@ -544,7 +563,8 @@ readstdin(void) if (items) items[i].text = NULL; inputw = items ? TEXTW(items[imax].text) : 0; - lines = MIN(lines, i); + if (!dynamic || !*dynamic) + lines = MIN(lines, i); } static void _AT_@ -683,7 +703,7 @@ static void usage(void) { fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" - " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); + " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n" "[-dy command]\n", stderr); exit(1); } _AT_@ -726,6 +746,8 @@ main(int argc, char *argv[]) colors[SchemeSel][ColFg] = argv[++i]; else if (!strcmp(argv[i], "-w")) /* embedding window id */ embed = argv[++i]; + else if (!strcmp(argv[i], "-dy")) /* dynamic command to run */ + dynamic = argv[++i]; else usage(); _AT_@ -754,9 +776,11 @@ main(int argc, char *argv[]) if (fast && !isatty(0)) { grabkeyboard(); - readstdin(); + if(!(dynamic && *dynamic)) + readstdin(stdin); } else { - readstdin(); + if(!(dynamic && *dynamic)) + readstdin(stdin); grabkeyboard(); } setup(); -- 2.26.2Received on Tue May 26 2020 - 14:47:14 CEST
This archive was generated by hypermail 2.3.0 : Tue May 26 2020 - 15:00:38 CEST