From 9dfe0ce531023bf63c0e518b07ee97cf0cac742a Mon Sep 17 00:00:00 2001
From: Markus Teich <markus.teich@stusta.mhn.de>
Date: Mon, 18 Jan 2016 16:49:15 +0100
Subject: [PATCH] error messages on grab failure

---
 slock.c | 30 ++++++++++++++++--------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/slock.c b/slock.c
index d2c3729..df2d3c6 100644
--- a/slock.c
+++ b/slock.c
@@ -230,7 +230,7 @@ lockscreen(Display *dpy, int screen)
 	XSetWindowAttributes wa;
 	Cursor invisible;
 
-	if (dpy == NULL || screen < 0 || !(lock = malloc(sizeof(Lock))))
+	if (!running || dpy == NULL || screen < 0 || !(lock = malloc(sizeof(Lock))))
 		return NULL;
 
 	lock->screen = screen;
@@ -253,29 +253,31 @@ lockscreen(Display *dpy, int screen)
 	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 (running && len) {
+	if (!len) {
+		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)
-				break;
+			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);
 		}
+		fprintf(stderr, "slock: unable to grab keyboard for screen %d\n", screen);
 	}
-
-	running &= (len > 0);
-	if (!running) {
-		unlockscreen(dpy, lock);
-		lock = NULL;
-	} else {
-		XSelectInput(dpy, lock->root, SubstructureNotifyMask);
-	}
-
-	return lock;
+	/* grabbing one of the inputs failed */
+	running = 0;
+	unlockscreen(dpy, lock);
+	return NULL;
 }
 
 static void