JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
added gravity stuff
authorAnselm R. Garbe <garbeam@wmii.de>
Wed, 12 Jul 2006 15:17:15 +0000 (17:17 +0200)
committerAnselm R. Garbe <garbeam@wmii.de>
Wed, 12 Jul 2006 15:17:15 +0000 (17:17 +0200)
client.c
event.c
kb.c
wm.h

index 537336c..e9b83fe 100644 (file)
--- a/client.c
+++ b/client.c
@@ -18,9 +18,10 @@ max(void *aux)
                return;
        stack->x = sx;
        stack->y = bh;
                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);
        resize(stack);
+       discard_events(EnterWindowMask);
 }
 
 void
 }
 
 void
@@ -43,8 +44,8 @@ arrange(void *aux)
        else
                cols = rows;
 
        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;
 
        for(i = j = 0, c = clients; c; c = c->next) {
                c->x = i * gw;
@@ -57,6 +58,7 @@ arrange(void *aux)
                        i = 0;
                }
        }
                        i = 0;
                }
        }
+       discard_events(EnterWindowMask);
 }
 
 void
 }
 
 void
@@ -161,6 +163,10 @@ update_size(Client *c)
        }
        else
                c->minw = c->minh = 0;
        }
        else
                c->minw = c->minh = 0;
+       if(c->flags & PWinGravity)
+               c->grav = size.win_gravity;
+       else
+               c->grav = NorthWestGravity;
 }
 
 void
 }
 
 void
@@ -213,6 +219,7 @@ manage(Window w, XWindowAttributes *wa)
        c->tw = c->w = wa->width;
        c->h = wa->height;
        c->th = bh;
        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);
        update_size(c);
        XSetWindowBorderWidth(dpy, c->win, 1);
        XSetWindowBorder(dpy, c->win, brush.border);
@@ -247,6 +254,61 @@ manage(Window w, XWindowAttributes *wa)
 }
 
 void
 }
 
 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;
 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.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);
        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 (file)
--- a/event.c
+++ b/event.c
@@ -77,6 +77,7 @@ configurerequest(XEvent *e)
 
        ev->value_mask &= ~CWSibling;
        if((c = getclient(ev->window))) {
 
        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)
                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;
                        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;
        }
 
        wc.x = ev->x;
diff --git a/kb.c b/kb.c
index 76c8be1..ad7c717 100644 (file)
--- a/kb.c
+++ b/kb.c
@@ -8,7 +8,7 @@
 #include <X11/keysym.h>
 
 static const char *term[] = { 
 #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 
 };
 
        "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", 0 
 };
 
diff --git a/wm.h b/wm.h
index 3d9b63c..ee89f5b 100644 (file)
--- 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 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;
        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 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);
 
 /* event.c */
 extern void discard_events(long even_mask);