--- config.def.h | 7 +++++++ slock.c | 23 +++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/config.def.h b/config.def.h index 9855e21..f250db7 100644 --- a/config.def.h +++ b/config.def.h _AT_@ -2,11 +2,18 @@ static const char *user = "nobody"; static const char *group = "nogroup"; +/* font used to display password */ +static const char *fontname = "9x15"; + static const char *colorname[NUMCOLS] = { [INIT] = "black", /* after initialization */ [INPUT] = "#005577", /* during input */ [FAILED] = "#CC3333", /* wrong password */ + [TEXT] = "black", /* password on screen */ }; /* treat a cleared input like a wrong password (color) */ static const int failonclear = 1; + +/* show the password on the screen as it is typed */ +static const int showpassword = 1; diff --git a/slock.c b/slock.c index d55eb3d..49133fa 100644 --- a/slock.c +++ b/slock.c _AT_@ -23,17 +23,20 @@ #include "util.h" char *argv0; +XFontStruct *font; enum { INIT, INPUT, FAILED, + TEXT, NUMCOLS }; struct lock { int screen; Window root, win; + GC gc; Pixmap pmap; unsigned long colors[NUMCOLS]; }; _AT_@ -130,7 +133,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, { XRRScreenChangeNotifyEvent *rre; char buf[32], passwd[256], *inputhash; - int num, screen, running, failure, oldc; + int num, screen, running, failure, oldc, tw, dpyw, dpyh; unsigned int len, color; KeySym ksym; XEvent ev; _AT_@ -187,13 +190,24 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens, } break; } + tw = XTextWidth(font, passwd, len); color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT); - if (running && oldc != color) { + if (running && (showpassword || (!showpassword && oldc != color))) { for (screen = 0; screen < nscreens; screen++) { XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[color]); XClearWindow(dpy, locks[screen]->win); + if (showpassword) { + XSetForeground(dpy, locks[screen]->gc, + locks[screen]->colors[TEXT]); + dpyw = DisplayWidth(dpy, locks[screen]->screen); + dpyh = DisplayHeight(dpy, locks[screen]->screen); + XDrawString(dpy, locks[screen]->win, + locks[screen]->gc, + (dpyw-tw)/2, dpyh/2, + passwd, len); + } } oldc = color; } _AT_@ -255,6 +269,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen) invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, &color, &color, 0, 0); XDefineCursor(dpy, lock->win, invisible); + lock->gc = XCreateGC(dpy, lock->win, 0, NULL); /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */ for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) { _AT_@ -358,6 +373,10 @@ main(int argc, char **argv) { /* check for Xrandr support */ rr.active = XRRQueryExtension(dpy, &rr.evbase, &rr.errbase); + /* load font ready for drawing */ + if (NULL == (font = XLoadQueryFont(dpy, fontname))) + die("Failed to load font\n"); + /* get number of screens in display "dpy" and blank them */ nscreens = ScreenCount(dpy); if (!(locks = calloc(nscreens, sizeof(struct lock *)))) -- 2.12.0Received on Sat Apr 01 2017 - 06:41:39 CEST
This archive was generated by hypermail 2.3.0 : Sat Apr 01 2017 - 06:48:16 CEST