Blank the screen with color 0, add third color for failed logins
authorDavid Phillips <dbphillipsnz@gmail.com>
Wed, 11 Feb 2015 22:56:35 +0000 (11:56 +1300)
committerMarkus Teich <markus.teich@stusta.mhn.de>
Wed, 1 Apr 2015 21:13:11 +0000 (23:13 +0200)
- Adds another color in config.def.h, COLOR_INIT
- Renames the colours from numerical ones to ones with meaningful names;
  COLOR_INPUT for when there is content in the input buffer and COLOR_EMPTY
  for when the input buffer has been cleared (backspaced or a failed attempt).
- Ensures XFreeColors frees the right number of colours. This is now derived
  from the size of `Lock->colors` rather than being an integer literal.
- Makes slock exhibit the behaviour described by Markus

The default colours are the same as the ones slock currently uses, with the
exception of the new color, which I have set to red, as it indicates someone
has either failed an attempt to unlock, or that they have entered input and
erased it all.

config.def.h
slock.c

index 89e5977..4bccb5d 100644 (file)
@@ -1,2 +1,5 @@
-#define COLOR1 "black"
-#define COLOR2 "#005577"
+static const char *colorname[NUMCOLS] = {
+       "black",     /* after initialization */
+       "#005577",   /* during input */
+       "#CC3333",   /* failed/cleared the input */
+};
diff --git a/slock.c b/slock.c
index 407a540..df5c3fe 100644 (file)
--- a/slock.c
+++ b/slock.c
 #include <bsd_auth.h>
 #endif
 
+enum {
+       INIT,
+       INPUT,
+       EMPTY,
+       NUMCOLS
+};
+
 #include "config.h"
 
 typedef struct {
        int screen;
        Window root, win;
        Pixmap pmap;
-       unsigned long colors[2];
+       unsigned long colors[NUMCOLS];
 } Lock;
 
 static Lock **locks;
@@ -162,12 +169,12 @@ readpw(Display *dpy, const char *pws)
                        }
                        if (llen == 0 && len != 0) {
                                for (screen = 0; screen < nscreens; screen++) {
-                                       XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[1]);
+                                       XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[INPUT]);
                                        XClearWindow(dpy, locks[screen]->win);
                                }
                        } else if (llen != 0 && len == 0) {
                                for (screen = 0; screen < nscreens; screen++) {
-                                       XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[0]);
+                                       XSetWindowBackground(dpy, locks[screen]->win, locks[screen]->colors[EMPTY]);
                                        XClearWindow(dpy, locks[screen]->win);
                                }
                        }
@@ -185,7 +192,7 @@ unlockscreen(Display *dpy, Lock *lock)
                return;
 
        XUngrabPointer(dpy, CurrentTime);
-       XFreeColors(dpy, DefaultColormap(dpy, lock->screen), lock->colors, 2, 0);
+       XFreeColors(dpy, DefaultColormap(dpy, lock->screen), lock->colors, NUMCOLS, 0);
        XFreePixmap(dpy, lock->pmap);
        XDestroyWindow(dpy, lock->win);
 
@@ -197,6 +204,7 @@ lockscreen(Display *dpy, int screen)
 {
        char curs[] = {0, 0, 0, 0, 0, 0, 0, 0};
        unsigned int len;
+       int i;
        Lock *lock;
        XColor color, dummy;
        XSetWindowAttributes wa;
@@ -213,16 +221,17 @@ lockscreen(Display *dpy, int screen)
 
        lock->root = RootWindow(dpy, lock->screen);
 
+       for (i = 0; i < NUMCOLS; i++) {
+               XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), colorname[i], &color, &dummy);
+               lock->colors[i] = color.pixel;
+       }
+
        /* init */
        wa.override_redirect = 1;
-       wa.background_pixel = BlackPixel(dpy, lock->screen);
+       wa.background_pixel = lock->colors[INIT];
        lock->win = XCreateWindow(dpy, lock->root, 0, 0, DisplayWidth(dpy, lock->screen), DisplayHeight(dpy, lock->screen),
                                  0, DefaultDepth(dpy, lock->screen), CopyFromParent,
                                  DefaultVisual(dpy, lock->screen), CWOverrideRedirect | CWBackPixel, &wa);
-       XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), COLOR2, &color, &dummy);
-       lock->colors[1] = color.pixel;
-       XAllocNamedColor(dpy, DefaultColormap(dpy, lock->screen), COLOR1, &color, &dummy);
-       lock->colors[0] = color.pixel;
        lock->pmap = XCreateBitmapFromData(dpy, lock->win, curs, 8, 8);
        invisible = XCreatePixmapCursor(dpy, lock->pmap, lock->pmap, &color, &color, 0, 0);
        XDefineCursor(dpy, lock->win, invisible);