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 |