mirror of
https://github.com/mintycube/dmenu.git
synced 2024-10-22 14:05:48 +02:00
dc169b1971
This patch is simpler than, and superior to, the TSV patch and as such takes precedence if both are combined. Also addressed some compatibility issues and compilation errors.
91 lines
2.2 KiB
C
91 lines
2.2 KiB
C
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;
|
|
}
|
|
} |