~kris/suckless

slock

c2f975773d720e734dbdab9a1e9ae51b0972ae0c — Quentin Rameau 10 years ago 3bb868e
Exit as soon as possible on input grabbing error

We want to know at once if slock failed or not to lock the screen, not
seing a black screen for a whole second (or two) and then die.
Thanks to ^7heo for reporting this.
1 files changed, 20 insertions(+), 24 deletions(-)

M slock.c
M slock.c => slock.c +20 -24
@@ 222,7 222,6 @@ static Lock *
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;


@@ 249,34 248,31 @@ lockscreen(Display *dpy, int screen)
	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);
	XMapRaised(dpy, lock->win);
	if (rr)
		XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask);

	/* Try to grab mouse pointer *and* keyboard, else fail the lock */
	for (len = 1000; len; len--) {
		if (XGrabPointer(dpy, lock->root, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
		    GrabModeAsync, GrabModeAsync, None, invisible, CurrentTime) == GrabSuccess)
			break;
		usleep(1000);
	}
	if (!len) {
	if (XGrabPointer(dpy, lock->root, False, ButtonPressMask |
	    ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync,
	    None, invisible, CurrentTime) != GrabSuccess) {
		fprintf(stderr, "slock: unable to grab mouse pointer for screen %d\n", screen);
	} else {
		for (len = 1000; len; len--) {
			if (XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync, CurrentTime) == GrabSuccess) {
				/* everything fine, we grabbed both inputs */
				XSelectInput(dpy, lock->root, SubstructureNotifyMask);
				return lock;
			}
			usleep(1000);
		}
		running = 0;
		unlockscreen(dpy, lock);
		return NULL;
	}

	if (XGrabKeyboard(dpy, lock->root, True, GrabModeAsync, GrabModeAsync,
	    CurrentTime) != GrabSuccess) {
		fprintf(stderr, "slock: unable to grab keyboard for screen %d\n", screen);
		running = 0;
		unlockscreen(dpy, lock);
		return NULL;
	}
	/* grabbing one of the inputs failed */
	running = 0;
	unlockscreen(dpy, lock);
	return NULL;

	XMapRaised(dpy, lock->win);
	if (rr)
		XRRSelectInput(dpy, lock->win, RRScreenChangeNotifyMask);

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

static void