Exit as soon as possible on input grabbing error - slock - My fancy fork of slock
 (HTM) git clone git://git.drkhsh.at/slock.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit c2f975773d720e734dbdab9a1e9ae51b0972ae0c
 (DIR) parent 3bb868e40873c568acdec74f7783c77f063aa396
 (HTM) Author: Quentin Rameau <quinq@fifth.space>
       Date:   Tue, 30 Aug 2016 17:33:09 +0200
       
       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.
       
       Diffstat:
         M slock.c                             |      44 ++++++++++++++-----------------
       
       1 file changed, 20 insertions(+), 24 deletions(-)
       ---
 (DIR) diff --git 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