diff options
| author | Quentin Rameau <quinq@fifth.space> | 2016-08-30 17:33:09 +0200 | 
|---|---|---|
| committer | Markus Teich <markus.teich@stusta.mhn.de> | 2016-08-30 19:54:26 +0200 | 
| commit | c2f975773d720e734dbdab9a1e9ae51b0972ae0c (patch) | |
| tree | 1f7836c5fd6ee498756fdf3fe2d78b732e04ba28 | |
| parent | 3bb868e40873c568acdec74f7783c77f063aa396 (diff) | |
| download | slock-c2f975773d720e734dbdab9a1e9ae51b0972ae0c.tar.gz slock-c2f975773d720e734dbdab9a1e9ae51b0972ae0c.tar.xz  | |
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.
| -rw-r--r-- | slock.c | 44 | 
1 files changed, 20 insertions, 24 deletions
@@ -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  | 
