From ea8a4ca46a9577997e0a3f30e211c644477c6a00 Mon Sep 17 00:00:00 2001 From: Anselm R Garbe Date: Sun, 19 Oct 2008 12:59:18 +0100 Subject: [PATCH] several changes towards 5.3, XINERAMA is disabled by default, introduced usegrab Bool for grabbing the server during mouse-based resizals/movements (disabled by default), continued debugging tile() with resizehints == True and a lot of terminals supporting resizehints, still no optimal solution, I need to think about it, considering recursive algorithm for the space optimization --- config.def.h | 2 ++ config.mk | 8 ++++---- dwm.c | 28 ++++++++++++++++++++-------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/config.def.h b/config.def.h index 706cfa9..7c19b2f 100644 --- a/config.def.h +++ b/config.def.h @@ -13,6 +13,8 @@ static unsigned int snap = 32; /* snap pixel */ static Bool showbar = True; /* False means no bar */ static Bool topbar = True; /* False means bottom bar */ static Bool readin = True; /* False means do not read stdin */ +static Bool usegrab = False; /* True means grabbing the X server + during mouse-based resizals */ /* tagging */ static const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; diff --git a/config.mk b/config.mk index 9e4636a..19935aa 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # dwm version -VERSION = 5.2 +VERSION = 5.3 # Customize below to fit your system @@ -10,9 +10,9 @@ MANPREFIX = ${PREFIX}/share/man X11INC = /usr/X11R6/include X11LIB = /usr/X11R6/lib -# Xinerama, comment if you don't want it -XINERAMALIBS = -L${X11LIB} -lXinerama -XINERAMAFLAGS = -DXINERAMA +# Xinerama, un-comment if you want it +#XINERAMALIBS = -L${X11LIB} -lXinerama +#XINERAMAFLAGS = -DXINERAMA # includes and libs INCS = -I. -I/usr/include -I${X11INC} diff --git a/dwm.c b/dwm.c index edba139..bded0c5 100644 --- a/dwm.c +++ b/dwm.c @@ -53,8 +53,8 @@ #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAXTAGLEN 16 #define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(x) ((x)->w + 2*(x)->bw) -#define HEIGHT(x) ((x)->h + 2*(x)->bw) +#define WIDTH(x) ((x)->w + 2 * (x)->bw) +#define HEIGHT(x) ((x)->h + 2 * (x)->bw) #define TAGMASK ((int)((1LL << LENGTH(tags)) - 1)) #define TEXTW(x) (textnw(x, strlen(x)) + dc.font.height) @@ -932,7 +932,7 @@ monocle(void) { Client *c; for(c = nexttiled(clients); c; c = nexttiled(c->next)) - resize(c, wx, wy, ww - 2*c->bw, wh - 2*c->bw, resizehints); + resize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw, resizehints); } void @@ -952,6 +952,8 @@ movemouse(const Arg *arg) { None, cursor[CurMove], CurrentTime) != GrabSuccess) return; XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, &dui); + if(usegrab) + XGrabServer(dpy); do { XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); switch (ev.type) { @@ -961,7 +963,6 @@ movemouse(const Arg *arg) { handler[ev.type](&ev); break; case MotionNotify: - XSync(dpy, False); nx = ocx + (ev.xmotion.x - x); ny = ocy + (ev.xmotion.y - y); if(snap && nx >= wx && nx <= wx + ww @@ -983,6 +984,8 @@ movemouse(const Arg *arg) { } } while(ev.type != ButtonRelease); + if(usegrab) + XUngrabServer(dpy); XUngrabPointer(dpy, CurrentTime); } @@ -1121,6 +1124,8 @@ resizemouse(const Arg *arg) { None, cursor[CurResize], CurrentTime) != GrabSuccess) return; XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); + if(usegrab) + XGrabServer(dpy); do { XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); switch(ev.type) { @@ -1130,7 +1135,6 @@ resizemouse(const Arg *arg) { handler[ev.type](&ev); break; case MotionNotify: - XSync(dpy, False); nw = MAX(ev.xmotion.x - ocx - 2*c->bw + 1, 1); nh = MAX(ev.xmotion.y - ocy - 2*c->bw + 1, 1); @@ -1146,6 +1150,8 @@ resizemouse(const Arg *arg) { } } while(ev.type != ButtonRelease); + if(usegrab) + XUngrabServer(dpy); XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); XUngrabPointer(dpy, CurrentTime); while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); @@ -1435,7 +1441,7 @@ tile(void) { /* master */ c = nexttiled(clients); mw = mfact * ww; - resize(c, wx, wy, (n == 1 ? ww : mw) - 2*c->bw, wh - 2*c->bw, resizehints); + resize(c, wx, wy, (n == 1 ? ww : mw) - 2 * c->bw, wh - 2 * c->bw, resizehints); if(--n == 0) return; @@ -1449,8 +1455,14 @@ tile(void) { h = wh; for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) { - resize(c, x, y, w - 2*c->bw, /* remainder */ ((i + 1 == n) - ? wy + wh - y : h) - 2*c->bw, resizehints); + if(i + 1 == n) { /* remainder */ + if(wy + wh - y < bh) + resize(c, x, y, w - 2 * c->bw, wy + wh - y - 2 * c->bw, False); + else + resize(c, x, y, w - 2 * c->bw, wy + wh - y - 2 * c->bw, resizehints); + } + else + resize(c, x, y, w - 2 * c->bw, h - 2 * c->bw, resizehints); if(h != wh) y = c->y + HEIGHT(c); }