[dev] [slock] [PATCH] resize lockscreen window after Xrandr resize

From: Markus Teich <markus.teich_AT_stusta.mhn.de>
Date: Wed, 25 Feb 2015 23:06:45 +0100

---
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
_AT_@ -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
_AT_@ -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>
_AT_@ -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, ...)
_AT_@ -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);
 	}
 }
_AT_@ -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)
_AT_@ -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
Received on Wed Feb 25 2015 - 23:06:45 CET

This archive was generated by hypermail 2.3.0 : Wed Feb 25 2015 - 23:12:07 CET