dmenu-tsv-alt-20220919-fce06f4.diff (3005B)
1 diff --git a/config.def.h b/config.def.h 2 index 1edb647..bd0fcef 100644 3 --- a/config.def.h 4 +++ b/config.def.h 5 @@ -21,3 +21,8 @@ static unsigned int lines = 0; 6 * for example: " /?\"&[]" 7 */ 8 static const char worddelimiters[] = " "; 9 + 10 +/* tsv-alt: reverse the order of tab separation. 11 + * 0 = display<TAB>output. 1 = output<TAB>display 12 + * can be reversed with -r as well */ 13 +static int revtab = 0; 14 diff --git a/dmenu.1 b/dmenu.1 15 index 323f93c..39c3492 100644 16 --- a/dmenu.1 17 +++ b/dmenu.1 18 @@ -3,7 +3,7 @@ 19 dmenu \- dynamic menu 20 .SH SYNOPSIS 21 .B dmenu 22 -.RB [ \-bfiv ] 23 +.RB [ \-bfivr ] 24 .RB [ \-l 25 .IR lines ] 26 .RB [ \-m 27 @@ -80,6 +80,10 @@ prints version information to stdout, then exits. 28 .TP 29 .BI \-w " windowid" 30 embed into windowid. 31 +.TP 32 +.B \-r 33 +tsv-alt: reverse the behavior of tab separation. 34 +.TP 35 .SH USAGE 36 dmenu is completely controlled by the keyboard. Items are selected using the 37 arrow keys, page up, page down, home, and end. 38 diff --git a/dmenu.c b/dmenu.c 39 index 818313a..9783fc4 100644 40 --- a/dmenu.c 41 +++ b/dmenu.c 42 @@ -30,6 +30,7 @@ enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ 43 44 struct item { 45 char *text; 46 + char *otext; 47 struct item *left, *right; 48 int out; 49 }; 50 @@ -105,7 +106,7 @@ cleanup(void) 51 for (i = 0; i < SchemeLast; i++) 52 free(scheme[i]); 53 for (i = 0; items && items[i].text; ++i) 54 - free(items[i].text); 55 + free(revtab ? items[i].otext : items[i].text); 56 free(items); 57 drw_free(drw); 58 XSync(dpy, False); 59 @@ -490,7 +491,7 @@ insert: 60 break; 61 case XK_Return: 62 case XK_KP_Enter: 63 - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); 64 + puts((sel && !(ev->state & ShiftMask)) ? sel->otext : text); 65 if (!(ev->state & ControlMask)) { 66 cleanup(); 67 exit(0); 68 @@ -560,11 +561,15 @@ readstdin(void) 69 die("cannot realloc %zu bytes:", size); 70 if (line[len - 1] == '\n') 71 line[len - 1] = '\0'; 72 - items[i].text = line; 73 + items[i].text = items[i].otext = line; 74 + if ((line = strchr(line, '\t'))) { 75 + *line++ = '\0'; 76 + revtab ? (items[i].text = line) : (items[i].otext = line); 77 + } 78 items[i].out = 0; 79 } 80 if (items) 81 - items[i].text = NULL; 82 + items[i].text = items[i].otext = NULL; 83 lines = MIN(lines, i); 84 } 85 86 @@ -710,7 +715,7 @@ setup(void) 87 static void 88 usage(void) 89 { 90 - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 91 + fputs("usage: dmenu [-bfivr] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 92 " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); 93 exit(1); 94 } 95 @@ -733,7 +738,9 @@ main(int argc, char *argv[]) 96 else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ 97 fstrncmp = strncasecmp; 98 fstrstr = cistrstr; 99 - } else if (i + 1 == argc) 100 + } else if (!strcmp(argv[i], "-r")) /* reverse the tab separation */ 101 + revtab = (!revtab); 102 + else if (i + 1 == argc) 103 usage(); 104 /* these options take one argument */ 105 else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */