commit 56b381636adaa3ea805b55a348fbbc3e68cbf315 from: Benjamin Stürz date: Wed Dec 27 19:54:39 2023 UTC dmenu: Add delimiter patch https://tools.suckless.org/dmenu/patches/tmenu/ commit - df2b2484dd3a1152d1815c544fd1401c695e0a23 commit + 56b381636adaa3ea805b55a348fbbc3e68cbf315 blob - da01b4c1f2b579312f717f99393879f3a678592f blob + 9ebae2d86c95385cd901641b5d15386944540fa2 --- dmenu/config.h +++ dmenu/config.h @@ -26,5 +26,8 @@ static unsigned int lines = 0; */ 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 @@ -50,6 +50,9 @@ dmenu matches menu items case insensitively. .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 @@ -32,7 +32,7 @@ enum { SchemeNorm, SchemeSel, SchemeOut, SchemeNormHighlight, SchemeSelHighlight, SchemeLast }; /* color schemes */ struct item { - char *text; + char *text, *value; struct item *left, *right; int out; double distance; @@ -109,8 +109,8 @@ cleanup(void) 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); @@ -645,7 +645,7 @@ insert: 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); @@ -704,7 +704,7 @@ paste(void) static void readstdin(void) { - char *line = NULL; + char *line = NULL, *text; size_t i, junk, size = 0; ssize_t len; @@ -720,11 +720,19 @@ readstdin(void) 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); } @@ -870,7 +878,7 @@ setup(void) 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]"); } @@ -899,6 +907,8 @@ main(int argc, char *argv[]) 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"))