dmenu-tmenu-5.2.diff (3079B)
1 diff --git a/config.def.h b/config.def.h 2 index 1edb647..805d8c4 100644 3 --- a/config.def.h 4 +++ b/config.def.h 5 @@ -21,3 +21,6 @@ static unsigned int lines = 0; 6 * for example: " /?\"&[]" 7 */ 8 static const char worddelimiters[] = " "; 9 + 10 +/* delimiter for tmenu */ 11 +static char valuedelimiter = '\t'; 12 diff --git a/dmenu.1 b/dmenu.1 13 index 323f93c..fb22ed3 100644 14 --- a/dmenu.1 15 +++ b/dmenu.1 16 @@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file. 17 .B \-i 18 dmenu matches menu items case insensitively. 19 .TP 20 +.BI \-d " tmenu delimiter" 21 +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. 22 +.TP 23 .BI \-l " lines" 24 dmenu lists items vertically, with the given number of lines. 25 .TP 26 diff --git a/dmenu.c b/dmenu.c 27 index 27b7a30..b586a40 100644 28 --- a/dmenu.c 29 +++ b/dmenu.c 30 @@ -29,7 +29,7 @@ 31 enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ 32 33 struct item { 34 - char *text; 35 + char *text, *value; 36 struct item *left, *right; 37 int out; 38 }; 39 @@ -104,8 +104,8 @@ cleanup(void) 40 XUngrabKey(dpy, AnyKey, AnyModifier, root); 41 for (i = 0; i < SchemeLast; i++) 42 free(scheme[i]); 43 - for (i = 0; items && items[i].text; ++i) 44 - free(items[i].text); 45 + for (i = 0; items && items[i].value; ++i) 46 + free(items[i].value); 47 free(items); 48 drw_free(drw); 49 XSync(dpy, False); 50 @@ -490,7 +490,7 @@ insert: 51 break; 52 case XK_Return: 53 case XK_KP_Enter: 54 - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); 55 + puts((sel && !(ev->state & ShiftMask)) ? sel->value : text); 56 if (!(ev->state & ControlMask)) { 57 cleanup(); 58 exit(0); 59 @@ -549,7 +549,7 @@ paste(void) 60 static void 61 readstdin(void) 62 { 63 - char *line = NULL; 64 + char *line = NULL, *text; 65 size_t i, junk, itemsiz = 0; 66 ssize_t len; 67 68 @@ -562,13 +562,22 @@ readstdin(void) 69 } 70 if (line[len - 1] == '\n') 71 line[len - 1] = '\0'; 72 - items[i].text = line; 73 + 74 + if ((text = strchr(line, valuedelimiter)) != NULL) { 75 + items[i].text = text + 1; 76 + text[0] = '\0'; 77 + } else { 78 + items[i].text = line; 79 + } 80 + items[i].value = line; 81 items[i].out = 0; 82 line = NULL; /* next call of getline() allocates a new line */ 83 } 84 free(line); 85 - if (items) 86 + if (items) { 87 items[i].text = NULL; 88 + items[i].value = NULL; 89 + } 90 lines = MIN(lines, i); 91 } 92 93 @@ -714,7 +723,7 @@ setup(void) 94 static void 95 usage(void) 96 { 97 - die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 98 + die("usage: dmenu [-bfiv] [-d tmenu-delim] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 99 " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); 100 } 101 102 @@ -739,6 +748,8 @@ main(int argc, char *argv[]) 103 } else if (i + 1 == argc) 104 usage(); 105 /* these options take one argument */ 106 + else if (!strcmp(argv[i], "-d")) /* delimiter for tmenu */ 107 + valuedelimiter = argv[++i][0]; 108 else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ 109 lines = atoi(argv[++i]); 110 else if (!strcmp(argv[i], "-m"))