| dmenu-tsv-alt-20220919-fce06f4.diff - sites - public wiki contents of suckless.… | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| 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 usi… | |
| 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 };… | |
| 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 : te… | |
| 64 + puts((sel && !(ev->state & ShiftMask)) ? sel->otext : t… | |
| 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].ote… | |
| 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] [… | |
| 91 + fputs("usage: dmenu [-bfivr] [-l lines] [-p prompt] [-fn font] … | |
| 92 " [-nb color] [-nf color] [-sb color] [-sf co… | |
| 93 exit(1); | |
| 94 } | |
| 95 @@ -733,7 +738,9 @@ main(int argc, char *argv[]) | |
| 96 else if (!strcmp(argv[i], "-i")) { /* case-insensitive … | |
| 97 fstrncmp = strncasecmp; | |
| 98 fstrstr = cistrstr; | |
| 99 - } else if (i + 1 == argc) | |
| 100 + } else if (!strcmp(argv[i], "-r")) /* reverse the tab s… | |
| 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 i… |