From abc8bfeaaa5e62ce957d8a33ad1f5ca7c793513e Mon Sep 17 00:00:00 2001 From: Max Schillinger Date: Sat, 13 Jul 2024 21:06:57 +0200 Subject: [PATCH] tsv-alt patch for dmenu 5.3 --- config.def.h | 5 +++++ dmenu.1 | 6 +++++- dmenu.c | 21 ++++++++++++++------- 3 files changed, 24 insertions(+), 8 deletions(-) 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..e767276 100644 --- a/dmenu.1 +++ b/dmenu.1 @@ -3,7 +3,7 @@ dmenu \- dynamic menu .SH SYNOPSIS .B dmenu -.RB [ \-bfiv ] +.RB [ \-bfirv ] .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 40f93e0..bee6b19 100644 --- a/dmenu.c +++ b/dmenu.c @@ -29,6 +29,7 @@ enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ struct item { char *text; + char *otext; struct item *left, *right; int out; }; @@ -104,7 +105,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); @@ -489,7 +490,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); @@ -548,7 +549,7 @@ paste(void) static void readstdin(void) { - char *line = NULL; + char *line = NULL, *tmp; size_t i, itemsiz = 0, linesiz = 0; ssize_t len; @@ -561,14 +562,18 @@ readstdin(void) } if (line[len - 1] == '\n') line[len - 1] = '\0'; - if (!(items[i].text = strdup(line))) + if (!(items[i].text = items[i].otext = strdup(line))) die("strdup:"); + if ((tmp = strchr(items[i].text, '\t'))) { + *tmp++ = '\0'; + revtab ? (items[i].text = tmp) : (items[i].otext = tmp); + } items[i].out = 0; } free(line); if (items) - items[i].text = NULL; + items[i].text = items[i].otext = NULL; lines = MIN(lines, i); } @@ -715,7 +720,7 @@ setup(void) static void usage(void) { - die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" + die("usage: dmenu [-bfirv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); } @@ -737,7 +742,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 */ -- 2.45.2