dwm

my fork of dwm
Index Commits 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);