summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Rameau <quinq@fifth.space>2016-08-30 17:33:09 +0200
committerMarkus Teich <markus.teich@stusta.mhn.de>2016-08-30 19:54:26 +0200
commitc2f975773d720e734dbdab9a1e9ae51b0972ae0c (patch)
tree1f7836c5fd6ee498756fdf3fe2d78b732e04ba28
parent3bb868e40873c568acdec74f7783c77f063aa396 (diff)
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.c44
1 files changed, 20 insertions, 24 deletions
diff --git a/slock.c b/slock.c
index 210d5c8..dd32374 100644
--- a/slock.c
+++ b/slock.c
@@ -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