dmenu-tmenu-5.2.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
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"))