- /* Try to grab mouse pointer *and* keyboard, else fail the lock */
- 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);
- running = 0;
- unlockscreen(dpy, lock);
- return NULL;
- }
+ /* Try to grab mouse pointer *and* keyboard for 600ms, else fail the lock */
+ for (i = 0, ptgrab = kbgrab = -1; i < 6; i++) {
+ if (ptgrab != GrabSuccess) {
+ ptgrab = XGrabPointer(dpy, lock->root, False,
+ ButtonPressMask | ButtonReleaseMask |
+ PointerMotionMask, GrabModeAsync,
+ GrabModeAsync, None, invisible, CurrentTime);
+ }
+ if (kbgrab != GrabSuccess) {
+ kbgrab = XGrabKeyboard(dpy, lock->root, True,
+ GrabModeAsync, GrabModeAsync, CurrentTime);
+ }