Commit Diff


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"))