dwm

dynamic window manager
git clone git://git.suckless.org/dwm
Log | Files | Refs | README | LICENSE

commit 2e836ecce1ba0629a6088b739c1092d27fccd72b
parent 6db5ffb6c9a9c0db5c425c64a96a3896a682c95e
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Wed, 12 Jul 2006 17:17:15 +0200

added gravity stuff

Diffstat:
Mclient.c | 72+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Mevent.c | 4++++
Mkb.c | 2+-
Mwm.h | 5++++-
4 files changed, 76 insertions(+), 7 deletions(-)

diff --git a/client.c b/client.c @@ -18,9 +18,10 @@ max(void *aux) return; stack->x = sx; stack->y = bh; - stack->w = sw - 2; - stack->h = sh - bh - 2; + stack->w = sw - 2 * stack->border; + stack->h = sh - bh - 2 * stack->border; resize(stack); + discard_events(EnterWindowMask); } void @@ -43,8 +44,8 @@ arrange(void *aux) else cols = rows; - gw = (sw - 1) / cols; - gh = (sh - bh - 1) / rows; + gw = (sw - 2 * c->border) / cols; + gh = (sh - bh - 2 * c->border) / rows; for(i = j = 0, c = clients; c; c = c->next) { c->x = i * gw; @@ -57,6 +58,7 @@ arrange(void *aux) i = 0; } } + discard_events(EnterWindowMask); } void @@ -161,6 +163,10 @@ update_size(Client *c) } else c->minw = c->minh = 0; + if(c->flags & PWinGravity) + c->grav = size.win_gravity; + else + c->grav = NorthWestGravity; } void @@ -213,6 +219,7 @@ manage(Window w, XWindowAttributes *wa) c->tw = c->w = wa->width; c->h = wa->height; c->th = bh; + c->border = 1; update_size(c); XSetWindowBorderWidth(dpy, c->win, 1); XSetWindowBorder(dpy, c->win, brush.border); @@ -247,6 +254,61 @@ manage(Window w, XWindowAttributes *wa) } void +gravitate(Client *c, Bool invert) +{ + int dx = 0, dy = 0; + + switch(c->grav) { + case StaticGravity: + case NorthWestGravity: + case NorthGravity: + case NorthEastGravity: + dy = c->border; + break; + case EastGravity: + case CenterGravity: + case WestGravity: + dy = -(c->h / 2) + c->border; + break; + case SouthEastGravity: + case SouthGravity: + case SouthWestGravity: + dy = -c->h; + break; + default: + break; + } + + switch (c->grav) { + case StaticGravity: + case NorthWestGravity: + case WestGravity: + case SouthWestGravity: + dx = c->border; + break; + case NorthGravity: + case CenterGravity: + case SouthGravity: + dx = -(c->w / 2) + c->border; + break; + case NorthEastGravity: + case EastGravity: + case SouthEastGravity: + dx = -(c->w + c->border); + break; + default: + break; + } + + if(invert) { + dx = -dx; + dy = -dy; + } + c->x += dx; + c->y += dy; +} + +void resize(Client *c) { XConfigureEvent e; @@ -260,7 +322,7 @@ resize(Client *c) e.y = c->y; e.width = c->w; e.height = c->h; - e.border_width = 0; + e.border_width = c->border; e.above = None; e.override_redirect = False; XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e); diff --git a/event.c b/event.c @@ -77,6 +77,7 @@ configurerequest(XEvent *e) ev->value_mask &= ~CWSibling; if((c = getclient(ev->window))) { + gravitate(c, True); if(ev->value_mask & CWX) c->x = ev->x; if(ev->value_mask & CWY) @@ -85,6 +86,9 @@ configurerequest(XEvent *e) c->w = ev->width; if(ev->value_mask & CWHeight) c->h = ev->height; + if(ev->value_mask & CWBorderWidth) + c->border = ev->border_width; + gravitate(c, False); } wc.x = ev->x; diff --git a/kb.c b/kb.c @@ -8,7 +8,7 @@ #include <X11/keysym.h> static const char *term[] = { - "xterm", "-bg", "black", "-fg", "white", "-fn", + "aterm", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", 0 }; diff --git a/wm.h b/wm.h @@ -27,6 +27,8 @@ struct Client { int x, y, w, h; int tx, ty, tw, th; int basew, baseh, incw, inch, maxw, maxh, minw, minh; + int grav; + unsigned int border; long flags; Window win; Window trans; @@ -73,7 +75,8 @@ extern void lower(Client *c); extern void kill(void *aux); extern void sel(void *aux); extern void max(void *aux); -extern void arrange(); +extern void arrange(void *aux); +extern void gravitate(Client *c, Bool invert); /* event.c */ extern void discard_events(long even_mask);