diff --git a/config.def.h b/config.def.h index 1edb647..bd0fcef 100644 --- a/config.def.h +++ b/config.def.h @@ -21,3 +21,8 @@ static unsigned int lines = 0; * for example: " /?\"&[]" */ static const char worddelimiters[] = " "; + +/* tsv-alt: reverse the order of tab separation. + * 0 = displayoutput. 1 = outputdisplay + * can be reversed with -r as well */ +static int revtab = 0; diff --git a/dmenu.1 b/dmenu.1 index 323f93c..39c3492 100644 --- a/dmenu.1 +++ b/dmenu.1 @@ -3,7 +3,7 @@ dmenu \- dynamic menu .SH SYNOPSIS .B dmenu -.RB [ \-bfiv ] +.RB [ \-bfivr ] .RB [ \-l .IR lines ] .RB [ \-m @@ -80,6 +80,10 @@ prints version information to stdout, then exits. .TP .BI \-w " windowid" embed into windowid. +.TP +.B \-r +tsv-alt: reverse the behavior of tab separation. +.TP .SH USAGE dmenu is completely controlled by the keyboard. Items are selected using the arrow keys, page up, page down, home, and end. diff --git a/dmenu.c b/dmenu.c index 818313a..9783fc4 100644 --- a/dmenu.c +++ b/dmenu.c @@ -30,6 +30,7 @@ enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ struct item { char *text; + char *otext; struct item *left, *right; int out; }; @@ -105,7 +106,7 @@ cleanup(void) for (i = 0; i < SchemeLast; i++) free(scheme[i]); for (i = 0; items && items[i].text; ++i) - free(items[i].text); + free(revtab ? items[i].otext : items[i].text); free(items); drw_free(drw); XSync(dpy, False); @@ -490,7 +491,7 @@ insert: break; case XK_Return: case XK_KP_Enter: - puts((sel && !(ev->state & ShiftMask)) ? sel->text : text); + puts((sel && !(ev->state & ShiftMask)) ? sel->otext : text); if (!(ev->state & ControlMask)) { cleanup(); exit(0); @@ -560,11 +561,15 @@ readstdin(void) die("cannot realloc %zu bytes:", size); if (line[len - 1] == '\n') line[len - 1] = '\0'; - items[i].text = line; + items[i].text = items[i].otext = line; + if ((line = strchr(line, '\t'))) { + *line++ = '\0'; + revtab ? (items[i].text = line) : (items[i].otext = line); + } items[i].out = 0; } if (items) - items[i].text = NULL; + items[i].text = items[i].otext = NULL; lines = MIN(lines, i); } @@ -710,7 +715,7 @@ setup(void) static void usage(void) { - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" + fputs("usage: dmenu [-bfivr] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); exit(1); } @@ -733,7 +738,9 @@ main(int argc, char *argv[]) else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ fstrncmp = strncasecmp; fstrstr = cistrstr; - } else if (i + 1 == argc) + } else if (!strcmp(argv[i], "-r")) /* reverse the tab separation */ + revtab = (!revtab); + else if (i + 1 == argc) usage(); /* these options take one argument */ else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */