mirror of
https://github.com/eRgo35/dots.git
synced 2025-12-16 23:46:13 +01:00
moving software to separate submodules part 1
This commit is contained in:
91
desktop/.dmenu/patch/dynamicoptions.c
Normal file
91
desktop/.dmenu/patch/dynamicoptions.c
Normal file
@@ -0,0 +1,91 @@
|
||||
static void
|
||||
refreshoptions()
|
||||
{
|
||||
int dynlen = strlen(dynamic);
|
||||
char* cmd= malloc(dynlen + strlen(text) + 2);
|
||||
if (cmd == NULL)
|
||||
die("malloc:");
|
||||
sprintf(cmd, "%s %s", dynamic, text);
|
||||
FILE *stream = popen(cmd, "r");
|
||||
if (!stream)
|
||||
die("popen(%s):", cmd);
|
||||
readstream(stream);
|
||||
int pc = pclose(stream);
|
||||
if (pc == -1)
|
||||
die("pclose:");
|
||||
free(cmd);
|
||||
curr = sel = items;
|
||||
}
|
||||
|
||||
static void
|
||||
readstream(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, stream); i++) {
|
||||
if (i + 1 >= size / sizeof *items)
|
||||
if (!(items = realloc(items, (size += BUFSIZ))))
|
||||
die("cannot realloc %u bytes:", size);
|
||||
if ((p = strchr(buf, '\n')))
|
||||
*p = '\0';
|
||||
if (!(items[i].text = strdup(buf)))
|
||||
die("cannot strdup %u bytes:", strlen(buf) + 1);
|
||||
#if SEPARATOR_PATCH
|
||||
if (separator && (p = separator_greedy ?
|
||||
strrchr(items[i].text, separator) : strchr(items[i].text, separator))) {
|
||||
*p = '\0';
|
||||
items[i].text_output = ++p;
|
||||
} else {
|
||||
items[i].text_output = items[i].text;
|
||||
}
|
||||
if (separator_reverse) {
|
||||
p = items[i].text;
|
||||
items[i].text = items[i].text_output;
|
||||
items[i].text_output = p;
|
||||
}
|
||||
#elif TSV_PATCH
|
||||
if ((p = strchr(buf, '\t')))
|
||||
*p = '\0';
|
||||
if (!(items[i].stext = strdup(buf)))
|
||||
die("cannot strdup %u bytes:", strlen(buf) + 1);
|
||||
#endif // TSV_PATCH
|
||||
#if MULTI_SELECTION_PATCH
|
||||
items[i].id = i;
|
||||
#else
|
||||
items[i].out = 0;
|
||||
#endif // MULTI_SELECTION_PATCH
|
||||
#if HIGHPRIORITY_PATCH
|
||||
items[i].hp = arrayhas(hpitems, hplength, items[i].text);
|
||||
#endif // HIGHPRIORITY_PATCH
|
||||
#if PANGO_PATCH
|
||||
drw_font_getexts(drw->font, buf, strlen(buf), &tmpmax, NULL, True);
|
||||
#else
|
||||
drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL);
|
||||
#endif // PANGO_PATCH
|
||||
if (tmpmax > inputw) {
|
||||
inputw = tmpmax;
|
||||
imax = i;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the command did not give any output at all, then do not clear the existing items */
|
||||
if (!i)
|
||||
return;
|
||||
|
||||
if (items)
|
||||
items[i].text = NULL;
|
||||
#if PANGO_PATCH
|
||||
inputw = items ? TEXTWM(items[imax].text) : 0;
|
||||
#else
|
||||
inputw = items ? TEXTW(items[imax].text) : 0;
|
||||
#endif // PANGO_PATCH
|
||||
if (!dynamic || !*dynamic)
|
||||
lines = MIN(lines, i);
|
||||
else {
|
||||
text[0] = '\0';
|
||||
cursor = 0;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user