diff options
-rwxr-xr-x | dmenu | bin | 0 -> 44544 bytes | |||
-rw-r--r-- | dmenu.1 | 5 | ||||
-rw-r--r-- | dmenu.c | 21 | ||||
-rwxr-xr-x | stest | bin | 0 -> 17680 bytes |
4 files changed, 21 insertions, 5 deletions
Binary files differ | |||
@@ -3,7 +3,7 @@ | |||
3 | dmenu \- dynamic menu | 3 | dmenu \- dynamic menu |
4 | .SH SYNOPSIS | 4 | .SH SYNOPSIS |
5 | .B dmenu | 5 | .B dmenu |
6 | .RB [ \-bfiv ] | 6 | .RB [ \-bfivP ] |
7 | .RB [ \-l | 7 | .RB [ \-l |
8 | .IR lines ] | 8 | .IR lines ] |
9 | .RB [ \-m | 9 | .RB [ \-m |
@@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file. | |||
47 | .B \-i | 47 | .B \-i |
48 | dmenu matches menu items case insensitively. | 48 | dmenu matches menu items case insensitively. |
49 | .TP | 49 | .TP |
50 | .B \-P | ||
51 | dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored. | ||
52 | .TP | ||
50 | .BI \-l " lines" | 53 | .BI \-l " lines" |
51 | dmenu lists items vertically, with the given number of lines. | 54 | dmenu lists items vertically, with the given number of lines. |
52 | .TP | 55 | .TP |
@@ -41,7 +41,7 @@ struct item { | |||
41 | static char text[BUFSIZ] = ""; | 41 | static char text[BUFSIZ] = ""; |
42 | static char *embed; | 42 | static char *embed; |
43 | static int bh, mw, mh; | 43 | static int bh, mw, mh; |
44 | static int inputw = 0, promptw; | 44 | static int inputw = 0, promptw, passwd = 0; |
45 | static int lrpad; /* sum of left and right padding */ | 45 | static int lrpad; /* sum of left and right padding */ |
46 | static size_t cursor; | 46 | static size_t cursor; |
47 | static struct item *items = NULL; | 47 | static struct item *items = NULL; |
@@ -198,6 +198,7 @@ drawmenu(void) | |||
198 | unsigned int curpos; | 198 | unsigned int curpos; |
199 | struct item *item; | 199 | struct item *item; |
200 | int x = 0, y = 0, w; | 200 | int x = 0, y = 0, w; |
201 | char *censort; | ||
201 | 202 | ||
202 | drw_setscheme(drw, scheme[SchemeNorm]); | 203 | drw_setscheme(drw, scheme[SchemeNorm]); |
203 | drw_rect(drw, 0, 0, mw, mh, 1, 1); | 204 | drw_rect(drw, 0, 0, mw, mh, 1, 1); |
@@ -209,7 +210,12 @@ drawmenu(void) | |||
209 | /* draw input field */ | 210 | /* draw input field */ |
210 | w = (lines > 0 || !matches) ? mw - x : inputw; | 211 | w = (lines > 0 || !matches) ? mw - x : inputw; |
211 | drw_setscheme(drw, scheme[SchemeNorm]); | 212 | drw_setscheme(drw, scheme[SchemeNorm]); |
212 | drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); | 213 | if (passwd) { |
214 | censort = ecalloc(1, sizeof(text)); | ||
215 | memset(censort, '.', strlen(text)); | ||
216 | drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0); | ||
217 | free(censort); | ||
218 | } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); | ||
213 | 219 | ||
214 | curpos = TEXTW(text) - TEXTW(&text[cursor]); | 220 | curpos = TEXTW(text) - TEXTW(&text[cursor]); |
215 | if ((curpos += lrpad / 2 - 1) < w) { | 221 | if ((curpos += lrpad / 2 - 1) < w) { |
@@ -687,6 +693,11 @@ readstdin(void) | |||
687 | size_t i, junk, size = 0; | 693 | size_t i, junk, size = 0; |
688 | ssize_t len; | 694 | ssize_t len; |
689 | 695 | ||
696 | if(passwd){ | ||
697 | inputw = lines = 0; | ||
698 | return; | ||
699 | } | ||
700 | |||
690 | /* read each line from stdin and add it to the item list */ | 701 | /* read each line from stdin and add it to the item list */ |
691 | for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) { | 702 | for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) { |
692 | if (i + 1 >= size / sizeof *items) | 703 | if (i + 1 >= size / sizeof *items) |
@@ -847,7 +858,7 @@ setup(void) | |||
847 | static void | 858 | static void |
848 | usage(void) | 859 | usage(void) |
849 | { | 860 | { |
850 | die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" | 861 | die("usage: dmenu [-bfivP] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" |
851 | " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); | 862 | " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); |
852 | } | 863 | } |
853 | 864 | ||
@@ -871,7 +882,9 @@ main(int argc, char *argv[]) | |||
871 | else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ | 882 | else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ |
872 | fstrncmp = strncasecmp; | 883 | fstrncmp = strncasecmp; |
873 | fstrstr = cistrstr; | 884 | fstrstr = cistrstr; |
874 | } else if (i + 1 == argc) | 885 | } else if (!strcmp(argv[i], "-P")) /* is the input a password */ |
886 | passwd = 1; | ||
887 | else if (i + 1 == argc) | ||
875 | usage(); | 888 | usage(); |
876 | /* these options take one argument */ | 889 | /* these options take one argument */ |
877 | else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ | 890 | else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ |
Binary files differ | |||