sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

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