~saurabhs/slock

29cb53d3a9bd67b2e8830b17a6ed1713b0d90b0f — Saurabh S 7 months ago 35633d4
Add terminalkeys and dwmlogo patches

- Update user name and group
- Chnage dwm logo to cool looking arch logo
4 files changed, 163 insertions(+), 14 deletions(-)

M config.def.h
A config.h
M config.mk
M slock.c
M config.def.h => config.def.h +21 -1
@@ 3,10 3,30 @@ static const char *user  = "nobody";
static const char *group = "nogroup";

static const char *colorname[NUMCOLS] = {
	[INIT] =   "black",     /* after initialization */
	[BACKGROUND] =   "black",     /* after initialization */
	[INIT] =   "#2d2d2d",     /* after initialization */
	[INPUT] =  "#005577",   /* during input */
	[FAILED] = "#CC3333",   /* wrong password */
};

/* treat a cleared input like a wrong password (color) */
static const int failonclear = 1;

/* insert grid pattern with scale 1:1, the size can be changed with logosize */
static const int logosize = 75;
static const int logow = 12;	/* grid width and height for right center alignment*/
static const int logoh = 6;

static XRectangle rectangles[9] = {
	/* x	y	w	h */
	{ 0,	3,	1,	3 },
	{ 1,	3,	2,	1 },
	{ 0,	5,	8,	1 },
	{ 3,	0,	1,	5 },
	{ 5,	3,	1,	2 },
	{ 7,	3,	1,	2 },
	{ 8,	3,	4,	1 },
	{ 9,	4,	1,	2 },
	{ 11,	4,	1,	2 },

};

A config.h => config.h +38 -0
@@ 0,0 1,38 @@
/* user and group to drop privileges to */
static const char *user  = "saurabh";
static const char *group = "users";

static const char *colorname[NUMCOLS] = {
	[BACKGROUND] =   "black",     /* after initialization */
	[INIT] =  "#2d2d2d",     /* after initialization */
	[INPUT] =  "#005577",   /* during input */
	[FAILED] = "#CC3333",   /* wrong password */
};

/* treat a cleared input like a wrong password (color) */
static const int failonclear = 0;

/* insert grid pattern with scale 1:1, the size can be changed with logosize */
static const int logosize = 18;
static const int logow = 12;	/* grid width and height for right center alignment*/
static const int logoh = 6;

static XRectangle rectangles[11] = {
  /* x  y   w   h */
  //a
  { -2,  3,  1,  3},
  { -1,  3,  2,  1},
  {  0,  3,  1,  3},
  { -1,  5,  3,  1},
  //r
  {  2,  3,  1,  3},
  {  3,  3,  1,  1},
  //c
  { 4,  3,  1,  3},
  { 5,  3,  4,  1},
  { 5,  5,  2,  1},
  //h
  { 7,  1, 1,  5},
  { 9,  3, 1,  3}
};


M config.mk => config.mk +11 -3
@@ 10,12 10,20 @@ MANPREFIX = ${PREFIX}/share/man
X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib

# Xinerama, comment if you don't want it
XINERAMALIBS  = -lXinerama
XINERAMAFLAGS = -DXINERAMA

# freetype
FREETYPELIBS = -lXft
FREETYPEINC = /usr/include/freetype2

# includes and libs
INCS = -I. -I/usr/include -I${X11INC}
LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr
INCS = -I. -I/usr/include -I${X11INC} -I${FREETYPEINC}
LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lXext -lXrandr

# flags
CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H
CPPFLAGS = -DVERSION=\"${VERSION}\" -D_DEFAULT_SOURCE -DHAVE_SHADOW_H ${XINERAMAFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
LDFLAGS = -s ${LIBS}
COMPATSRC = explicit_bzero.c

M slock.c => slock.c +93 -10
@@ 1,5 1,6 @@
/* See LICENSE file for license details. */
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE   500
#define LENGTH(X)       (sizeof X / sizeof X[0])
#if HAVE_SHADOW_H
#include <shadow.h>
#endif


@@ 15,9 16,13 @@
#include <unistd.h>
#include <sys/types.h>
#include <X11/extensions/Xrandr.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif
#include <X11/keysym.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xft/Xft.h>

#include "arg.h"
#include "util.h"


@@ 25,17 30,25 @@
char *argv0;

enum {
	BACKGROUND,
	INIT,
	INPUT,
	FAILED,
	NUMCOLS
};

#include "config.h"

struct lock {
	int screen;
	Window root, win;
	Pixmap pmap;
	unsigned long colors[NUMCOLS];
	unsigned int x, y;
	unsigned int xoff, yoff, mw, mh;
	Drawable drawable;
	GC gc;
	XRectangle rectangles[LENGTH(rectangles)];
};

