---

Heyho,

I noticed a bug in slock. When starting slock on my laptop, then docking it
(which automatically switches to a bigger display with udev and xrandr), only
parts of the screen are covered by the lockscreen window. The attached patch
fixes that by adding the Xrandr extension, selecting the RRScreenChangeNotify
event and resizing the respective window.

--Markus


 config.mk |  2 +-
 slock.c   | 18 ++++++++++++++++--
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/config.mk b/config.mk
index 067cfc7..44e41c6 100644
--- a/config.mk
+++ b/config.mk
@@ -11,7 +11,7 @@ X11LIB = /usr/X11R6/lib
 
 # includes and libs
 INCS = -I. -I/usr/include -I${X11INC}
-LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext
+LIBS = -L/usr/lib -lc -lcrypt -L${X11LIB} -lX11 -lXext -lXrandr
 
 # flags
 CPPFLAGS = -DVERSION=\"${VERSION}\" -DHAVE_SHADOW_H
diff --git a/slock.c b/slock.c
index 407a540..13cb109 100644
--- a/slock.c
+++ b/slock.c
@@ -13,6 +13,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
+#include <X11/extensions/Xrandr.h>
 #include <X11/keysym.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
@@ -34,6 +35,9 @@ typedef struct {
 static Lock **locks;
 static int nscreens;
 static Bool running = True;
+static Bool rr;
+static int rrevbase;
+static int rrerrbase;
 
 static void
 die(const char *errstr, ...)
@@ -172,8 +176,15 @@ readpw(Display *dpy, const char *pws)
                                }
                        }
                        llen = len;
-               }
-               else for (screen = 0; screen < nscreens; screen++)
+               } else if (rr && ev.type == rrevbase + RRScreenChangeNotify) {
+                       XRRScreenChangeNotifyEvent *rre = 
(XRRScreenChangeNotifyEvent*)&ev;
+                       for (screen = 0; screen < nscreens; screen++) {
+                               if (locks[screen]->win == rre->window) {
+                                       XResizeWindow(dpy, locks[screen]->win, 
rre->width, rre->height);
+                                       XClearWindow(dpy, locks[screen]->win);
+                               }
+                       }
+               } else for (screen = 0; screen < nscreens; screen++)
                        XRaiseWindow(dpy, locks[screen]->win);
        }
 }
@@ -227,6 +238,8 @@ lockscreen(Display *dpy, int screen)
        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);
        for (len = 1000; len; len--) {
                if (XGrabPointer(dpy, lock->root, False, ButtonPressMask | 
ButtonReleaseMask | PointerMotionMask,
                    GrabModeAsync, GrabModeAsync, None, invisible, CurrentTime) 
== GrabSuccess)
@@ -286,6 +299,7 @@ main(int argc, char **argv) {
 
        if (!(dpy = XOpenDisplay(0)))
                die("slock: cannot open display\n");
+       rr = XRRQueryExtension(dpy, &rrevbase, &rrerrbase);
        /* Get the number of screens in display "dpy" and blank them all. */
        nscreens = ScreenCount(dpy);
        locks = malloc(sizeof(Lock *) * nscreens);
-- 
2.0.5


Reply via email to