dmenu-password-4.9.diff (2912B) - raw
1 diff -up dmenu-4.9-orig/dmenu.1 dmenu-4.9/dmenu.1 2 --- dmenu-4.9-orig/dmenu.1 2019-09-25 12:48:38.848249931 -0600 3 +++ dmenu-4.9/dmenu.1 2019-09-25 12:55:42.666319316 -0600 4 @@ -3,7 +3,7 @@ 5 dmenu \- dynamic menu 6 .SH SYNOPSIS 7 .B dmenu 8 +.RB [ \-bfivP ] 9 -.RB [ \-bfiv ] 10 .RB [ \-l 11 .IR lines ] 12 .RB [ \-m 13 @@ -47,6 +47,9 @@ is faster, but will lock up X until stdi 14 .B \-i 15 dmenu matches menu items case insensitively. 16 .TP 17 +.B \-P 18 +dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored. 19 +.TP 20 .BI \-l " lines" 21 dmenu lists items vertically, with the given number of lines. 22 .TP 23 diff -up dmenu-4.9-orig/dmenu.c dmenu-4.9/dmenu.c 24 --- dmenu-4.9-orig/dmenu.c 2019-09-25 12:48:38.848249931 -0600 25 +++ dmenu-4.9/dmenu.c 2019-09-25 12:48:55.756173240 -0600 26 @@ -37,7 +37,7 @@ struct item { 27 static char text[BUFSIZ] = ""; 28 static char *embed; 29 static int bh, mw, mh; 30 +static int inputw = 0, promptw, passwd = 0; 31 -static int inputw = 0, promptw; 32 static int lrpad; /* sum of left and right padding */ 33 static size_t cursor; 34 static struct item *items = NULL; 35 @@ -132,6 +132,7 @@ drawmenu(void) 36 unsigned int curpos; 37 struct item *item; 38 int x = 0, y = 0, w; 39 + char *censort; 40 41 drw_setscheme(drw, scheme[SchemeNorm]); 42 drw_rect(drw, 0, 0, mw, mh, 1, 1); 43 @@ -143,7 +144,12 @@ drawmenu(void) 44 /* draw input field */ 45 w = (lines > 0 || !matches) ? mw - x : inputw; 46 drw_setscheme(drw, scheme[SchemeNorm]); 47 + if (passwd) { 48 + censort = ecalloc(1, sizeof(text)); 49 + memset(censort, '-', strlen(text)); 50 + drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0); 51 + free(censort); 52 + } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); 53 - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); 54 55 curpos = TEXTW(text) - TEXTW(&text[cursor]); 56 if ((curpos += lrpad / 2 - 1) < w) { 57 @@ -525,6 +531,11 @@ readstdin(void) 58 size_t i, imax = 0, size = 0; 59 unsigned int tmpmax = 0; 60 61 + if(passwd){ 62 + inputw = lines = 0; 63 + return; 64 + } 65 + 66 /* read each line from stdin and add it to the item list */ 67 for (i = 0; fgets(buf, sizeof buf, stdin); i++) { 68 if (i + 1 >= size / sizeof *items) 69 @@ -682,7 +693,7 @@ setup(void) 70 static void 71 usage(void) 72 { 73 + fputs("usage: dmenu [-bfiPv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 74 - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 75 " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); 76 exit(1); 77 } 78 @@ -705,7 +716,9 @@ main(int argc, char *argv[]) 79 else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ 80 fstrncmp = strncasecmp; 81 fstrstr = cistrstr; 82 + } else if (!strcmp(argv[i], "-P")) /* is the input a password */ 83 + passwd = 1; 84 + else if (i + 1 == argc) 85 - } else if (i + 1 == argc) 86 usage(); 87 /* these options take one argument */ 88 else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */