--- 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.5Received 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