summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client.c72
-rw-r--r--event.c4
-rw-r--r--kb.c2
-rw-r--r--wm.h5
4 files changed, 76 insertions, 7 deletions
diff --git a/client.c b/client.c
index 537336c..e9b83fe 100644
--- 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
index 1db3d96..93007df 100644
--- 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
index 76c8be1..ad7c717 100644
--- 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
index 3d9b63c..ee89f5b 100644
--- 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);