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 |