commit - df2b2484dd3a1152d1815c544fd1401c695e0a23
commit + 56b381636adaa3ea805b55a348fbbc3e68cbf315
blob - da01b4c1f2b579312f717f99393879f3a678592f
blob + 9ebae2d86c95385cd901641b5d15386944540fa2
--- dmenu/config.h
+++ dmenu/config.h
*/
static const char worddelimiters[] = " ";
+/* delimiter for tmenu */
+static char valuedelimiter = '\0';
+
/* Character to be shown, when entering a password. */
static char pwcensorchar = '*';
blob - 762f7071c23f0a2bc3b2c872695fdb9cdc5317fd
blob + bed6f3e1da40eaac4a9cf7cb546b847fe2d5f8ca
--- dmenu/dmenu.1
+++ dmenu/dmenu.1
.B \-P
dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored.
.TP
+.BI \-d " delimiter"
+when used in a line, the value after the delimiter will be displayed. When selected, the value before the delimiter will be output. Only uses a single char as the delimiter.
+.TP
.BI \-l " lines"
dmenu lists items vertically, with the given number of lines.
.TP
blob - fa3606efa7e0841ca21c9e66f16d168406ba2048
blob + c55b1c10e3f2568ab338cb887e353dee1e465a00
--- dmenu/dmenu.c
+++ dmenu/dmenu.c
enum { SchemeNorm, SchemeSel, SchemeOut, SchemeNormHighlight, SchemeSelHighlight, SchemeLast }; /* color schemes */
struct item {
- char *text;
+ char *text, *value;
struct item *left, *right;
int out;
double distance;
XUngrabKey(dpy, AnyKey, AnyModifier, root);
for (i = 0; i < SchemeLast; i++)
free(scheme[i]);
- for (i = 0; items && items[i].text; ++i)
- free(items[i].text);
+ for (i = 0; items && items[i].value; ++i)
+ free(items[i].value);
free(items);
drw_free(drw);
XSync(dpy, False);
break;
case XK_Return:
case XK_KP_Enter:
- puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
+ puts((sel && !(ev->state & ShiftMask)) ? sel->value : text);
if (!(ev->state & ControlMask)) {
cleanup();
exit(0);
static void
readstdin(void)
{
- char *line = NULL;
+ char *line = NULL, *text;
size_t i, junk, size = 0;
ssize_t len;
die("cannot realloc %zu bytes:", size);
if (line[len - 1] == '\n')
line[len - 1] = '\0';
- items[i].text = line;
+ if (valuedelimiter != '\0' && (text = strchr(line, valuedelimiter)) != NULL) {
+ items[i].text = text + 1;
+ text[0] = '\0';
+ } else {
+ items[i].text = line;
+ }
+ items[i].value = line;
items[i].out = 0;
}
- if (items)
+ if (items) {
items[i].text = NULL;
+ items[i].value = NULL;
+ }
lines = MIN(lines, i);
}
static void
usage(void)
{
- die("usage: dmenu [-bfivP] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+ die("usage: dmenu [-bfivP] [-d delim] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
" [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
}
else if (i + 1 == argc)
usage();
/* these options take one argument */
+ else if (!strcmp(argv[i], "-d")) /* delimiter for tmenu */
+ valuedelimiter = argv[++i][0];
else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */
lines = atoi(argv[++i]);
else if (!strcmp(argv[i], "-m"))