dmenu-password-5.0.diff (3106B)
1 From c4de1032bd4c247bc20b6ab92a10a8d778966679 Mon Sep 17 00:00:00 2001 2 From: Mehrad Mahmoudian <m.mahmoudian@gmail.com> 3 Date: Tue, 4 May 2021 12:05:09 +0300 4 Subject: [PATCH] patched with password patch 5 6 --- 7 dmenu.1 | 5 ++++- 8 dmenu.c | 21 +++++++++++++++++---- 9 2 files changed, 21 insertions(+), 5 deletions(-) 10 11 diff --git a/dmenu.1 b/dmenu.1 12 index 323f93c..762f707 100644 13 --- a/dmenu.1 14 +++ b/dmenu.1 15 @@ -3,7 +3,7 @@ 16 dmenu \- dynamic menu 17 .SH SYNOPSIS 18 .B dmenu 19 -.RB [ \-bfiv ] 20 +.RB [ \-bfivP ] 21 .RB [ \-l 22 .IR lines ] 23 .RB [ \-m 24 @@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file. 25 .B \-i 26 dmenu matches menu items case insensitively. 27 .TP 28 +.B \-P 29 +dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored. 30 +.TP 31 .BI \-l " lines" 32 dmenu lists items vertically, with the given number of lines. 33 .TP 34 diff --git a/dmenu.c b/dmenu.c 35 index 65f25ce..ad8f63b 100644 36 --- a/dmenu.c 37 +++ b/dmenu.c 38 @@ -37,7 +37,7 @@ struct item { 39 static char text[BUFSIZ] = ""; 40 static char *embed; 41 static int bh, mw, mh; 42 -static int inputw = 0, promptw; 43 +static int inputw = 0, promptw, passwd = 0; 44 static int lrpad; /* sum of left and right padding */ 45 static size_t cursor; 46 static struct item *items = NULL; 47 @@ -132,6 +132,7 @@ drawmenu(void) 48 unsigned int curpos; 49 struct item *item; 50 int x = 0, y = 0, w; 51 + char *censort; 52 53 drw_setscheme(drw, scheme[SchemeNorm]); 54 drw_rect(drw, 0, 0, mw, mh, 1, 1); 55 @@ -143,7 +144,12 @@ drawmenu(void) 56 /* draw input field */ 57 w = (lines > 0 || !matches) ? mw - x : inputw; 58 drw_setscheme(drw, scheme[SchemeNorm]); 59 - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); 60 + if (passwd) { 61 + censort = ecalloc(1, sizeof(text)); 62 + memset(censort, '.', strlen(text)); 63 + drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0); 64 + free(censort); 65 + } else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); 66 67 curpos = TEXTW(text) - TEXTW(&text[cursor]); 68 if ((curpos += lrpad / 2 - 1) < w) { 69 @@ -524,6 +530,11 @@ readstdin(void) 70 char buf[sizeof text], *p; 71 size_t i, imax = 0, size = 0; 72 unsigned int tmpmax = 0; 73 + if(passwd){ 74 + inputw = lines = 0; 75 + return; 76 + } 77 + 78 79 /* read each line from stdin and add it to the item list */ 80 for (i = 0; fgets(buf, sizeof buf, stdin); i++) { 81 @@ -689,7 +700,7 @@ setup(void) 82 static void 83 usage(void) 84 { 85 - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 86 + fputs("usage: dmenu [-bfivP] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" 87 " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); 88 exit(1); 89 } 90 @@ -712,7 +723,9 @@ main(int argc, char *argv[]) 91 else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ 92 fstrncmp = strncasecmp; 93 fstrstr = cistrstr; 94 - } else if (i + 1 == argc) 95 + } else if (!strcmp(argv[i], "-P")) /* is the input a password */ 96 + passwd = 1; 97 + else if (i + 1 == argc) 98 usage(); 99 /* these options take one argument */ 100 else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */ 101 -- 102 2.31.1 103