---
dmenu.1 | 3 +++
dmenu.c | 42 ++++++++++++++++++++++++++++++++++++------
2 files changed, 39 insertions(+), 6 deletions(-)
diff --git a/dmenu.1 b/dmenu.1
index d3ab805..91b5a5b 100644
--- a/dmenu.1
+++ b/dmenu.1
_AT_@ -45,6 +45,9 @@ dmenu appears at the bottom of the screen.
dmenu grabs the keyboard before reading stdin. This is faster, but will lock up
X until stdin reaches end\-of\-file.
.TP
+.B \-g
+prompt for password. Typed text is displayed as asterisks and stdin is ignored.
+.TP
.B \-i
dmenu matches menu items case insensitively.
.TP
diff --git a/dmenu.c b/dmenu.c
index 8e84fbd..d28e656 100644
--- a/dmenu.c
+++ b/dmenu.c
_AT_@ -33,7 +33,9 @@ struct item {
int out;
};
+static char asterisks[BUFSIZ] = "";
static char text[BUFSIZ] = "";
+static char passwordentry = 0;
static int bh, mw, mh;
static int sw, sh; /* X display screen geometry width, height */
static int inputw = 0, promptw;
_AT_@ -56,6 +58,7 @@ static Clr *scheme[SchemeLast];
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr;
+static size_t nextrune(int inc);
static void
appenditem(struct item *item, struct item **list, struct item **last)
_AT_@ -128,9 +131,30 @@ drawitem(struct item *item, int x, int y, int w)
static void
drawmenu(void)
{
+ char *textbuf = text;
unsigned int curpos;
+ size_t visualcursor = cursor;
+ size_t oldcursor, runecount;
struct item *item;
- int x = 0, y = 0, w;
+ int visualcursorset = 0, x = 0, y = 0, w;
+
+ if (passwordentry) {
+ oldcursor = cursor;
+ for (cursor = runecount = 0; text[cursor] != '\0'; runecount++) {
+ asterisks[runecount] = '*';
+ if (cursor >= oldcursor && !visualcursorset) {
+ visualcursorset = 1;
+ visualcursor = runecount;
+ }
+ cursor = nextrune(+1);
+ }
+ if (!visualcursorset) {
+ visualcursor = runecount;
+ }
+ cursor = oldcursor;
+ asterisks[runecount] = '\0';
+ textbuf = asterisks;
+ }
drw_setscheme(drw, scheme[SchemeNorm]);
drw_rect(drw, 0, 0, mw, mh, 1, 1);
_AT_@ -142,9 +166,9 @@ drawmenu(void)
/* draw input field */
w = (lines > 0 || !matches) ? mw - x : inputw;
drw_setscheme(drw, scheme[SchemeNorm]);
- drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
+ drw_text(drw, x, 0, w, bh, lrpad / 2, textbuf, 0);
- drw_font_getexts(drw->fonts, text, cursor, &curpos, NULL);
+ drw_font_getexts(drw->fonts, textbuf, visualcursor, &curpos, NULL);
if ((curpos += lrpad / 2 - 1) < w) {
drw_setscheme(drw, scheme[SchemeNorm]);
drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
_AT_@ -600,7 +624,7 @@ setup(void)
static void
usage(void)
{
- fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+ fputs("usage: dmenu [-b] [-f] [-g] [-i] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
" [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr);
exit(1);
}
_AT_@ -619,6 +643,8 @@ main(int argc, char *argv[])
topbar = 0;
else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */
fast = 1;
+ else if (!strcmp(argv[i], "-g")) /* get password*/
+ passwordentry = 1;
else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
fstrncmp = strncasecmp;
fstrstr = cistrstr;
_AT_@ -659,9 +685,13 @@ main(int argc, char *argv[])
if (fast) {
grabkeyboard();
- readstdin();
+ if (!passwordentry) {
+ readstdin();
+ }
} else {
- readstdin();
+ if (!passwordentry) {
+ readstdin();
+ }
grabkeyboard();
}
setup();
--
2.1.4
--1yeeQ81UyVL57Vl7--
Received on Mon Sep 17 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Mon Jul 25 2016 - 21:12:05 CEST