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 */