struct xrandr {


@@ 44,8 57,6 @@ struct xrandr {
	int errbase;
};

#include "config.h"

static void
die(const char *errstr, ...)
{


@@ 125,6 136,32 @@ gethash(void)
}

static void
resizerectangles(struct lock *lock)
{
	int i;

	for (i = 0; i < LENGTH(rectangles); i++){
		lock->rectangles[i].x = (rectangles[i].x * logosize)
                                + lock->xoff + ((lock->mw) / 2) - (logow / 2 * logosize);
		lock->rectangles[i].y = (rectangles[i].y * logosize)
                                + lock->yoff + ((lock->mh) / 2) - (logoh / 2 * logosize);
		lock->rectangles[i].width = rectangles[i].width * logosize;
		lock->rectangles[i].height = rectangles[i].height * logosize;
	}
}

static void
drawlogo(Display *dpy, struct lock *lock, int color)
{
	XSetForeground(dpy, lock->gc, lock->colors[BACKGROUND]);
	XFillRectangle(dpy, lock->drawable, lock->gc, 0, 0, lock->x, lock->y);
	XSetForeground(dpy, lock->gc, lock->colors[color]);
	XFillRectangles(dpy, lock->drawable, lock->gc, lock->rectangles, LENGTH(rectangles));
	XCopyArea(dpy, lock->drawable, lock->win, lock->gc, 0, 0, lock->x, lock->y, 0, 0);
	XSync(dpy, False);
}

static void
readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
       const char *hash)
{


@@ 156,6 193,22 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
			    IsPFKey(ksym) ||
			    IsPrivateKeypadKey(ksym))
				continue;
			if (ev.xkey.state & ControlMask) {
				switch (ksym) {
				case XK_u:
					ksym = XK_Escape;
					break;
				case XK_m:
					ksym = XK_Return;
					break;
				case XK_j:
					ksym = XK_Return;
					break;
				case XK_h:
                                       ksym = XK_BackSpace;
					break;
				}
			}
			switch (ksym) {
			case XK_Return:
				passwd[len] = '\0';


@@ 190,10 243,7 @@ readpw(Display *dpy, struct xrandr *rr, struct lock **locks, int nscreens,
			color = len ? INPUT : ((failure || failonclear) ? FAILED : INIT);
			if (running && oldc != color) {
				for (screen = 0; screen < nscreens; screen++) {
					XSetWindowBackground(dpy,
					                     locks[screen]->win,
					                     locks[screen]->colors[color]);
					XClearWindow(dpy, locks[screen]->win);
					drawlogo(dpy, locks[screen], color);
				}
				oldc = color;
			}


@@ 228,6 278,10 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
	XColor color, dummy;
	XSetWindowAttributes wa;
	Cursor invisible;
#ifdef XINERAMA
	XineramaScreenInfo *info;
	int n;
#endif

	if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(struct lock))))
		return NULL;


@@ 241,12 295,31 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
		lock->colors[i] = color.pixel;
	}

	lock->x = DisplayWidth(dpy, lock->screen);
	lock->y = DisplayHeight(dpy, lock->screen);
#ifdef XINERAMA
	if ((info = XineramaQueryScreens(dpy, &n))) {
		lock->xoff = info[0].x_org;
		lock->yoff = info[0].y_org;
		lock->mw = info[0].width;
		lock->mh = info[0].height;
	} else
#endif
	{
		lock->xoff = lock->yoff = 0;
		lock->mw = lock->x;
		lock->mh = lock->y;
	}
	lock->drawable = XCreatePixmap(dpy, lock->root,
            lock->x, lock->y, DefaultDepth(dpy, screen));
	lock->gc = XCreateGC(dpy, lock->root, 0, NULL);
	XSetLineAttributes(dpy, lock->gc, 1, LineSolid, CapButt, JoinMiter);

	/* init */
	wa.override_redirect = 1;
	wa.background_pixel = lock->colors[INIT];
	wa.background_pixel = lock->colors[BACKGROUND];
	lock->win = XCreateWindow(dpy, lock->root, 0, 0,
	                          DisplayWidth(dpy, lock->screen),
	                          DisplayHeight(dpy, lock->screen),
	                          lock->x, lock->y,
	                          0, DefaultDepth(dpy, lock->screen),
	                          CopyFromParent,
	                          DefaultVisual(dpy, lock->screen),


@@ 256,6 329,8 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
	                                &color, &color, 0, 0);
	XDefineCursor(dpy, lock->win, invisible);

	resizerectangles(lock);

	/* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */
	for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) {
		if (ptgrab != GrabSuccess) {


@@ 276,6 351,7 @@ lockscreen(Display *dpy, struct xrandr *rr, int screen)
				XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask);

			XSelectInput(dpy, lock->root, SubstructureNotifyMask);
			drawlogo(dpy, lock, INIT);
			return lock;
		}



@@ 391,5 467,12 @@ main(int argc, char **argv) {
	/* everything is now blank. Wait for the correct password */
	readpw(dpy, &rr, locks, nscreens, hash);

	for (nlocks = 0, s = 0; s < nscreens; s++) {
		XFreePixmap(dpy, locks[s]->drawable);
		XFreeGC(dpy, locks[s]->gc);
	}

	XSync(dpy, 0);
	XCloseDisplay(dpy);
	return 0;
}