[hackers] [wmii] First commit to test branch

From: Kris Maglione <jg_AT_suckless.org>
Date: Fri, 01 Jun 2007 01:09:11 -0000

changeset: 2081:b358a8133947
parent: 2074:a6624d17ef24
user: Kris Maglione <jg_AT_suckless.org>
date: Mon Apr 16 14:06:32 2007 -0400
summary: First commit to test branch

diff -r f00e1be34737 -r b358a8133947 DISTRIBUTERS
--- a/DISTRIBUTERS Sun May 20 21:26:05 2007 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-The following conditions apply to any distribution which
-uses the name wmii. These conditions apply only to wmii
-name, and not to its source code or any other materials.
-
-When in doubt about any of these conditions or other matters
-of packaging or distrobution, , please contact the wmii
-mailing lists <wmii-hackers_AT_suckless.org> or
-<wmii_AT_suckless.org>, or Kris Maglione <fbsdaemon_AT_gmail.com>.
-
-Any binary distribution of wmii MUST have a properly set
-version string. This string may normally be set in
-'mk/wmii.mk', and is set automatically to the Mercurial
-revision number for builds from a Mercurial tree, so long as
-the 'hg' command is present and properly functioning.
-
-Any version which not an official release or snapshot MUST
-be contain the hg revision number in its version string.
-This SHOULD be formated as hgXXXX, where XXXX is the decimal
-revision number.
-
-The version string of any snapshot release MUST contain the
-date of the snapshot in the form YYYYMMDD, and SHOULD
-contain the word snap or snapshot. The version string of a
-snapshot MAY contain the version of a full release that the
-snapshot is expected to lead to, but it MUST be either
-directly preceded, or directly followed by, the word 'pre',
-optionally separated by a non-alphanumeric character,
-including -~_,./, the version.
-
-Any binary distribution which is modified in any non-trivial
-way MUST signify the modifications in its name or version
-string. This includes patches to use Xft for font display,
-but does NOT include minor patches to improve consistency
-with the rest of the system, including changing the default
-terminal emulator or changing any build flags as set in
-config.mk.
-
-Source form distribution MAY include non-trivial patches
-without such modifications, provided that the user is made
-clearly aware of them at build time and/or prompted in some
-way to enable or disable them.
-
diff -r f00e1be34737 -r b358a8133947 DISTRIBUTORS
--- a/DISTRIBUTORS Sun May 20 21:26:05 2007 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-The following conditions apply to any distribution which
-uses the name wmii. These conditions apply only to wmii
-name, and not to its source code or any other materials.
-
-When in doubt about any of these conditions or other matters
-of packaging or distrobution, , please contact the wmii
-mailing lists <wmii-hackers_AT_suckless.org> or
-<wmii_AT_suckless.org>, or Kris Maglione <fbsdaemon_AT_gmail.com>.
-
-Any binary distribution of wmii MUST have a properly set
-version string. This string may normally be set in
-'mk/wmii.mk', and is set automatically to the Mercurial
-revision number for builds from a Mercurial tree, so long as
-the 'hg' command is present and properly functioning.
-
-Any version which not an official release or snapshot MUST
-be contain the hg revision number in its version string.
-This SHOULD be formated as hgXXXX, where XXXX is the decimal
-revision number.
-
-The version string of any snapshot release MUST contain the
-date of the snapshot in the form YYYYMMDD, and SHOULD
-contain the word snap or snapshot. The version string of a
-snapshot MAY contain the version of a full release that the
-snapshot is expected to lead to, but it MUST be either
-directly preceded, or directly followed by, the word 'pre',
-optionally separated by a non-alphanumeric character,
-including -~_,./, the version.
-
-Any binary distribution which is modified in any non-trivial
-way MUST signify the modifications in its name or version
-string. This includes patches to use Xft for font display,
-but does NOT include minor patches to improve consistency
-with the rest of the system, including changing the default
-terminal emulator or changing any build flags as set in
-config.mk.
-
-Source form distribution MAY include non-trivial patches
-without such modifications, provided that the user is made
-clearly aware of them at build time and/or prompted in some
-way to enable or disable them.
-
diff -r f00e1be34737 -r b358a8133947 Makefile
--- a/Makefile Sun May 20 21:26:05 2007 -0400
+++ b/Makefile Mon Apr 16 14:06:32 2007 -0400
@@ -1,14 +1,9 @@ ROOT=.
 ROOT=.
 include ${ROOT}/mk/hdr.mk
 
-PDIRS = \
+DIRS = libixp \
         cmd \
         rc \
         man
 
-DIRS = libixp \
- ${PDIRS}
-
 include ${ROOT}/mk/dir.mk
-INSTDIRS = ${PDIRS}
-
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/Makefile
--- a/cmd/wmii/Makefile Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/Makefile Mon Apr 16 14:06:32 2007 -0400
@@ -14,7 +14,6 @@ OBJ = area \
         bar \
         client \
         column \
- draw \
         event \
         frame \
         fs \
@@ -25,6 +24,7 @@ OBJ = area \
         rule \
         printevent\
         view \
+ x11 \
         ../util
 
 include ${ROOT}/mk/one.mk
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/area.c
--- a/cmd/wmii/area.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/area.c Mon Apr 16 14:06:32 2007 -0400
@@ -27,7 +27,7 @@ create_area(View *v, Area *pos, uint w)
         uint minwidth;
         Area *a, **p;
 
- minwidth = screen->rect.width/NCOL;
+ minwidth = Dx(screen->rect)/NCOL;
 
         p = &v->area;
         if(pos)
@@ -45,37 +45,40 @@ create_area(View *v, Area *pos, uint w)
                 if(colnum) {
                         w = newcolw_of_view(v, max(i-1, 0));
                         if (w == 0)
- w = screen->rect.width / (colnum + 1);
- }
- else w = screen->rect.width;
+ w = Dx(screen->rect) / (colnum + 1);
+ }
+ else w = Dx(screen->rect);
         }
 
         if(w < minwidth)
                 w = minwidth;
- if(colnum && (colnum * minwidth + w) > screen->rect.width)
+ if(colnum && (colnum * minwidth + w) > Dx(screen->rect))
                 return nil;
         if(pos)
- scale_view(v, screen->rect.width - w);
+ scale_view(v, Dx(screen->rect) - w);
 
         a = emallocz(sizeof(Area));
         a->view = v;
         a->id = id++;
- a->rect = screen->rect;
- a->rect.height = screen->rect.height - screen->brect.height;
         a->mode = def.colmode;
- a->rect.width = w;
         a->frame = nil;
         a->sel = nil;
+
+ a->rect = screen->rect;
+ a->rect.max.x = a->rect.min.x + w;
+ a->rect.max.x = screen->brect.min.y;
+
         a->next = *p;
         *p = a;
 
         if(a == v->area)
                 a->floating = True;
- if((!v->sel) ||
- (v->sel->floating && v->area->next == a && a->next == nil))
+
+ if((!v->sel)
+ || (v->sel->floating && v->area->next == a && a->next == nil))
                 focus_area(a);
 
- if(i)
+ if(!a->floating)
                 write_event("CreateColumn %d\n", i);
         return a;
 }
@@ -115,14 +118,18 @@ void
 void
 send_to_area(Area *to, Frame *f) {
         Area *from;
+
         assert(to->view == f->view);
+
         from = f->area;
+
         if(to->floating != from->floating) {
- XRectangle temp = f->revert;
+ Rectangle temp = f->revert;
                 f->revert = f->rect;
                 f->rect = temp;
         }
         f->client->revert = from;
+
         detach_from_area(f);
         attach_to_area(to, f, True);
 }
@@ -147,8 +154,10 @@ attach_to_area(Area *a, Frame *f, Bool s
                 n_frame = 1;
 
         c->floating = a->floating;
- if(!a->floating)
- f->rect.height = a->rect.height / n_frame;
+ if(!a->floating) {
+ f->rect = a->rect;
+ f->rect.max.y = f->rect.min.y + Dx(a->rect) / n_frame;
+ }
 
         insert_frame(a->sel, f, False);
 
@@ -156,13 +165,11 @@ attach_to_area(Area *a, Frame *f, Bool s
                 place_frame(f);
 
         focus_frame(f, False);
- resize_frame(f, &f->rect);
+ resize_frame(f, f->rect);
         restack_view(a->view);
 
         if(!a->floating)
                 arrange_column(a, False);
- else
- resize_frame(f, &f->rect);
 
         update_client_grab(f->client);
         if(a->frame)
@@ -202,18 +209,20 @@ detach_from_area(Frame *f) {
                         i = 0;
                         for(ta=v->area; ta && ta != a; ta=ta->next)
                                 i++;
+
                         if(v->area->next->next)
                                 destroy_area(a);
- else if(!a->frame && v->area->frame)
- /* focus floating area if it contains something */
+ else if((a->frame == nil) && (v->area->frame))
                                 focus_area(v->area);
+
                         arrange_view(v);
                 }
         }
         else if(!a->frame) {
                 if(c->trans) {
- /* focus area of transient, if possible */
- Client *cl = win2client(c->trans);
+ Client *cl;
+
+ cl = win2client(c->trans);
                         if(cl && cl->frame) {
                                 a = cl->sel->area;
                                 if(a->view == v)
@@ -227,7 +236,7 @@ detach_from_area(Frame *f) {
 }
 
 static void
-bit_twiddle(uint *field, uint width, uint x, uint y, Bool set) {
+bit_set(uint *field, uint width, uint x, uint y, Bool set) {
         enum { devisor = sizeof(uint) * 8 };
         uint bx, mask;
 
@@ -254,12 +263,13 @@ place_frame(Frame *f) {
 place_frame(Frame *f) {
         enum { devisor = sizeof(uint) * 8 };
         enum { dx = 8, dy = 8 };
+
         static uint mwidth, mx, my;
         static uint *field = nil;
- BlitzAlign align;
+ Align align;
         XPoint p1 = {0, 0};
         XPoint p2 = {0, 0};
- XRectangle *rects;
+ Rectangle *rects;
         Frame *fr;
         Client *c;
         Area *a;
@@ -267,7 +277,7 @@ place_frame(Frame *f) {
         uint i, j, x, y, cx, cy, maxx, maxy, diff, num;
         int snap;
 
- snap = screen->rect.height / 66;
+ snap = Dy(screen->rect) / 66;
         num = 0;
         fit = False;
         align = CENTER;
@@ -277,43 +287,53 @@ place_frame(Frame *f) {
 
         if(c->trans)
                 return;
- if(c->rect.width >= a->rect.width
- || c->rect.height >= a->rect.height
+ if(Dx(c->rect) >= Dx(a->rect)
+ || Dy(c->rect) >= Dy(a->rect)
                 || c->size.flags & USPosition
                 || c->size.flags & PPosition)
                 return;
         if(!field) {
- mx = screen->rect.width / dx;
- my = screen->rect.height / dy;
+ mx = Dx(screen->rect) / dx;
+ my = Dy(screen->rect) / dy;
                 mwidth = ceil((float)mx / devisor);
                 field = emallocz(sizeof(uint) * mwidth * my);
         }
+
         memset(field, ~0, (sizeof(uint) * mwidth * my));
         for(fr=a->frame; fr; fr=fr->anext) {
                 if(fr == f) {
- cx = f->rect.width / dx;
- cy = f->rect.height / dy;
+ cx = Dx(f->rect) / dx;
+ cy = Dx(f->rect) / dy;
                         continue;
                 }
- if(fr->rect.x < 0)
+
+ if(fr->rect.min.x < 0)
                         x = 0;
                 else
- x = fr->rect.x / dx;
- if(fr->rect.y < 0)
+ x = fr->rect.min.x / dx;
+
+ if(fr->rect.min.y < 0)
                         y = 0;
                 else
- y = fr->rect.y / dy;
- maxx = r_east(&fr->rect) / dx;
- maxy = r_south(&fr->rect) / dy;
+ y = fr->rect.min.y / dy;
+
+ maxx = fr->rect.max.x / dx;
+ maxy = fr->rect.max.y / dy;
                 for(j = y; j < my && j < maxy; j++)
                         for(i = x; i < mx && i < maxx; i++)
- bit_twiddle(field, mwidth, i, j, False);
- }
+ bit_set(field, mwidth, i, j, False);
+ }
+
         for(y = 0; y < my; y++)
                 for(x = 0; x < mx; x++) {
                         if(bit_get(field, mwidth, x, y)) {
- for(i = x; (i < mx) && bit_get(field, mwidth, i, y); i++);
- for(j = y; (j < my) && bit_get(field, mwidth, x, j); j++);
+ for(i = x; i < mx; i++)
+ if(bit_get(field, mwidth, i, y) == 0)
+ break;
+ for(j = y; j < my; j++)
+ if(bit_get(field, mwidth, x, j) == 0)
+ break;
+
                                 if(((i - x) * (j - y) > (p2.x - p1.x) * (p2.y - p1.y))
                                         && (i - x > cx) && (j - y > cy))
                                 {
@@ -325,22 +345,24 @@ place_frame(Frame *f) {
                                 }
                         }
                 }
+
         if(fit) {
                 p1.x *= dx;
                 p1.y *= dy;
         }
- if(fit && (p1.x + f->rect.width < r_south(&a->rect)))
- f->rect.x = p1.x;
- else {
- diff = a->rect.width - f->rect.width;
- f->rect.x = a->rect.x + (random() % (diff ? diff : 1));
- }
- if(fit && (p1.y + f->rect.height < (r_south(&a->rect))))
- f->rect.y = p1.y;
- else {
- diff = a->rect.height - f->rect.height;
- f->rect.y = a->rect.y + (random() % (diff ? diff : 1));
- }
+
+ if(!fit || (p1.x + Dx(f->rect) > a->rect.max.x)) {
+ diff = Dx(a->rect) - Dx(f->rect);
+ p1.x = a->rect.min.x + (random() % min(diff, 1));
+ }
+
+ if(!fit && (p1.y + Dy(f->rect) > a->rect.max.y)) {
+ diff = Dy(a->rect) - Dy(f->rect);
+ p1.y = a->rect.min.y + (random() % min(diff, 1));
+ }
+
+ p1 = subpt(p1, f->rect.min);
+ f->rect = rectaddpt(f->rect, p1);
 
         rects = rects_of_view(a->view, &num, nil);
         snap_rect(rects, num, &f->rect, &align, snap);
@@ -377,10 +399,10 @@ focus_area(Area *a) {
                 i = 0;
                 for(a = v->area; a != v->sel; a = a->next)
                         i++;
- if(i)
+ if(a->floating)
+ write_event("FocusFloating\n");
+ else
                         write_event("ColumnFocus %d\n", i);
- else
- write_event("FocusFloating\n");
                 if(a->frame)
                         write_event("ClientFocus 0x%x\n", a->sel->client->win);
         }
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/bar.c
--- a/cmd/wmii/bar.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/bar.c Mon Apr 16 14:06:32 2007 -0400
@@ -2,6 +2,7 @@
  * Copyright ©2006-2007 Kris Maglione <fbsdaemon_AT_gmail.com>
  * See LICENSE file for license details.
  */
+#include <stdio.h>
 #include <string.h>
 #include <util.h>
 #include "dat.h"
@@ -10,12 +11,14 @@ Bar *free_bars = nil;
 Bar *free_bars = nil;
 
 Bar *
-create_bar(Bar **b_link, char *name) {
+create_bar(Bar **bp, char *name) {
         static uint id = 1;
- Bar **i, *b = bar_of_name(*b_link, name);;
+ Bar *b;
 
+ b = bar_of_name(*bp, name);;
         if(b)
                 return b;
+
         if(free_bars) {
                 b = free_bars;
                 free_bars = b->next;
@@ -23,26 +26,28 @@ create_bar(Bar **b_link, char *name) {
         }
         else
                 b = emallocz(sizeof(Bar));
+
         b->id = id++;
         strncpy(b->name, name, sizeof(b->name));
- b->brush = screen->bbrush;
- b->brush.color = def.normcolor;
- for(i = b_link; *i; i = &(*i)->next)
- if(strcmp((*i)->name, name) >= 0)
+ b->col = def.normcolor;
+
+ for(; *bp; bp = &(*bp)->next)
+ if(strcmp((*bp)->name, name) >= 0)
                         break;
- b->next = *i;
- *i = b;
+ b->next = *bp;
+ *bp = b;
 
         return b;
 }
 
 void
-destroy_bar(Bar **b_link, Bar *b) {
+destroy_bar(Bar **bp, Bar *b) {
         Bar **p;
 
- for(p = b_link; *p; p = &(*p)->next)
+ for(p = bp; *p; p = &(*p)->next)
                 if(*p == b) break;
         *p = b->next;
+
         b->next = free_bars;
         free_bars = b;
 }
@@ -52,11 +57,11 @@ resize_bar(WMScreen *s) {
         View *v;
 
         s->brect = s->rect;
- s->brect.height = labelh(&def.font);
- s->brect.y = s->rect.height - s->brect.height;
+ s->brect.min.y = s->brect.max.y - labelh(def.font);
 
- XMoveResizeWindow(blz.dpy, s->barwin, s->brect.x, s->brect.y, s->brect.width, s->brect.height);
- XSync(blz.dpy, False);
+ reshapewin(s->barwin, s->brect);
+
+ XSync(display, False);
         draw_bar(s);
         for(v = view; v; v = v->next)
                 arrange_view(v);
@@ -64,11 +69,13 @@ resize_bar(WMScreen *s) {
 
 void
 draw_bar(WMScreen *s) {
+ Bar *b, *tb, *largest, **pb;
+ Rectangle r;
+ Align align;
         uint width, tw, nb, size;
         float shrink;
- Bar *b, *tb, *largest, **pb;
 
- draw_tile(&s->bbrush);
+ fill(screen->ibuf, s->brect, def.normcolor.bg);
         if(!s->bar[BarLeft] && !s->bar[BarRight])
                 goto MapBar;
 
@@ -76,62 +83,67 @@ draw_bar(WMScreen *s) {
         tw = width = nb = size = 0;
         for(nb = 0; nb < nelem(s->bar); nb++)
                 for(b = s->bar[nb]; b; b=b->next) {
- b->brush.rect.x = b->brush.rect.y = 0;
- b->brush.rect.width = def.font.height & ~1;
+ b->r.min = ZP;
+ b->r.max.y = Dy(s->brect);
+ b->r.max.x = def.font->height & ~1;
                         if(b->text && strlen(b->text))
- b->brush.rect.width += textwidth(b->brush.font, b->text);
- b->brush.rect.height = s->brect.height;
- width += b->brush.rect.width;
+ b->r.max.x += textwidth(def.font, b->text);
+
+ width += Dx(b->r);
                 }
+
         /* Not enough room. Shrink bars until they all fit */
- if(width > s->brect.width) {
+ if(width > Dx(s->brect)) {
                 for(nb = 0; nb < nelem(s->bar); nb++)
                         for(b = s->bar[nb]; b; b=b->next) {
                                 for(pb = &largest; *pb; pb = &(*pb)->smaller)
- if((*pb)->brush.rect.width < b->brush.rect.width)
+ if(Dx((*pb)->r) < Dx(b->r))
                                                 break;
                                 b->smaller = *pb;
                                 *pb = b;
                         }
                 for(tb = largest; tb; tb = tb->smaller) {
- width -= tb->brush.rect.width;
- tw += tb->brush.rect.width;
- shrink = (s->brect.width - width) / (float)tw;
+ width -= Dx(tb->r);
+ tw += Dx(tb->r);
+ shrink = (Dx(s->brect) - width) / (float)tw;
                         if(tb->smaller)
- if(tb->brush.rect.width * shrink >= tb->smaller->brush.rect.width)
- break;
+ if(Dx(tb->r) * shrink >= Dx(tb->smaller->r))
+ break;
                 }
                 if(tb)
- for(b = largest; b != tb->smaller; b = b->smaller)
- b->brush.rect.width = (int)(b->brush.rect.width * shrink);
+ for(b = largest; b != tb->smaller; b = b->smaller)
+ b->r.max.x *= shrink;
                 width += tw * shrink;
                 tb = nil;
         }
+
         for(nb = 0; nb < nelem(s->bar); nb++)
                 for(b = s->bar[nb]; b; tb=b, b=b->next) {
                         if(b == s->bar[BarRight]) {
- b->brush.align = EAST;
- b->brush.rect.width += (s->brect.width - width);
+ align = EAST;
+ b->r.max.x += Dx(s->brect) - width;
                         }else
- b->brush.align = CENTER;
+ align = CENTER;
+
                         if(tb)
- b->brush.rect.x = tb->brush.rect.x + tb->brush.rect.width;
- draw_label(&b->brush, b->text);
- draw_border(&b->brush);
+ b->r = rectaddpt(b->r, Pt( tb->r.max.x, 0));
+
+ fill(screen->ibuf, b->r, b->col.bg);
+ drawstring(screen->ibuf, def.font, b->r, align, b->text, b->col.fg);
+ border(screen->ibuf, b->r, 1, b->col.border);
                 }
 MapBar:
- XCopyArea(blz.dpy, s->bbrush.drawable, s->barwin, s->bbrush.gc, 0, 0,
- s->brect.width, s->brect.height, 0, 0);
- XSync(blz.dpy, False);
+ r = rectsubpt(s->brect, s->brect.min);
+ copyimage(s->barwin, r, screen->ibuf, ZP);
+ XSync(display, False);
 }
 
 Bar *
-bar_of_name(Bar *b_link, const char *name) {
- static char buf[256];
+bar_of_name(Bar *bp, const char *name) {
         Bar *b;
 
- strncpy(buf, name, sizeof(buf));
- for(b = b_link; b; b = b->next)
- if(!strncmp(b->name, name, sizeof(b->name))) break;
+ for(b = bp; b; b = b->next)
+ if(!strncmp(b->name, name, sizeof(b->name)))
+ break;
         return b;
 }
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/client.c
--- a/cmd/wmii/client.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/client.c Mon Apr 16 14:06:32 2007 -0400
@@ -26,26 +26,26 @@ enum {
 };
 
 Client *
-create_client(Window w, XWindowAttributes *wa) {
+create_client(XWindow w, XWindowAttributes *wa) {
         Client **t, *c;
- XSetWindowAttributes fwa;
+ WinAttr fwa;
 
         c = emallocz(sizeof(Client));
- c->win = w;
- c->rect.x = wa->x;
- c->rect.y = wa->y;
         c->border = wa->border_width;
- c->rect.width = wa->width;
- c->rect.height = wa->height;
-
- c->proto = win_proto(c->win);
+ c->rect.min = Pt(wa->x, wa->y);
+ c->rect.max = addpt(c->rect.min, Pt(wa->width, wa->height));
+
+ c->win.type = WWindow;
+ c->win.w = w;
+
+ c->proto = winprotocols(&c->win);
         prop_client(c, XA_WM_TRANSIENT_FOR);
         prop_client(c, XA_WM_NORMAL_HINTS);
         prop_client(c, XA_WM_HINTS);
         prop_client(c, XA_WM_NAME);
 
- XSetWindowBorderWidth(blz.dpy, c->win, 0);
- XAddToSaveSet(blz.dpy, c->win);
+ XSetWindowBorderWidth(display, w, 0);
+ XAddToSaveSet(display, w);
 
         fwa.override_redirect = True;
         fwa.background_pixmap = ParentRelative;
@@ -59,23 +59,12 @@ create_client(Window w, XWindowAttribute
                 | KeyPressMask
                 | ButtonPressMask
                 | ButtonReleaseMask;
- c->framewin = XCreateWindow(
- /* display */ blz.dpy,
- /* parent */ blz.root,
- /* x */ c->rect.x,
- /* y */ c->rect.y,
- /* width */ c->rect.width + 2 * def.border,
- /* height */ c->rect.height + def.border + labelh(&def.font),
- /* border */ 0,
- /* depth */ DefaultDepth(blz.dpy, blz.screen),
- /* class */ CopyFromParent,
- /* visual */ DefaultVisual(blz.dpy, blz.screen),
- /* valuemask */ CWOverrideRedirect | CWEventMask | CWBackPixmap | CWBackingStore,
- /* attributes */&fwa
- );
-
- c->gc = XCreateGC(blz.dpy, c->framewin, 0, 0);
- XSync(blz.dpy, False);
+ c->framewin = createwindow(&scr.root, c->rect, scr.depth, InputOutput, &fwa,
+ CWOverrideRedirect
+ | CWEventMask
+ | CWBackPixmap
+ | CWBackingStore);
+ XSync(display, False);
 
         for(t=&client ;; t=&(*t)->next)
                 if(!*t) {
@@ -99,7 +88,7 @@ destroy_client(Client *c) {
         Client **tc;
         XEvent ev;
 
- XGrabServer(blz.dpy);
+ XGrabServer(display);
         /* In case the client is already unmapped */
         XSetErrorHandler(dummy_error_handler);
 
@@ -114,18 +103,17 @@ destroy_client(Client *c) {
 
         unmap_client(c, WithdrawnState);
         gravitate_client(c, True);
- reparent_client(c, blz.root, c->rect.x, c->rect.y);
-
- XFreeGC(blz.dpy, c->gc);
- XDestroyWindow(blz.dpy, c->framewin);
- XSync(blz.dpy, False);
+ reparent_client(c, &scr.root, c->rect.min);
+
+ destroywindow(c->framewin);
+ XSync(display, False);
 
         XSetErrorHandler(wmii_error_handler);
- XUngrabServer(blz.dpy);
+ XUngrabServer(display);
         flushevents(EnterWindowMask, False);
 
- while(XCheckMaskEvent(blz.dpy, StructureNotifyMask, &ev))
- if(ev.type != UnmapNotify || ev.xunmap.window != c->win)
+ while(XCheckMaskEvent(display, StructureNotifyMask, &ev))
+ if(ev.type != UnmapNotify || ev.xunmap.window != c->win.w)
                         dispatch_event(&ev);
 
         write_event("DestroyClient 0x%x\n", c->win);
@@ -137,7 +125,7 @@ manage_client(Client *c) {
         XTextProperty tags = { 0 };
         Client *trans;
 
- XGetTextProperty(blz.dpy, c->win, &tags, atom[TagsAtom]);
+ XGetTextProperty(display, c->win.w, &tags, atom[TagsAtom]);
 
         if((trans = win2client(c->trans)))
                 strncpy(c->tags, trans->tags, sizeof(c->tags));
@@ -146,7 +134,7 @@ manage_client(Client *c) {
         XFree(tags.value);
 
         gravitate_client(c, False);
- reparent_client(c, c->framewin, def.border, labelh(&def.font));
+ reparent_client(c, c->framewin, Pt(def.border, labelh(def.font)));
 
         if(!strlen(c->tags))
                 apply_rules(c);
@@ -155,7 +143,7 @@ manage_client(Client *c) {
 
         if(!starting)
                 update_views();
- XSync(blz.dpy, False);
+ XSync(display, False);
 
         if(c->sel->view == screen->sel)
                 focus(c, True);
@@ -170,18 +158,18 @@ selclient() {
 }
 
 Client *
-win2client(Window w) {
+win2client(XWindow w) {
         Client *c;
         for(c=client; c; c=c->next)
- if(c->win == w) break;
+ if(c->win.w == w) break;
         return c;
 }
 
 Frame *
-win2frame(Window w) {
+win2frame(XWindow w) {
         Client *c;
         for(c=client; c; c=c->next)
- if(c->framewin == w) break;
+ if(c->framewin->w == w) break;
         if(c)
                 return c->sel;
         return nil;
@@ -196,15 +184,15 @@ update_client_name(Client *c) {
 
         name.nitems = 0;
         c->name[0] = 0;
- XGetTextProperty(blz.dpy, c->win, &name, atom[NetWMName]);
+ XGetTextProperty(display, c->win.w, &name, atom[NetWMName]);
         if(!name.nitems)
- XGetWMName(blz.dpy, c->win, &name);
+ XGetWMName(display, c->win.w, &name);
         if(!name.nitems)
                 return;
         if(name.encoding == XA_STRING)
                 strncpy(c->name, (char *)name.value, sizeof(c->name));
         else {
- if(XmbTextPropertyToTextList(blz.dpy, &name, &list, &n) >= Success
+ if(XmbTextPropertyToTextList(display, &name, &list, &n) >= Success
                                 && n > 0 && *list)
                 {
                         strncpy(c->name, *list, sizeof(c->name));
@@ -212,7 +200,7 @@ update_client_name(Client *c) {
                 }
         }
         XFree(name.value);
- if(XGetClassHint(blz.dpy, c->win, &ch)) {
+ if(XGetClassHint(display, c->win.w, &ch)) {
                 snprintf(c->props, sizeof(c->props),
                                 "%s:%s:%s",
                                 str_nil(ch.res_class),
@@ -233,13 +221,13 @@ update_client_grab(Client *c) {
         || (f->area->floating && f != f->area->stack)) {
                 if(verbose)
                         fprintf(stderr, "update_client_grab(%p) AnyButton => %s\n", c, str_nil(c->name));
- grab_button(c->framewin, AnyButton, AnyModifier);
+ grab_button(c->framewin->w, AnyButton, AnyModifier);
         }else {
                 if(verbose)
                         fprintf(stderr, "update_client_grab(%p) def.mod => %s\n", c, str_nil(c->name));
- XUngrabButton(blz.dpy, AnyButton, AnyModifier, c->framewin);
- grab_button(c->framewin, Button1, def.mod);
- grab_button(c->framewin, Button3, def.mod);
+ XUngrabButton(display, AnyButton, AnyModifier, c->framewin->w);
+ grab_button(c->framewin->w, Button1, def.mod);
+ grab_button(c->framewin->w, Button3, def.mod);
         }
 }
 
@@ -247,8 +235,8 @@ set_client_state(Client * c, int state)
 set_client_state(Client * c, int state) {
         long data[] = { state, None };
         XChangeProperty(
- /* display */ blz.dpy,
- /* parent */ c->win,
+ /* display */ display,
+ /* parent */ c->win.w,
                 /* property */ atom[WMState],
                 /* type */ atom[WMState],
                 /* format */ 32,
@@ -261,9 +249,9 @@ void
 void
 map_client(Client *c) {
         if(!c->mapped) {
- XSelectInput(blz.dpy, c->win, ClientMask & ~StructureNotifyMask);
- XMapWindow(blz.dpy, c->win);
- XSelectInput(blz.dpy, c->win, ClientMask);
+ XSelectInput(display, c->win.w, ClientMask & ~StructureNotifyMask);
+ XMapWindow(display, c->win.w);
+ XSelectInput(display, c->win.w, ClientMask);
                 set_client_state(c, NormalState);
                 c->mapped = 1;
         }
@@ -273,74 +261,72 @@ unmap_client(Client *c, int state) {
 unmap_client(Client *c, int state) {
         if(c->mapped) {
                 c->unmapped++;
- XSelectInput(blz.dpy, c->win, ClientMask & ~StructureNotifyMask);
- XUnmapWindow(blz.dpy, c->win);
- XSelectInput(blz.dpy, c->win, ClientMask);
+ XSelectInput(display, c->win.w, ClientMask & ~StructureNotifyMask);
+ XUnmapWindow(display, c->win.w);
+ XSelectInput(display, c->win.w, ClientMask);
                 set_client_state(c, state);
                 c->mapped = 0;
         }
 }
 
-void
+int
 map_frame(Client *c) {
- if(!c->frame_mapped) {
- XMapWindow(blz.dpy, c->framewin);
- c->frame_mapped = True;
- }
-}
-
-void
+ return mapwin(c->framewin);
+}
+
+int
 unmap_frame(Client *c) {
- if(c->frame_mapped) {
- XUnmapWindow(blz.dpy, c->framewin);
- c->frame_mapped = False;
- }
-}
-
-void
-reparent_client(Client *c, Window w, int x, int y) {
- XSelectInput(blz.dpy, c->win, ClientMask & ~StructureNotifyMask);
- XReparentWindow(blz.dpy, c->win, w, x, y);
- XSelectInput(blz.dpy, c->win, ClientMask);
+ return unmapwin(c->framewin);
+}
+
+void
+reparent_client(Client *c, Window *w, Point pt) {
+ XSelectInput(display, c->win.w, ClientMask & ~StructureNotifyMask);
+ XReparentWindow(display, c->win.w, w->w, pt.x, pt.y);
+ XSelectInput(display, c->win.w, ClientMask);
 }
 
 void
 set_cursor(Client *c, Cursor cur) {
- XSetWindowAttributes wa;
+ WinAttr wa;
 
         if(c->cursor != cur) {
                 c->cursor = cur;
                 wa.cursor = cur;
- XChangeWindowAttributes(blz.dpy, c->framewin, CWCursor, &wa);
+ setwinattr(c->framewin, &wa, CWCursor);
         }
 }
 
 void
 configure_client(Client *c) {
         XConfigureEvent e;
+ Rectangle r;
         Frame *f;
 
         f = c->sel;
         if(!f)
                 return;
+
+ r = rectaddpt(f->crect, f->rect.min);
+ r = insetrect(r, -c->border);
 
         e.type = ConfigureNotify;
- e.event = c->win;
- e.window = c->win;
- e.x = f->crect.x + f->rect.x - c->border;
- e.y = f->crect.y + f->rect.y - c->border;
- e.width = f->crect.width;
- e.height = f->crect.height;
+ e.event = c->win.w;
+ e.window = c->win.w;
+ e.x = r.min.x;
+ e.y = r.max.x;
+ e.width = Dx(r);
+ e.height = Dy(r);
         e.border_width = c->border;
         e.above = None;
         e.override_redirect = False;
- XSendEvent(blz.dpy, c->win, False,
+ XSendEvent(display, c->win.w, False,
                         StructureNotifyMask, (XEvent *) & e);
- XSync(blz.dpy, False);
+ XSync(display, False);
 }
 
 static void
-send_client_message(Window w, Atom a, long value) {
+send_client_message(XWindow w, Atom a, long value) {
         XEvent e;
 
         e.type = ClientMessage;
@@ -349,16 +335,16 @@ send_client_message(Window w, Atom a, lo
         e.xclient.format = 32;
         e.xclient.data.l[0] = value;
         e.xclient.data.l[1] = CurrentTime;
- XSendEvent(blz.dpy, w, False, NoEventMask, &e);
- XSync(blz.dpy, False);
+ XSendEvent(display, w, False, NoEventMask, &e);
+ XSync(display, False);
 }
 
 void
 kill_client(Client * c) {
         if(c->proto & WM_PROTOCOL_DELWIN)
- send_client_message(c->win, atom[WMProtocols], atom[WMDelete]);
+ send_client_message(c->win.w, atom[WMProtocols], atom[WMDelete]);
         else
- XKillClient(blz.dpy, c->win);
+ XKillClient(display, c->win.w);
 }
 
 static void
@@ -393,13 +379,13 @@ set_urgent(Client *c, Bool urgent, Bool
         }
 
         if(write) {
- wmh = XGetWMHints(blz.dpy, c->win);
+ wmh = XGetWMHints(display, c->win.w);
                 if(wmh) {
                         if(urgent)
                                 wmh->flags |= XUrgencyHint;
                         else
                                 wmh->flags &= ~XUrgencyHint;
- XSetWMHints(blz.dpy, c->win, wmh);
+ XSetWMHints(display, c->win.w, wmh);
                         XFree(wmh);
                 }
         }
@@ -411,18 +397,19 @@ prop_client(Client *c, Atom a) {
         long msize;
 
         if(a == atom[WMProtocols])
- c->proto = win_proto(c->win);
+ c->proto = winprotocols(&c->win);
         else if(a== atom[NetWMName]) {
 wmname:
                 update_client_name(c);
                 if(c->frame)
                         draw_frame(c->sel);
- }else switch (a) {
+ }
+ else switch (a) {
         case XA_WM_TRANSIENT_FOR:
- XGetTransientForHint(blz.dpy, c->win, &c->trans);
+ XGetTransientForHint(display, c->win.w, &c->trans);
                 break;
         case XA_WM_NORMAL_HINTS:
- if(!XGetWMNormalHints(blz.dpy, c->win, &c->size, &msize) || !c->size.flags)
+ if(!XGetWMNormalHints(display, c->win.w, &c->size, &msize) || !c->size.flags)
                         c->size.flags = PSize;
                 c->fixedsize = False;
                 if((c->size.flags & PMinSize) && (c->size.flags & PMaxSize)
@@ -431,7 +418,7 @@ wmname:
                                 c->fixedsize = True;
                 break;
         case XA_WM_HINTS:
- wmh = XGetWMHints(blz.dpy, c->win);
+ wmh = XGetWMHints(display, c->win.w);
                 if(wmh) {
                         set_urgent(c, (wmh->flags & XUrgencyHint) != 0, False);
                         XFree(wmh);
@@ -444,7 +431,7 @@ wmname:
 
 void
 gravitate_client(Client *c, Bool invert) {
- int dx, dy;
+ Point d;
         int gravity;
 
         gravity = NorthWestGravity;
@@ -452,68 +439,66 @@ gravitate_client(Client *c, Bool invert)
                 gravity = c->size.win_gravity;
         }
 
- dy = 0;
+ d.y = 0;
         switch (gravity) {
         case StaticGravity:
         case NorthWestGravity:
         case NorthGravity:
         case NorthEastGravity:
- dy = labelh(&def.font);
+ d.y = labelh(def.font);
                 break;
         case EastGravity:
         case CenterGravity:
         case WestGravity:
- dy = -(c->rect.height / 2) + labelh(&def.font);
+ d.y = -(Dy(c->rect) / 2) + labelh(def.font);
                 break;
         case SouthEastGravity:
         case SouthGravity:
         case SouthWestGravity:
- dy = -c->rect.height;
+ d.y = -Dy(c->rect);
                 break;
         default:
                 break;
         }
 
- dx = 0;
+ d.x = 0;
         switch (gravity) {
         case StaticGravity:
         case NorthWestGravity:
         case WestGravity:
         case SouthWestGravity:
- dx = def.border;
+ d.x = def.border;
                 break;
         case NorthGravity:
         case CenterGravity:
         case SouthGravity:
- dx = -(c->rect.width / 2) + def.border;
+ d.x = -(Dx(c->rect) / 2) + def.border;
                 break;
         case NorthEastGravity:
         case EastGravity:
         case SouthEastGravity:
- dx = -(c->rect.width + def.border);
+ d.x = -(Dy(c->rect) + def.border);
                 break;
         default:
                 break;
         }
 
- if(invert) {
- dx = -dx;
- dy = -dy;
- }
- c->rect.x += dx;
- c->rect.y += dy;
-}
-
-void
-apply_sizehints(Client *c, XRectangle *r, Bool floating, Bool frame, BlitzAlign sticky) {
+ if(invert)
+ rectsubpt(c->rect, d);
+ else
+ rectaddpt(c->rect, d);
+}
+
+void
+apply_sizehints(Client *c, Rectangle *r, Bool floating, Bool frame, Align sticky) {
         XSizeHints *s;
- XRectangle orig;
+ Rectangle r2;
         uint bw, bh;
         
         s = &c->size;
- orig = *r;
+ r2 = rectsubpt(*r, r->min);
         if(frame)
- frame2client(c->sel, r);
+ r2 = frame2client(c->sel, r2);
         bw = 0;
         bh = 0;
 
@@ -521,17 +506,17 @@ apply_sizehints(Client *c, XRectangle *r
                 bw = s->min_width;
                 bh = s->min_height;
                 if(floating) {
- if(r->width < s->min_width)
- r->width = s->min_width;
- if(r->height < s->min_height)
- r->height = s->min_height;
+ if(Dx(r2) < s->min_width)
+ r2.max.x = s->min_width;
+ if(Dy(r2) < s->min_height)
+ r2.max.y = s->min_height;
                 }
         }
         if(s->flags & PMaxSize) {
- if(r->width > s->max_width)
- r->width = s->max_width;
- if(r->height > s->max_height)
- r->height = s->max_height;
+ if(Dx(r2) > s->max_width)
+ r2.max.x = s->min_width;
+ if(Dy(r2) > s->max_height)
+ r2.max.y = s->min_height;
         }
 
         if(s->flags & PBaseSize) {
@@ -541,9 +526,9 @@ apply_sizehints(Client *c, XRectangle *r
 
         if(s->flags & PResizeInc) {
                 if(s->width_inc > 0)
- r->width -= (r->width - bw) % s->width_inc;
+ r2.max.x -= (Dx(r2) - bw) % s->width_inc;
                 if(s->height_inc > 0)
- r->height -= (r->height - bh) % s->height_inc;
+ r2.max.y -= (Dy(r2) - bh) % s->height_inc;
         }
 
         if((s->flags & (PBaseSize|PMinSize)) == PMinSize) {
@@ -556,27 +541,29 @@ apply_sizehints(Client *c, XRectangle *r
 
                 min = (double)s->min_aspect.x / s->min_aspect.y;
                 max = (double)s->max_aspect.x / s->max_aspect.y;
- initial = (double)(r->width - bw) / (r->height - bh);
+ initial = (double)(Dx(r2) - bw) / (Dy(r2) - bh);
                 if(initial < min)
- r->height = bh + (r->width - bw) / min;
+ r2.max.y = bh + (Dx(r2) - bw) / min;
                 if(initial > max)
- r->width = bw + (r->height - bh) * max;
+ r2.max.x = bw + (Dy(r2) - bh) * max;
         }
 
         if(frame)
- client2frame(c->sel, r);
+ r2 = client2frame(c->sel, r2);
 
         if(!(s->flags & PMinSize) || !floating) {
- if(r->width > orig.width)
- r->width = orig.width;
- if(r->height > orig.height)
- r->height = orig.height;
- }
-
+ /* Not allowed to grow */
+ if(Dx(r2) > Dx(*r))
+ r2.max.x =Dx(*r);
+ if(Dy(r2) > Dy(*r))
+ r2.max.y = Dy(*r);
+ }
+
         if((sticky & (EAST|WEST)) == EAST)
- r->x = r_east(&orig) - r->width;
+ r->min.x = r->max.x - Dx(r2);
         if((sticky & (NORTH|SOUTH)) == SOUTH)
- r->y = r_south(&orig) - r->height;
+ r->min.y = r->max.y - Dy(r2);
+ *r = rectaddpt(r2, r->min);
 }
 
 void
@@ -605,21 +592,21 @@ focus_client(Client *c) {
                         fprintf(stderr, "\t%s => %s\n", (screen->focus ? screen->focus->name : "<nil>"),
                                         (c ? c->name : "<nil>"));
                 if(c) {
- XSetInputFocus(blz.dpy, c->win, RevertToParent, CurrentTime);
+ XSetInputFocus(display, c->win.w, RevertToParent, CurrentTime);
                         update_client_grab(c);
                 }else
- XSetInputFocus(blz.dpy, screen->barwin, RevertToParent, CurrentTime);
+ XSetInputFocus(display, screen->barwin->w, RevertToParent, CurrentTime);
         }
 
         flushevents(FocusChangeMask, True);
 }
 
 void
-resize_client(Client *c, XRectangle *r) {
+resize_client(Client *c, Rectangle *r) {
         Frame *f;
 
         f = c->sel;
- resize_frame(f, r);
+ resize_frame(f, *r);
 
         if(f->area->view != screen->sel) {
                 unmap_client(c, IconicState);
@@ -627,27 +614,20 @@ resize_client(Client *c, XRectangle *r)
                 return;
         }
 
- c->rect = f->crect;
- c->rect.x += f->rect.x;
- c->rect.y += f->rect.y;
+ c->rect = rectaddpt(f->crect, f->rect.min);
+
         if((f->area->mode == Colmax)
         && (f->area->sel != f)) {
                 unmap_frame(c);
                 unmap_client(c, IconicState);
         }else if(f->collapsed) {
- XMoveResizeWindow(blz.dpy, c->framewin,
- f->rect.x, f->rect.y,
- f->rect.width, f->rect.height);
+ reshapewin(c->framewin, f->rect);
                 map_frame(c);
                 unmap_client(c, IconicState);
         }else {
- XMoveResizeWindow(blz.dpy, c->win,
- f->crect.x, f->crect.y,
- f->crect.width, f->crect.height);
+ reshapewin(&c->win, f->crect);
                 map_client(c);
- XMoveResizeWindow(blz.dpy, c->framewin,
- f->rect.x, f->rect.y,
- f->rect.width, f->rect.height);
+ reshapewin(c->framewin, f->rect);
                 map_frame(c);
                 configure_client(c);
         }
@@ -893,7 +873,7 @@ apply_tags(Client *c, const char *tags)
         toks[n] = nil;
 
         update_client_views(c, toks);
- XChangeProperty(blz.dpy, c->win, atom[TagsAtom], XA_STRING, 8,
+ XChangeProperty(display, c->win.w, atom[TagsAtom], XA_STRING, 8,
                         PropModeReplace, (uchar *)c->tags, strlen(c->tags));
 }
 
@@ -917,11 +897,11 @@ apply_rules(Client *c) {
 
 char *
 message_client(Client *c, char *message) {
- if(!strncmp(message, "kill", 5))
+ if(!strcmp(message, "kill"))
                 kill_client(c);
- else if(!strncmp(message, "Urgent", 7))
+ else if(!strcmp(message, "Urgent"))
                 set_urgent(c, True, True);
- else if(!strncmp(message, "NotUrgent", 10))
+ else if(!strcmp(message, "NotUrgent"))
                 set_urgent(c, False, True);
         else
                 return Ebadcmd;
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/column.c
--- a/cmd/wmii/column.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/column.c Mon Apr 16 14:06:32 2007 -0400
@@ -6,7 +6,6 @@
 #include <math.h>
 #include <stdio.h>
 #include <string.h>
-#include <X11/extensions/shape.h>
 #include <util.h>
 #include "dat.h"
 #include "fns.h"
@@ -22,11 +21,11 @@ char *modes[] = {
 };
 
 Divide *
-win2div(Window w) {
+win2div(XWindow w) {
         Divide *d;
         
         for(d = divs; d; d = d->next)
- if(d->w == w) return d;
+ if(d->w->w == w) return d;
         return nil;
 }
 
@@ -41,60 +40,45 @@ str2colmode(const char *str) {
 }
 
 static void
-draw_pmap(Pixmap pm, GC gc, Bool color) {
- XPoint pt[4];
-
- pt[0] = (XPoint){ 0, 0 };
- pt[1] = (XPoint){ divw/2 - 1, divw/2 - 1 };
- pt[2] = (XPoint){ divw/2, divw/2 - 1 };
- pt[3] = (XPoint){ divw - 1, 0 };
-
- if(color)
- XSetForeground(blz.dpy, gc, def.normcolor.bg);
- else {
- XSetForeground(blz.dpy, gc, 0);
- XFillRectangle(blz.dpy, pm, gc, 0, 0, divw, divh);
- XSetForeground(blz.dpy, gc, 1);
- }
-
- XFillPolygon(blz.dpy, pm, gc, pt, nelem(pt), Convex, CoordModeOrigin);
-
- if(color)
- XSetForeground(blz.dpy, gc, def.normcolor.border);
-
- XDrawLines(blz.dpy, pm, gc, pt, nelem(pt), CoordModeOrigin);
- XDrawRectangle(blz.dpy, pm, gc, pt[1].x, pt[1].y, 1, screen->rect.height);
+draw_pmap(Image *img, ulong cbg, ulong cborder) {
+ Point pt[6];
+
+ pt[0] = Pt(0, 0);
+ pt[1] = Pt(divw/2 - 1, divw/2 - 1);
+
+ pt[2] = Pt(pt[1].x, divh);
+ pt[3] = Pt(divw/2, pt[2].y);
+
+ pt[4] = Pt(pt[3].x, divw/2 - 1);
+ pt[5] = Pt(divw - 1, 0);
+
+ fillpoly(img, pt, nelem(pt), cbg);
+ drawpoly(img, pt, nelem(pt), CapNotLast, 1, cborder);
 }
 
 void
 update_dividers() {
- if(divmap) {
- XFreePixmap(blz.dpy, divmap);
- XFreePixmap(blz.dpy, divmask);
- XFreeGC(blz.dpy, divgc);
- XFreeGC(blz.dpy, maskgc);
- }
-
- divw = 2 * (labelh(&def.font) / 3);
+ if(divimg) {
+ freeimage(divimg);
+ freeimage(divmask);
+ }
+
+ divw = 2 * (labelh(def.font) / 3);
         divw = max(divw, 10);
- divh = screen->rect.height;
-
- divmap = XCreatePixmap(blz.dpy, blz.root,
- divw, divh,
- DefaultDepth(blz.dpy, blz.screen));
- divmask = XCreatePixmap(blz.dpy, blz.root,
- divw, divh,
- 1);
- divgc = XCreateGC(blz.dpy, divmap, 0, 0);
- maskgc = XCreateGC(blz.dpy, divmask, 0, 0);
-
- draw_pmap(divmap, divgc, True);
- draw_pmap(divmask, maskgc, False);
+ divh = Dy(screen->rect);
+
+ divimg = allocimage(divw, divh, scr.depth);
+ divmask = allocimage(divw, divh, 1);
+
+ fill(divmask, divmask->r, 0);
+
+ draw_pmap(divimg, def.normcolor.bg, def.normcolor.border);
+ draw_pmap(divmask, 1, 1);
 }
 
 static Divide*
 get_div(Divide **dp) {
- XSetWindowAttributes wa;
+ WinAttr wa;
         Divide *d;
 
         if(*dp)
@@ -103,27 +87,16 @@ get_div(Divide **dp) {
         d = emallocz(sizeof *d);
 
         wa.override_redirect = True;
- wa.background_pixmap = ParentRelative;
         wa.cursor = cursor[CurDHArrow];
         wa.event_mask =
- SubstructureRedirectMask
- | ExposureMask
+ ExposureMask
                 | EnterWindowMask
- | PointerMotionMask
                 | ButtonPressMask
                 | ButtonReleaseMask;
- d->w = XCreateWindow(
- /* display */ blz.dpy,
- /* parent */ blz.root,
- /* x, y */ 0, 0,
- /* w, h */ 1, 1,
- /* border */ 0,
- /* depth */ DefaultDepth(blz.dpy, blz.screen),
- /* class */ CopyFromParent,
- /* visual */ DefaultVisual(blz.dpy, blz.screen),
- /* valuemask */ CWOverrideRedirect | CWEventMask | CWBackPixmap | CWCursor,
- /* attributes */&wa
- );
+ d->w = createwindow(&scr.root, Rect(0, 0, 1, 1), scr.depth, InputOutput, &wa,
+ CWOverrideRedirect
+ | CWEventMask
+ | CWCursor);
 
         *dp = d;
         return d;
@@ -131,26 +104,23 @@ get_div(Divide **dp) {
 
 static void
 map_div(Divide *d) {
- if(!d->mapped)
- XMapWindow(blz.dpy, d->w);
- d->mapped = 1;
+ mapwin(d->w);
 }
 
 static void
 unmap_div(Divide *d) {
- if(d->mapped)
- XUnmapWindow(blz.dpy, d->w);
- d->mapped = 0;
-}
-
-static void
-move_div(Divide *d, int x) {
- d->x = x - divw/2;
-
- XMoveResizeWindow(blz.dpy,
- d->w,
- d->x, 0,
- divw, divh);
+ unmapwin(d->w);
+}
+
+void
+setdiv(Divide *d, int x) {
+ Rectangle r;
+
+ d->x = x;
+ r = rectaddpt(divimg->r, Pt(x - divw/2, 0));
+ r.max.y = screen->brect.min.y;
+
+ reshapewin(d->w, r);
         map_div(d);
 }
 
@@ -161,18 +131,18 @@ update_divs() {
         View *v;
 
         update_dividers();
-
+
         v = screen->sel;
         dp = &divs;
         for(a = v->area->next; a; a = a->next) {
                 d = get_div(dp);
                 dp = &d->next;
- d->x = a->rect.x - divw/2;
- move_div(d, a->rect.x);
+ setdiv(d, a->rect.min.x);
+
                 if(!a->next) {
                         d = get_div(dp);
                         dp = &d->next;
- move_div(d, r_east(&a->rect));
+ setdiv(d, a->rect.max.x);
                 }
         }
         for(d = *dp; d; d = d->next)
@@ -181,22 +151,22 @@ update_divs() {
 
 void
 draw_div(Divide *d) {
- XCopyArea(
- blz.dpy,
- divmap, d->w,
- divgc,
- /* x, y */ 0, 0,
- /* w, h */ divw, divh,
- /* dest x, y */ 0, 0
- );
- XShapeCombineMask (
- /* dpy */ blz.dpy,
- /* dst */ d->w,
- /* type */ ShapeBounding,
- /* off x, y */ 0, 0,
- /* src */ divmask,
- /* op */ ShapeSet
- );
+ copyimage(d->w, divimg->r, divimg, ZP);
+ setshapemask(d->w, divmask, ZP);
+}
+
+Area *
+new_column(View *v, Area *pos, uint w) {
+ Area *a;
+
+ a = create_area(v, pos, w);
+ if(!a)
+ return nil;
+
+ arrange_view(v);
+ if(v == screen->sel)
+ focus_view(screen, v);
+ return a;
 }
 
 static void
@@ -217,8 +187,8 @@ scale_column(Area *a) {
          * increment gaps can be equalized later */
         /* Frames that can't be accomodated are pushed to the floating layer */
 
- minh = labelh(&def.font);
- colh = labelh(&def.font);
+ minh = labelh(def.font);
+ colh = labelh(def.font);
         uncolh = minh + frame_delta_h();
 
         ncol = 0;
@@ -230,7 +200,7 @@ scale_column(Area *a) {
                 else
                         nuncol++;
 
- surplus = a->rect.height;
+ surplus = Dy(a->rect);
         surplus -= ncol * colh;
         surplus -= nuncol * uncolh;
         if(surplus < 0) {
@@ -252,17 +222,19 @@ scale_column(Area *a) {
         i = ncol - 1;
         j = nuncol - 1;
         for(f=a->frame; f; f=f->anext) {
+ f->rect = rectsubpt(f->rect, f->rect.min);
+ f->crect = rectsubpt(f->crect, f->crect.min);
                 if(f == a->sel)
                         j++;
                 if(!f->collapsed) {
                         if(j < 0 && f != a->sel)
                                 f->collapsed = True;
                         else {
- if(f->crect.height <= minh)
- f->crect.height = 1;
+ if(Dx(f->crect) <= minh)
+ f->crect.max.x = 1;
                                 else
- f->crect.height -= minh;
- dy += f->crect.height;
+ f->crect.max.x = minh;
+ dy += Dy(f->crect);
                         }
                         j--;
                 }
@@ -284,37 +256,36 @@ scale_column(Area *a) {
 
         i = nuncol;
         for(f=a->frame; f; f=f->anext) {
- f->rect.x = a->rect.x;
- f->rect.width = a->rect.width;
+ f->rect.max.x = Dx(a->rect);
                 if(!f->collapsed) {
                         i--;
- f->rect.height = (float)f->crect.height / dy * surplus;
- if(!i)
- f->rect.height = surplus;
- f->rect.height += minh + frame_delta_h();
+ if(i)
+ f->rect.max.y = (float)Dy(f->crect) / dy * surplus;
+ else
+ f->rect.max.y = surplus;
+ f->rect.max.y += minh + frame_delta_h();
+
                         apply_sizehints(f->client, &f->rect, False, True, NWEST);
-
- dy -= f->crect.height;
- surplus -= f->rect.height - frame_delta_h() - minh;
+ dy -= Dy(f->crect);
+ resize_frame(f, f->rect);
+
+ surplus -= Dy(f->rect) - frame_delta_h() - minh;
                 }else
- f->rect.height = labelh(&def.font);
- }
-
- yoff = a->rect.y;
+ f->rect.max.y = labelh(def.font);
+ }
+
+ yoff = a->rect.min.y;
         i = nuncol;
         for(f=a->frame; f; f=f->anext) {
- f->rect.y = yoff;
- f->rect.x = a->rect.x;
- f->rect.width = a->rect.width;
- if(f->collapsed)
- yoff += f->rect.height;
- else{
+ f->rect = rectaddpt(f->rect, Pt(a->rect.min.x, yoff));
+ f->rect.max.x = a->rect.max.x;
+ if(!f->collapsed) {
                         i--;
- f->rect.height += surplus / nuncol;
+ f->rect.max.y += surplus / nuncol;
                         if(!i)
- f->rect.height += surplus % nuncol;
- yoff += f->rect.height;
- }
+ f->rect.max.y += surplus % nuncol;
+ }
+ yoff = f->rect.max.y;
         }
 }
 
@@ -330,7 +301,7 @@ arrange_column(Area *a, Bool dirty) {
                 for(f=a->frame; f; f=f->anext) {
                         f->collapsed = False;
                         if(dirty)
- f->crect.height = 100;
+ f->crect = Rect(0, 0, 100, 100);
                 }
                 break;
         case Colstack:
@@ -370,60 +341,51 @@ resize_column(Area *a, int w) {
         an = a->next;
         assert(an != nil);
 
- dw = w - a->rect.width;
- a->rect.width += dw;
- an->rect.width -= dw;
+ dw = w - Dx(a->rect);
+ a->rect.max.x += dw;
+ an->rect.min.x += dw;
 
         arrange_view(a->view);
         focus_view(screen, a->view);
 }
 
 static void
-resize_colframeh(Frame *f, XRectangle *r) {
+resize_colframeh(Frame *f, Rectangle *r) {
         Area *a;
         Frame *fa, *fb;
         uint minh;
- int dy, dh, maxy;
+
+ minh = 2 * labelh(def.font);
 
         a = f->area;
- maxy = r_south(r);
-
- minh = 2 * labelh(&def.font);
-
         fa = f->anext;
         for(fb = a->frame; fb; fb = fb->anext)
                 if(fb->anext == f) break;
 
         if(fb)
- r->y = max(r->y, fb->rect.y + minh);
+ r->min.y = max(r->min.y, fb->rect.min.y + minh);
         else
- r->y = a->rect.y;
-
+ r->min.y = max(r->min.y, a->rect.min.y);
+
+ if(fa)
+ r->max.y = min(r->max.y, fa->rect.max.y - minh);
+ else
+ r->max.y = min(r->max.y, a->rect.max.y);
+
+ if(fb) {
+ fb->rect.max.y = r->min.y;
+ resize_frame(fb, fb->rect);
+ }
         if(fa) {
- if(maxy > r_south(&fa->rect) - minh)
- maxy = r_south(&fa->rect) - minh;
- }
- else
- if(r_south(r) >= r_south(&a->rect))
- maxy = r_south(&a->rect) - 1;
-
- dy = f->rect.y - r->y;
- dh = maxy - r_south(&f->rect);
- if(fb) {
- fb->rect.height -= dy;
- resize_frame(fb, &fb->rect);
- }
- if(fa) {
- fa->rect.height -= dh;
- resize_frame(fa, &fa->rect);
- }
-
- f->rect.height = maxy - r->y;
- resize_frame(f, &f->rect);
-}
-
-void
-resize_colframe(Frame *f, XRectangle *r) {
+ fa->rect.min.y = r->max.y;
+ resize_frame(fa, fa->rect);
+ }
+
+ resize_frame(f, *r);
+}
+
+void
+resize_colframe(Frame *f, Rectangle *r) {
         Area *a, *al, *ar;
         View *v;
         uint minw;
@@ -431,51 +393,42 @@ resize_colframe(Frame *f, XRectangle *r)
 
         a = f->area;
         v = a->view;
- maxx = r_east(r);
-
- minw = screen->rect.width/NCOL;
+ maxx = r->max.x;
+
+ minw = Dx(screen->rect) / NCOL;
 
         ar = a->next;
         for(al = v->area->next; al; al = al->next)
                 if(al->next == a) break;
 
         if(al)
- r->x = max(r->x, al->rect.x + minw);
+ r->min.x = max(r->min.x, al->rect.min.x + minw);
         else
- r->x = max(r->x, 0);
+ r->min.x = max(r->min.x, 0);
 
         if(ar) {
- if(maxx >= r_east(&ar->rect) - minw)
- maxx = r_east(&ar->rect) - minw;
+ if(maxx >= ar->rect.max.x - minw)
+ maxx = ar->rect.max.x - minw;
         }
         else
- if(maxx > screen->rect.width)
- maxx = screen->rect.width - 1;
-
- dx = a->rect.x - r->x;
- dw = maxx - r_east(&a->rect);
+ if(maxx > screen->rect.max.x)
+ maxx = screen->rect.max.x;
+
+ dx = a->rect.min.x - r->min.x;
+ dw = maxx - a->rect.max.x;
         if(al) {
- al->rect.width -= dx;
+ al->rect.max.x -= dx;
                 arrange_column(al, False);
         }
         if(ar) {
- ar->rect.width -= dw;
+ ar->rect.max.x -= dw;
                 arrange_column(ar, False);
         }
 
         resize_colframeh(f, r);
 
- a->rect.width = maxx - r->x;
+ a->rect.max.x = maxx;
         arrange_view(a->view);
 
         focus_view(screen, v);
 }
-
-Area *
-new_column(View *v, Area *pos, uint w) {
- Area *a = create_area(v, pos, w);
- if(!a)
- return nil;
- arrange_view(v);
- return a;
-}
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/dat.h
--- a/cmd/wmii/dat.h Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/dat.h Mon Apr 16 14:06:32 2007 -0400
@@ -2,27 +2,17 @@
  * See LICENSE file for license details.
  */
 
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
 #include <regex.h>
 #include <ixp.h>
-
-#define BLITZ_FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"
-#define BLITZ_FOCUSCOLORS "#ffffff #335577 #447799"
-#define BLITZ_NORMCOLORS "#222222 #eeeeee #666666"
-
-typedef struct Blitz Blitz;
-typedef struct BlitzColor BlitzColor;
-typedef struct BlitzFont BlitzFont;
-typedef struct BlitzBrush BlitzBrush;
-
-struct Blitz {
- Display *dpy;
- int screen;
- Window root;
-};
-
-enum BlitzAlign {
+#include "x11.h"
+
+#define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"
+#define FOCUSCOLORS "#ffffff #335577 #447799"
+#define NORMCOLORS "#222222 #eeeeee #666666"
+
+typedef struct CTuple CTuple;
+
+enum Align {
         NORTH = 0x01,
         EAST = 0x02,
         SOUTH = 0x04,
@@ -34,50 +24,26 @@ enum BlitzAlign {
         CENTER = NEAST | SWEST
 };
 
-typedef enum BlitzAlign BlitzAlign;
-
-struct BlitzColor {
- vlong bg;
- vlong fg;
- vlong border;
+typedef enum Align Align;
+
+struct CTuple {
+ ulong bg;
+ ulong fg;
+ ulong border;
         char colstr[24]; /* #RRGGBB #RRGGBB #RRGGBB */
 };
 
-struct BlitzFont {
- XFontStruct *xfont;
- XFontSet set;
- int ascent;
- int descent;
- uint height;
- char *fontstr;
-};
-
-struct BlitzBrush {
- Blitz *blitz;
- Drawable drawable;
- GC gc;
- int border;
- BlitzColor color;
- BlitzAlign align;
- BlitzFont *font;
- XRectangle rect; /* relative rect */
-};
-
-enum {
-/* WM atom */
+enum {
         WMState, WMProtocols, WMDelete,
-/* NET atom */
         NetSupported, NetWMName,
-/* Other */
         TagsAtom,
-/* Last atom */
         AtomLast
 };
 
-/* Column modes */
-enum { Coldefault, Colstack, Colmax };
-
-/* Cursor */
+enum {
+ Coldefault, Colstack, Colmax
+};
+
 enum {
         CurNormal,
         CurNECorner, CurNWCorner, CurSECorner, CurSWCorner,
@@ -86,8 +52,10 @@ enum {
         CurLast
 };
 
-enum { NCOL = 16 };
-enum { WM_PROTOCOL_DELWIN = 1 };
+enum {
+ NCOL = 16,
+ WM_PROTOCOL_DELWIN = 1
+};
 
 /* Data Structures */
 typedef struct View View;
@@ -119,7 +87,7 @@ struct Area {
         Bool floating;
         ushort id;
         int mode;
- XRectangle rect;
+ Rectangle rect;
 };
 
 struct Frame {
@@ -129,13 +97,13 @@ struct Frame {
         View *view;
         Area *area;
         ushort id;
- XRectangle rect;
- XRectangle crect;
- XRectangle revert;
+ Rectangle rect;
+ Rectangle crect;
+ Rectangle revert;
         Client *client;
         Bool collapsed;
- XRectangle grabbox;
- XRectangle titlebar;
+ Rectangle grabbox;
+ Rectangle titlebar;
 };
 
 struct Client {
@@ -156,17 +124,17 @@ struct Client {
         Bool frame_mapped;
         int unmapped;
         Window win;
- Window trans;
- Window framewin;
+ XWindow trans;
+ Window *framewin;
         Cursor cursor;
- XRectangle rect;
+ Rectangle rect;
         XSizeHints size;
         GC gc;
 };
 
 struct Divide {
         Divide *next;
- Window w;
+ Window *w;
         Bool mapped;
         int x;
 };
@@ -188,7 +156,8 @@ struct Bar {
         char text[256];
         char name[256];
         ushort id;
- BlitzBrush brush;
+ Rectangle r;
+ CTuple col;
 };
 
 struct Rule {
@@ -205,9 +174,9 @@ struct Ruleset {
 
 /* global variables */
 struct {
- BlitzColor focuscolor;
- BlitzColor normcolor;
- BlitzFont font;
+ CTuple focuscolor;
+ CTuple normcolor;
+ Font *font;
         uint border;
         uint snap;
         char *keys;
@@ -219,18 +188,20 @@ struct {
         int colmode;
 } def;
 
-enum { BarLeft, BarRight };
+enum {
+ BarLeft, BarRight
+};
 
 struct WMScreen {
         Bar *bar[2];
         View *sel;
         Client *focus;
         Client *hasgrab;
- Window barwin;
-
- XRectangle rect;
- XRectangle brect;
- BlitzBrush bbrush;
+ Window *barwin;
+ Image *ibuf;
+
+ Rectangle rect;
+ Rectangle brect;
 } *screens, *screen;
 
 Client *client;
@@ -252,10 +223,8 @@ uint num_lock_mask;
 uint num_lock_mask;
 Bool sel_screen;
 
-Blitz blz;
-GC xorgc;
-Pixmap pmap;
-Pixmap divmap, divmask;
+Image xor;
+Image *divimg, *divmask;
 
 Atom atom[AtomLast];
 Cursor cursor[CurLast];
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/draw.c
--- a/cmd/wmii/draw.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/draw.c Mon Apr 16 14:06:32 2007 -0400
@@ -12,7 +12,7 @@ uint
 uint
 textwidth_l(BlitzFont *font, char *text, uint len) {
         if(font->set) {
- XRectangle r;
+ Rectangle r;
                 XmbTextExtents(font->set, text, len, &r, nil);
                 return r.width;
         }
@@ -94,7 +94,7 @@ draw_label(BlitzBrush *b, char *text) {
         uint x, y, w, h, len;
         Bool shortened = False;
         static char buf[2048];
- XRectangle r = {0};
+ Rectangle r = {0};
         XGCValues gcv;
 
         draw_tile(b);
@@ -151,7 +151,7 @@ draw_label(BlitzBrush *b, char *text) {
 }
 
 void
-drawbg(Display *dpy, Drawable drawable, GC gc, XRectangle *rect,
+drawbg(Display *dpy, Drawable drawable, GC gc, Rectangle *rect,
                         BlitzColor c, Bool fill, int border)
 {
         if(fill) {
@@ -161,38 +161,9 @@ drawbg(Display *dpy, Drawable drawable,
         if(border) {
                 XSetLineAttributes(dpy, gc, border, LineSolid, CapButt, JoinMiter);
                 XSetForeground(dpy, gc, c.border);
- XDrawRectangle(dpy, drawable, gc,
- rect->x + border / 2,
- rect->y + border / 2,
- rect->width - border,
- rect->height - border);
- }
-}
-
-void
-drawcursor(Display *dpy, Drawable drawable, GC gc,
- int x, int y, uint h, BlitzColor c)
-{
- XSegment s[5];
-
- XSetForeground(dpy, gc, c.fg);
- XSetLineAttributes(dpy, gc, 1, LineSolid, CapButt, JoinMiter);
- s[0].x1 = x - 1;
- s[0].y1 = s[0].y2 = y;
- s[0].x2 = x + 2;
- s[1].x1 = x - 1;
- s[1].y1 = s[1].y2 = y + 1;
- s[1].x2 = x + 2;
- s[2].x1 = s[2].x2 = x;
- s[2].y1 = y;
- s[2].y2 = y + h;
- s[3].x1 = x - 1;
- s[3].y1 = s[3].y2 = y + h;
- s[3].x2 = x + 2;
- s[4].x1 = x - 1;
- s[4].y1 = s[4].y2 = y + h - 1;
- s[4].x2 = x + 2;
- XDrawSegments(dpy, drawable, gc, s, 5);
+ XDrawRectangle(dpy, drawable, gc, rect->x + border / 2, rect->y + border / 2,
+ rect->width - border, rect->height - border);
+ }
 }
 
 static ulong
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/event.c
--- a/cmd/wmii/event.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/event.c Mon Apr 16 14:06:32 2007 -0400
@@ -20,7 +20,7 @@ flushevents(long event_mask, Bool dispat
         XEvent ev;
         uint n = 0;
 
- while(XCheckMaskEvent(blz.dpy, event_mask, &ev)) {
+ while(XCheckMaskEvent(display, event_mask, &ev)) {
                 if(dispatch)
                         dispatch_event(&ev);
                 n++;
@@ -35,20 +35,20 @@ buttonrelease(XEvent *e) {
         Bar *b;
 
         ev = &e->xbutton;
- if(ev->window == screen->barwin) {
+ if(ev->window == screen->barwin->w) {
                 for(b=screen->bar[BarLeft]; b; b=b->next)
- if(ptinrect(ev->x, ev->y, &b->brush.rect)) {
+ if(ptinrect(Pt(ev->x, ev->y), b->r)) {
                                 write_event("LeftBarClick %d %s\n", ev->button, b->name);
                                 return;
                         }
                 for(b=screen->bar[BarRight]; b; b=b->next)
- if(ptinrect(ev->x, ev->y, &b->brush.rect)) {
+ if(ptinrect(Pt(ev->x, ev->y), b->r)) {
                                 write_event("RightBarClick %d %s\n", ev->button, b->name);
                                 return;
                         }
         }
         else if((f = win2frame(ev->window)))
- write_event("ClientClick 0x%x %d\n", f->client->win, ev->button);
+ write_event("ClientClick 0x%x %d\n", f->client->win.w, ev->button);
 }
 
 static void
@@ -69,50 +69,50 @@ buttonpress(XEvent *e) {
                                 break;
                         case Button3:
                                 do_mouse_resize(f->client, False,
- quadrant(&f->rect, ev->x_root, ev->y_root));
+ quadrant(f->rect, Pt(ev->x_root, ev->y_root)));
                                 frame_to_top(f);
                                 focus(f->client, True);
                                 break;
                         default: break;
- XAllowEvents(blz.dpy, ReplayPointer, ev->time);
+ XAllowEvents(display, ReplayPointer, ev->time);
                         }
                 }else{
                         if(ev->button == Button1) {
                                 if(frame_to_top(f))
                                         restack_view(f->view);
 
- else if(ptinrect(ev->x, ev->y, &f->grabbox))
+ else if(ptinrect(Pt(ev->x, ev->y), f->grabbox))
                                         do_mouse_resize(f->client, True, CENTER);
                                 else if(f->area->floating)
- if(!ev->subwindow && !ptinrect(ev->x, ev->y, &f->titlebar))
+ if(!ev->subwindow && !ptinrect(Pt(ev->x, ev->y), f->titlebar))
                                                 do_mouse_resize(f->client, False,
- quadrant(&f->rect, ev->x_root, ev->y_root));
+ quadrant(f->rect, Pt(ev->x_root, ev->y_root)));
 
                                 if(f->client != selclient())
                                         focus(f->client, True);
                         }
                         if(ev->subwindow)
- XAllowEvents(blz.dpy, ReplayPointer, ev->time);
+ XAllowEvents(display, ReplayPointer, ev->time);
                         else {
                                 /* Ungrab so a menu can receive events before the button is released */
- XUngrabPointer(blz.dpy, ev->time);
- XSync(blz.dpy, False);
-
- write_event("ClientMouseDown 0x%x %d\n", f->client->win, ev->button);
+ XUngrabPointer(display, ev->time);
+ XSync(display, False);
+
+ write_event("ClientMouseDown 0x%x %d\n", f->client->win.w, ev->button);
                         }
                 }
         }
         else if((d = win2div(ev->window)))
                 mouse_resizecol(d);
         else
- XAllowEvents(blz.dpy, ReplayPointer, ev->time);
+ XAllowEvents(display, ReplayPointer, ev->time);
 }
 
 static void
 configurerequest(XEvent *e) {
         XConfigureRequestEvent *ev;
         XWindowChanges wc;
- XRectangle *frect;
+ Rectangle *frect;
         Client *c;
         Frame *f;
 
@@ -122,19 +122,19 @@ configurerequest(XEvent *e) {
                 f = c->sel;
                 gravitate_client(c, True);
                 if(ev->value_mask & CWX)
- c->rect.x = ev->x;
+ c->rect.min.x = ev->x;
                 if(ev->value_mask & CWY)
- c->rect.y = ev->y;
+ c->rect.min.y = ev->y;
                 if(ev->value_mask & CWWidth)
- c->rect.width = ev->width;
+ c->rect.max.x = c->rect.min.x + ev->width;
                 if(ev->value_mask & CWHeight)
- c->rect.height = ev->height;
+ c->rect.max.y = c->rect.min.y + ev->height;
                 if(ev->value_mask & CWBorderWidth)
                         c->border = ev->border_width;
                 gravitate_client(c, False);
 
- if((c->rect.height == screen->rect.height)
- && (c->rect.width == screen->rect.width)) {
+ if((Dx(c->rect) == Dx(screen->rect))
+ && (Dy(c->rect) == Dy(screen->rect))) {
                         c->fullscreen = True;
                         if(c->sel) {
                                 if(!c->sel->area->floating)
@@ -149,11 +149,8 @@ configurerequest(XEvent *e) {
                 else
                         frect=&c->sel->revert;
 
- *frect = c->rect;
- frect->y -= labelh(&def.font);
- frect->x -= def.border;
- frect->width += 2 * def.border;
- frect->height += frame_delta_h();
+ *frect = insetrect(c->rect, -def.border);
+ frect->min.y -= labelh(def.font);
 
                 if(c->sel->area->floating || c->fullscreen)
                         resize_client(c, frect);
@@ -168,8 +165,8 @@ configurerequest(XEvent *e) {
                 wc.sibling = ev->above;
                 wc.stack_mode = ev->detail;
                 ev->value_mask &= ~(CWStackMode|CWSibling);
- XConfigureWindow(blz.dpy, ev->window, ev->value_mask, &wc);
- XSync(blz.dpy, False);
+ XConfigureWindow(display, ev->window, ev->value_mask, &wc);
+ XSync(display, False);
         }
 }
 
@@ -208,9 +205,9 @@ enternotify(XEvent *e) {
                         if(f->area->floating || !f->collapsed)
                                 focus(f->client, False);
                 }
- set_frame_cursor(f, ev->x, ev->y);
- }
- else if(ev->window == blz.root) {
+ set_frame_cursor(f, Pt(ev->x, ev->y));
+ }
+ else if(ev->window == scr.root.w) {
                 sel_screen = True;
                 draw_frames();
         }
@@ -221,7 +218,7 @@ leavenotify(XEvent *e) {
         XCrossingEvent *ev;
 
         ev = &e->xcrossing;
- if((ev->window == blz.root) && !ev->same_screen) {
+ if((ev->window == scr.root.w) && !ev->same_screen) {
                 sel_screen = True;
                 draw_frames();
         }
@@ -247,7 +244,7 @@ focusin(XEvent *e) {
         ev = &e->xfocus;
         /* Yes, we're focusing in on nothing, here. */
         if(ev->detail == NotifyDetailNone) {
- XSetInputFocus(blz.dpy, screen->barwin, RevertToParent, CurrentTime);
+ XSetInputFocus(display, screen->barwin->w, RevertToParent, CurrentTime);
                 return;
         }
 
@@ -275,12 +272,12 @@ focusin(XEvent *e) {
                         if(old && old->sel)
                                 draw_frame(old->sel);
                 }
- }else if(ev->window == screen->barwin) {
+ }else if(ev->window == screen->barwin->w) {
                 print_focus(nil, "<nil>");
                 screen->focus = nil;
         }else if(ev->mode == NotifyGrab) {
- if(ev->window == blz.root)
- if(XCheckMaskEvent(blz.dpy, KeyPressMask, &me)) {
+ if(ev->window == scr.root.w)
+ if(XCheckMaskEvent(display, KeyPressMask, &me)) {
                                 /* wmii has grabbed focus */
                                 screen->hasgrab = &c_root;
                                 dispatch_event(&me);
@@ -337,7 +334,7 @@ expose(XEvent *e) {
 
         ev = &e->xexpose;
         if(ev->count == 0) {
- if(ev->window == screen->barwin)
+ if(ev->window == screen->barwin->w)
                         draw_bar(screen);
                 else if((f = win2frame(ev->window)))
                         draw_frame(f);
@@ -352,8 +349,8 @@ keypress(XEvent *e) {
 
         ev = &e->xkey;
         ev->state &= valid_mask;
- if(ev->window == blz.root)
- kpress(blz.root, ev->state, (KeyCode) ev->keycode);
+ if(ev->window == scr.root.w)
+ kpress(scr.root.w, ev->state, (KeyCode) ev->keycode);
 }
 
 static void
@@ -372,10 +369,10 @@ maprequest(XEvent *e) {
         static XWindowAttributes wa;
 
         ev = &e->xmaprequest;
- if(!XGetWindowAttributes(blz.dpy, ev->window, &wa))
+ if(!XGetWindowAttributes(display, ev->window, &wa))
                 return;
         if(wa.override_redirect) {
- XSelectInput(blz.dpy, ev->window,
+ XSelectInput(display, ev->window,
                                 (StructureNotifyMask | PropertyChangeMask));
                 return;
         }
@@ -390,7 +387,7 @@ motionnotify(XEvent *e) {
 
         ev = &e->xmotion;
         if((f = win2frame(ev->window)))
- set_frame_cursor(f, ev->x, ev->y);
+ set_frame_cursor(f, Pt(ev->x, ev->y));
 }
 
 static void
@@ -450,12 +447,12 @@ void
 void
 check_x_event(IxpConn *c) {
         XEvent ev;
- while(XPending(blz.dpy)) {
- XNextEvent(blz.dpy, &ev);
+ while(XPending(display)) {
+ XNextEvent(display, &ev);
                 if(verbose)
                         printevent(&ev);
                 dispatch_event(&ev);
                 /* Hack to alleviate an apparant Xlib bug */
- XPending(blz.dpy);
- }
-}
+ XPending(display);
+ }
+}
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/fns.h
--- a/cmd/wmii/fns.h Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/fns.h Mon Apr 16 14:06:32 2007 -0400
@@ -20,12 +20,11 @@ Bar *create_bar(Bar **b_link, char *name
 Bar *create_bar(Bar **b_link, char *name);
 void destroy_bar(Bar **b_link, Bar*);
 void draw_bar(WMScreen *s);
-void draw_border(BlitzBrush*);
 void resize_bar();
 Bar *bar_of_name(Bar *b_link, const char *name);
 
 /* client.c */
-Client *create_client(Window, XWindowAttributes*);
+Client *create_client(XWindow, XWindowAttributes*);
 void destroy_client(Client*);
 void configure_client(Client*);
 void prop_client(Client *c, Atom);
@@ -33,53 +32,37 @@ void gravitate_client(Client*, Bool inve
 void gravitate_client(Client*, Bool invert);
 void map_client(Client*);
 void unmap_client(Client*, int state);
-void map_frame(Client*);
-void unmap_frame(Client*);
+int map_frame(Client*);
+int unmap_frame(Client*);
 void set_cursor(Client*, Cursor cur);
 void focus_frame(Frame*, Bool restack);
-void reparent_client(Client*, Window w, int x, int y);
+void reparent_client(Client*, Window*, Point);
 void manage_client(Client*);
 void focus(Client*, Bool restack);
 void focus_client(Client*);
-void resize_client(Client*, XRectangle*);
-void apply_sizehints(Client*, XRectangle*, Bool floating, Bool frame, BlitzAlign sticky);
+void resize_client(Client*, Rectangle*);
+void apply_sizehints(Client*, Rectangle*, Bool floating, Bool frame, Align sticky);
 char *send_client(Frame*, char*, Bool swap);
 char * message_client(Client*, char*);
 void move_client(Client*, char *arg);
 void size_client(Client*, char *arg);
 Client *selclient();
-Frame *win2frame(Window);
-Client *win2client(Window);
+Frame *win2frame(XWindow);
+Client *win2client(XWindow);
 void update_client_grab(Client*);
 void apply_rules(Client*);
 void apply_tags(Client*, const char*);
 
 /* column.c */
-Divide *win2div(Window);
+Divide *win2div(XWindow);
 void update_dividers();
 void update_divs();
 void draw_div(Divide*);
 void arrange_column(Area*, Bool dirty);
 void resize_column(Area*, int w);
-void resize_colframe(Frame*, XRectangle*);
+void resize_colframe(Frame*, Rectangle*);
 int str2colmode(const char *str);
 Area *new_column(View*, Area *pos, uint w);
-
-/* draw.c */
-int loadcolor(Blitz *, BlitzColor *);
-void draw_label(BlitzBrush *, char *text);
-void draw_tile(BlitzBrush *);
-void draw_rect(BlitzBrush *);
-
-void drawbg(Display*, Drawable, GC,
- XRectangle*, BlitzColor, Bool fill, Bool border);
-void drawcursor(Display*, Drawable, GC,
- int x, int y, uint h, BlitzColor);
-uint textwidth(BlitzFont*, char *text);
-uint textwidth_l(BlitzFont*, char *text, uint len);
-void loadfont(Blitz*, BlitzFont*);
-uint labelh(BlitzFont *font);
-char *parse_colors(char **buf, int *buflen, BlitzColor*);
 
 /* event.c */
 void dispatch_event(XEvent*);
@@ -90,18 +73,18 @@ Frame *create_frame(Client*, View*);
 Frame *create_frame(Client*, View*);
 void remove_frame(Frame*);
 void insert_frame(Frame *pos, Frame*, Bool before);
-void resize_frame(Frame*, XRectangle*);
+void resize_frame(Frame*, Rectangle);
 Bool frame_to_top(Frame *f);
-void set_frame_cursor(Frame*, int x, int y);
+void set_frame_cursor(Frame*, Point);
 void swap_frames(Frame*, Frame*);
 int frame_delta_h();
-void frame2client(Frame*, XRectangle*);
-void client2frame(Frame*, XRectangle*);
+Rectangle frame2client(Frame*, Rectangle);
+Rectangle client2frame(Frame*, Rectangle);
 int ingrabbox(Frame*, int x, int y);
 void draw_frame(Frame*);
 void draw_frames();
 void update_frame_widget_colors(Frame*);
-void check_frame_constraints(XRectangle*);
+Rectangle constrain(Rectangle);
 
 /* fs.c */
 void fs_attach(Ixp9Req*);
@@ -118,28 +101,25 @@ void write_event(char*, ...);
 void write_event(char*, ...);
 
 /* geom.c */
-Bool ptinrect(int x, int y, XRectangle*);
-BlitzAlign quadrant(XRectangle*, int x, int y);
-Cursor cursor_of_quad(BlitzAlign);
-int strtorect(XRectangle*, const char*);
-BlitzAlign get_sticky(XRectangle *src, XRectangle *dst);
-int r_east(XRectangle*);
-int r_south(XRectangle*);
+Bool ptinrect(Point, Rectangle);
+Align quadrant(Rectangle, Point);
+Cursor cursor_of_quad(Align);
+Align get_sticky(Rectangle src, Rectangle dst);
 
 /* key.c */
-void kpress(Window, ulong mod, KeyCode);
+void kpress(XWindow, ulong mod, KeyCode);
 void update_keys();
 void init_lock_keys();
 ulong mod_key_of_str(char*);
 
 /* mouse.c */
 void mouse_resizecol(Divide*);
-void do_mouse_resize(Client*, Bool opaque, BlitzAlign);
-void grab_mouse(Window, ulong mod, ulong button);
-void ungrab_mouse(Window, ulong mod, uint button);
-BlitzAlign snap_rect(XRectangle *rects, int num, XRectangle *current,
- BlitzAlign *mask, int snapw);
-void grab_button(Window, uint button, ulong mod);
+void do_mouse_resize(Client*, Bool opaque, Align);
+void grab_mouse(XWindow, ulong mod, ulong button);
+void ungrab_mouse(XWindow, ulong mod, uint button);
+Align snap_rect(Rectangle *rects, int num, Rectangle *current,
+ Align *mask, int snapw);
+void grab_button(XWindow, uint button, ulong mod);
 
 /* rule.c */
 void update_rules(Rule**, const char*);
@@ -147,12 +127,12 @@ void trim(char *str, const char *chars);
 
 /* view.c */
 void arrange_view(View*);
-void scale_view(View*, float w);
+void scale_view(View*, int w);
 View *get_view(const char*);
 View *create_view(const char*);
 void focus_view(WMScreen*, View*);
 void update_client_views(Client*, char**);
-XRectangle *rects_of_view(View*, uint *num, Frame *ignore);
+Rectangle *rects_of_view(View*, uint *num, Frame *ignore);
 View *view_of_id(ushort);
 void select_view(const char*);
 void attach_to_view(View*, Frame*);
@@ -167,3 +147,39 @@ uint newcolw_of_view(View*, int i);
 /* wm.c */
 int wmii_error_handler(Display*, XErrorEvent *error);
 int win_proto(Window);
+
+/* x11.c */
+XRectangle XRect(Rectangle r);
+int eqrect(Rectangle a, Rectangle b);
+Point addpt(Point p, Point q);
+Point subpt(Point p, Point q);
+Rectangle insetrect(Rectangle r, int n);
+Rectangle rectaddpt(Rectangle r, Point p);
+Rectangle rectsubpt(Rectangle r, Point p);
+void initdisplay();
+Image * allocimage(int w, int h, int depth);
+void freeimage(Image *img);
+Window *createwindow(Window *parent, Rectangle r, int depth, uint class, WinAttr *wa, int valuemask);
+void destroywindow(Window *w);
+void setwinattr(Window *w, WinAttr *wa, int valmask);
+void reshapewin(Window *w, Rectangle r);
+void movewin(Window *w, Point pt);
+int mapwin(Window *w);
+int unmapwin(Window *w);
+uint winprotocols(Window *w);
+void setshapemask(Window *dst, Image *src, Point pt);
+void border(Image *dst, Rectangle r, int w, ulong col);
+void fill(Image *dst, Rectangle r, ulong col);
+void drawpoly(Image *dst, Point *pt, int np, int cap, int w, ulong col);
+void fillpoly(Image *dst, Point *pt, int np, ulong col);
+void drawline(Image *dst, Point p1, Point p2, int cap, int w, ulong col);
+void drawstring(Image *dst, Font *font, Rectangle r, Align align, char *text, ulong col);
+void copyimage(Image *dst, Rectangle r, Image *src, Point p);
+Bool namedcolor(char *name, ulong *ret);
+Bool loadcolor(CTuple *c, char *str);
+Font * loadfont(char *name);
+void freefont(Font *f);
+uint textwidth_l(Font *font, char *text, uint len);
+uint textwidth(Font *font, char *text);
+uint labelh(Font *font);
+Atom xatom(char *name);
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/frame.c
--- a/cmd/wmii/frame.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/frame.c Mon Apr 16 14:06:32 2007 -0400
@@ -10,20 +10,23 @@ Frame *
 Frame *
 create_frame(Client *c, View *v) {
         static ushort id = 1;
- Frame *f = emallocz(sizeof(Frame));
-
+ Frame *f;
+
+ f = emallocz(sizeof *f);
         f->id = id++;
         f->client = c;
         f->view = v;
+
         if(c->sel) {
                 f->revert = c->sel->revert;
                 f->rect = c->sel->rect;
         }
         else{
                 c->sel = f;
- f->revert = f->rect = c->rect;
- f->revert.width = f->rect.width += 2 * def.border;
- f->revert.height = f->rect.height += frame_delta_h();
+ f->rect = c->rect;
+ f->rect.max.x += 2 * def.border;
+ f->rect.max.y += frame_delta_h();
+ f->revert = f->rect;
         }
         f->collapsed = False;
 
@@ -73,90 +76,90 @@ insert_frame(Frame *pos, Frame *f, Bool
         }
 }
 
-void
-frame2client(Frame *f, XRectangle *r) {
+Rectangle
+frame2client(Frame *f, Rectangle r) {
         if(f->area->floating) {
- r->width = max(r->width - def.border * 2, 1);
- r->height = max(r->height - frame_delta_h(), 1);
+ r.max.x -= def.border * 2;
+ r.max.y -= frame_delta_h();
         }else {
- r->width = max(r->width - 2, 1);
- r->height = max(r->height - labelh(&def.font) - 1, 1);
- }
-}
-
-void
-client2frame(Frame *f, XRectangle *r) {
+ r.max.x -= 2;
+ r.max.y -= labelh(def.font) - 1;
+ }
+ r.max.x = max(r.min.x+1, r.max.x);
+ r.max.y = max(r.min.y+1, r.max.y);
+ return r;
+}
+
+Rectangle
+client2frame(Frame *f, Rectangle r) {
         if(f->area->floating) {
- r->width += def.border * 2;
- r->height += frame_delta_h();
+ r.max.x += def.border * 2;
+ r.max.y += frame_delta_h();
         }else {
- r->width += 2;
- r->height +=labelh(&def.font) + 1;
- }
-}
-
-void
-resize_frame(Frame *f, XRectangle *r) {
- BlitzAlign stickycorner;
+ r.max.y += 2;
+ r.max.x +=labelh(def.font) + 1;
+ }
+ return r;
+}
+
+void
+resize_frame(Frame *f, Rectangle r) {
+ Align stickycorner;
+ Point pt;
         Client *c;
 
         c = f->client;
- stickycorner = get_sticky(&f->rect, r);
-
- f->rect = *r;
- f->crect = *r;
+ stickycorner = get_sticky(f->rect, r);
+
+ f->crect = r;
         apply_sizehints(c, &f->crect, f->area->floating, True, stickycorner);
+
+ if(Dx(r) <= 0 || Dy(r) <= 0)
+ asm("int $3");
 
         if(f->area->floating)
                 f->rect = f->crect;
-
- frame2client(f, &f->crect);
-
- if(f->crect.height < labelh(&def.font))
+ else
+ f->rect = r;
+
+ f->crect = frame2client(f, f->crect);
+ f->crect = rectsubpt(f->crect, f->crect.min);
+
+ if(Dx(f->crect) < labelh(def.font)) {
+ f->rect.max.x = f->rect.min.x + frame_delta_h();
                 f->collapsed = True;
- else
- f->collapsed = False;
-
- if(f->crect.width < labelh(&def.font)) {
- f->rect.width = frame_delta_h();
- f->collapsed = True;
         }
 
         if(f->collapsed) {
- f->rect.height = labelh(&def.font);
+ f->rect.max.y= f->rect.min.y + labelh(def.font);
                 f->crect = f->rect;
         }
- f->crect.y = labelh(&def.font);
- f->crect.x = (f->rect.width - f->crect.width) / 2;
-
+
+ pt.y = labelh(def.font);
 
         if(f->area->floating) {
                 if(c->fullscreen) {
- f->crect.width = screen->rect.width;
- f->crect.height = screen->rect.height;
-
- f->rect = f->crect;
- f->rect.x = -def.border;
- f->rect.y = -labelh(&def.font);
- client2frame(f, &f->rect);
+ f->crect = screen->rect;
+ f->rect = client2frame(f, f->crect);
+ pt.x = (Dx(f->rect) - Dx(f->crect)) / 2;
+ f->rect = rectsubpt(f->rect, pt);
                 }else
- check_frame_constraints(&f->rect);
- }
-}
-
-void
-set_frame_cursor(Frame *f, int x, int y) {
- XRectangle r;
+ f->rect = constrain(f->rect);
+ }
+ pt.x = (Dx(f->rect) - Dx(f->crect)) / 2;
+ f->crect = rectaddpt(f->crect, pt);
+}
+
+void
+set_frame_cursor(Frame *f, Point pt) {
+ Rectangle r;
         Cursor cur;
 
         if(f->area->floating
- && !ptinrect(x, y, &f->titlebar)
- && !ptinrect(x, y, &f->crect)
- && !ingrabbox(f, x, y)) {
- r = f->rect;
- r.x = 0;
- r.y = 0;
- cur = cursor_of_quad(quadrant(&r, x, y));
+ && !ptinrect(pt, f->titlebar)
+ && !ptinrect(pt, f->crect)) {
+ r = rectsubpt(f->rect, f->rect.min);
+ cur = cursor_of_quad(quadrant(r, pt));
                 set_cursor(f->client, cur);
         } else
                 set_cursor(f->client, cursor[CurNormal]);
@@ -170,18 +173,21 @@ frame_to_top(Frame *f) {
         a = f->area;
         if(!a->floating || f == a->stack)
                 return False;
+
         for(tf=&a->stack; *tf; tf=&(*tf)->snext)
                 if(*tf == f) break;
         *tf = f->snext;
+
         f->snext = a->stack;
         a->stack = f;
+
         update_client_grab(f->client);
         return True;
 }
 
 void
 swap_frames(Frame *fa, Frame *fb) {
- XRectangle trect;
+ Rectangle trect;
         Area *a;
         Frame **fp_a, **fp_b, *ft;
 
@@ -259,124 +265,60 @@ focus_frame(Frame *f, Bool restack) {
 
 int
 frame_delta_h() {
- return def.border + labelh(&def.font);
-}
-
-int
-ingrabbox(Frame *f, int x, int y) {
- int dx, h;
-
- if(f->area->floating)
- return 0;
-
- h = labelh(&def.font) / 3;
- h = max(h, 4);
-
- if((f == f->area->frame) && f->area->next)
- if(x >= f->rect.width - h) {
- dx = x - (f->rect.width - h);
- if(y <= dx)
- return 1;
- }
- if((f == f->area->frame) && (f->area != f->view->area->next))
- if(x <= h && y <= h - x)
- return 1;
-
- return 0;
+ return def.border + labelh(def.font);
 }
 
 void
 draw_frame(Frame *f) {
- BlitzBrush br = { 0 };
+ Rectangle r, fr;
+ CTuple *col;
         Frame *tf;
 
         if(f->view != screen->sel)
                 return;
 
- br.blitz = &blz;
- br.font = &def.font;
- br.drawable = pmap;
- br.gc = f->client->gc;
         if(f->client == screen->focus)
- br.color = def.focuscolor;
+ col = &def.focuscolor;
         else
- br.color = def.normcolor;
+ col = &def.normcolor;
         if(!f->area->floating && f->area->mode == Colmax)
                 for(tf = f->area->frame; tf; tf=tf->anext)
                         if(tf->client == screen->focus) {
- br.color = def.focuscolor;
+ col = &def.focuscolor;
                                 break;
                         }
 
- br.rect = f->rect;
- br.rect.x = 0;
- br.rect.y = 0;
- draw_tile(&br);
-
- br.rect.x += def.font.height - 3;
- br.rect.width -= br.rect.x;
- br.rect.height = labelh(&def.font);
- draw_label(&br, f->client->name);
-
- br.border = 1;
- br.rect.width += br.rect.x;
- br.rect.x = 0;
- f->titlebar.x = br.rect.x + 3;
- f->titlebar.height = br.rect.height - 3;
- f->titlebar.y = br.rect.y + 3;
- f->titlebar.width = br.rect.width - 6;
- draw_border(&br);
- br.rect.height = f->rect.height;
- if(def.border)
- draw_border(&br);
+ /* background */
+ fr = rectsubpt(f->rect, f->rect.min);
+ r = fr;
+ fill(screen->ibuf, r, col->bg);
+ border(screen->ibuf, r, 1, col->border);
+
+ r.max.y = r.min.y + labelh(def.font);
+ border(screen->ibuf, r, 1, col->border);
+
+ f->titlebar = insetrect(r, 3);
+ f->titlebar.max.y += 3;
+
+ /* grabbox */
+ r.min = Pt(2, 2);
+ r.max.x = r.min.x + def.font->height - 3;
+ r.max.y -= 2;
+ f->grabbox = r;
 
         if(f->client->urgent)
- br.color.bg = br.color.fg;
- br.rect.x = 2;
- br.rect.y = 2;
- br.rect.height = labelh(&def.font) - 4;
- br.rect.width = def.font.height - 3;
- f->grabbox = br.rect;
- draw_tile(&br);
-
-#if 0
- if(!f->area->floating) {
- XSetLineAttributes(blz.dpy, br.gc, 1, LineSolid, CapButt, JoinMiter);
- h = labelh(&def.font) / 3;
- h = max(h, 4);
- if((f == f->area->frame) && f->area->next) {
- pt[0] = (XPoint){ f->rect.width - h, 0 };
- pt[1] = (XPoint){ f->rect.width, h };
- pt[2] = (XPoint){ f->rect.width, 0 };
- XSetForeground(blz.dpy, br.gc, def.normcolor.bg);
- XFillPolygon(blz.dpy, br.drawable, br.gc, pt, 3, Convex, CoordModeOrigin);
- XSetForeground(blz.dpy, br.gc, br.color.border);
- XDrawLines(blz.dpy, br.drawable, br.gc, pt, 2, CoordModeOrigin);
- }
- if((f == f->area->frame) && (f->area != f->view->area->next)) {
- pt[0] = (XPoint){ h, 0 };
- pt[1] = (XPoint){ 0, h };
- pt[2] = (XPoint){ 0, 0 };
- XSetForeground(blz.dpy, br.gc, def.normcolor.bg);
- XFillPolygon(blz.dpy, br.drawable, br.gc, pt, 3, Convex, CoordModeOrigin);
- XSetForeground(blz.dpy, br.gc, br.color.border);
- XDrawLines(blz.dpy, br.drawable, br.gc, pt, 2, CoordModeOrigin);
- }
- }
-#endif
-
- XCopyArea(
- /* display */ blz.dpy,
- /* src */ pmap,
- /* dest */ f->client->framewin,
- /* gc */ f->client->gc,
- /* x, y */ 0, 0,
- /* width */ f->rect.width,
- /* height */ f->rect.height,
- /* dest_x */ 0,
- /* dest_y */ 0
- );
- XSync(blz.dpy, False);
+ fill(screen->ibuf, r, col->fg);
+ border(screen->ibuf, r, 1, col->border);
+
+ r.min.x = r.max.x;
+ r.max.x = fr.max.x;
+ r.min.y = 0;
+ r.max.y = labelh(def.font);
+ drawstring(screen->ibuf, def.font, r, WEST,
+ f->client->name, col->fg);
+
+ copyimage(f->client->framewin, fr, screen->ibuf, ZP);
+ XSync(display, False);
 }
 
 void
@@ -388,24 +330,26 @@ draw_frames() {
                         draw_frame(c->sel);
 }
 
-void
-check_frame_constraints(XRectangle *rect) {
- int max_height;
+Rectangle
+constrain(Rectangle r) {
+ Rectangle sr;
         int barheight;
 
- barheight = screen->brect.height;
- max_height = screen->rect.height - barheight;
-
- if(rect->height > max_height)
- rect->height = max_height;
- if(rect->width > screen->rect.width)
- rect->width = screen->rect.width;
- if(rect->x + barheight > screen->rect.width)
- rect->x = screen->rect.width - barheight;
- if(rect->y + barheight > max_height)
- rect->y = max_height - barheight;
- if(r_east(rect) < barheight)
- rect->x = barheight - rect->width;
- if(r_south(rect) < barheight)
- rect->y = barheight - rect->height;
-}
+ sr = screen->rect;
+ barheight = Dy(screen->brect);
+ sr.max.y -= barheight;
+
+ if(Dx(r) > Dx(sr))
+ r.max.x = r.min.x + Dx(sr);
+ if(Dy(r) > Dy(sr))
+ r.max.y = r.min.y + Dy(sr);
+ if(r.min.x > sr.max.x - barheight)
+ rectsubpt(r, Pt(sr.min.x - sr.max.x + barheight, 0));
+ if(r.min.y > sr.max.y - barheight)
+ rectsubpt(r, Pt(0, sr.min.y - sr.max.y + barheight));
+ if(r.max.x < barheight)
+ rectaddpt(r, Pt(barheight - sr.max.x, 0));
+ if(r.max.y < barheight)
+ rectaddpt(r, Pt(0, barheight - sr.max.y));
+ return r;
+}
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/fs.c
--- a/cmd/wmii/fs.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/fs.c Mon Apr 16 14:06:32 2007 -0400
@@ -2,6 +2,8 @@
  * See LICENSE file for license details.
  */
 #include <assert.h>
+#include <ctype.h>
+#include <regex.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -38,7 +40,7 @@ struct FileId {
                 View *view;
                 Client *client;
                 Ruleset *rule;
- BlitzColor *col;
+ CTuple *col;
         } content;
         uint id;
         uint index;
@@ -51,7 +53,7 @@ enum { /* Dirs */
         FsRoot, FsDClient, FsDClients, FsDBars,
         FsDTag, FsDTags,
         /* Files */
- FsFBar, FsFCctl, FsFColRules, FsFClabel,
+ FsFBar, FsFCctl, FsFColRules,
         FsFCtags, FsFEvent, FsFKeys, FsFRctl,
         FsFTagRules, FsFTctl, FsFTindex,
         FsFprops
@@ -109,7 +111,6 @@ dirtab_clients[]={{".", QTDIR, FsDClie
                   {nil}},
 dirtab_client[]= {{".", QTDIR, FsDClient, 0500|P9_DMDIR },
                   {"ctl", QTAPPEND, FsFCctl, 0600|P9_DMAPPEND },
- {"label", QTFILE, FsFClabel, 0600 },
                   {"tags", QTFILE, FsFCtags, 0600 },
                   {"props", QTFILE, FsFprops, 0400 },
                   {nil}},
@@ -219,6 +220,33 @@ data_to_cstring(Ixp9Req *r) {
         r->ifcall.data[i - 1] = '\0';
 }
 
+/* Should be somewhere else */
+char *
+parse_colors(char **buf, int *buflen, CTuple *col) {
+ static regex_t reg;
+ static Bool compiled;
+
+ if(!compiled) {
+ compiled = 1;
+ regcomp(&reg, "^#[0-9a-f]{6} #[0-9a-f]{6} #[0-9a-f]{6}([[:space:]]|$)",
+ REG_EXTENDED|REG_NOSUB|REG_ICASE);
+ }
+
+ if(*buflen < 23 || regexec(&reg, *buf, 0, 0, 0))
+ return "bad value";
+
+ (*buf)[23] = '\0';
+ loadcolor(col, *buf);
+
+ *buf += 23;
+ *buflen -= 23;
+ if(*buflen > 0) {
+ (*buf)++;
+ (*buflen)--;
+ }
+ return nil;
+}
+
 char *
 message_root(char *message)
 {
@@ -254,9 +282,9 @@ message_root(char *message)
         }
         else if(!strncmp(message, "font ", 5)) {
                 message += 5;
- free(def.font.fontstr);
- def.font.fontstr = estrdup(message);
- loadfont(&blz, &def.font);
+ freefont(def.font);
+ def.font = loadfont(message);
+ assert(def.font);
                 resize_bar(screen);
         }
         else if(!strncmp(message, "border ", 7)) {
@@ -288,7 +316,7 @@ read_root_ctl() {
                 i += snprintf(&buffer[i], (sizeof(buffer) - i), "view %s\n", screen->sel->name);
         i += snprintf(&buffer[i], (sizeof(buffer) - i), "focuscolors %s\n", def.focuscolor.colstr);
         i += snprintf(&buffer[i], (sizeof(buffer) - i), "normcolors %s\n", def.normcolor.colstr);
- i += snprintf(&buffer[i], (sizeof(buffer) - i), "font %s\n", def.font.fontstr);
+ i += snprintf(&buffer[i], (sizeof(buffer) - i), "font %s\n", def.font->name);
         i += snprintf(&buffer[i], (sizeof(buffer) - i), "grabmod %s\n", def.grabmod);
         i += snprintf(&buffer[i], (sizeof(buffer) - i), "border %d\n", def.border);
         return buffer;
@@ -382,8 +410,8 @@ lookup_file(FileId *parent, char *name)
                                                 *last = file;
                                                 last = &file->next;
                                                 file->content.client = c;
- file->id = c->win;
- file->index = c->win;
+ file->id = c->win.w;
+ file->index = c->win.w;
                                                 file->tab = *dir;
                                                 file->tab.name = estrdup("sel");
                                         }if(name) goto LastItem;
@@ -393,16 +421,16 @@ lookup_file(FileId *parent, char *name)
                                         if(*name) goto NextItem;
                                 }
                                 for(c=client; c; c=c->next) {
- if(!name || c->win == id) {
+ if(!name || c->win.w == id) {
                                                 file = get_file();
                                                 *last = file;
                                                 last = &file->next;
                                                 file->content.client = c;
- file->id = c->win;
- file->index = c->win;
+ file->id = c->win.w;
+ file->index = c->win.w;
                                                 file->tab = *dir;
                                                 file->tab.name = emallocz(16);
- snprintf(file->tab.name, 16, "0x%x", (uint)c->win);
+ snprintf(file->tab.name, 16, "0x%x", (uint)c->win.w);
                                                 if(name) goto LastItem;
                                         }
                                 }
@@ -572,8 +600,6 @@ fs_size(FileId *f) {
                 return f->content.rule->size;
         case FsFKeys:
                 return def.keyssz;
- case FsFClabel:
- return strlen(f->content.client->name);
         case FsFCtags:
                 return strlen(f->content.client->tags);
         case FsFprops:
@@ -666,10 +692,6 @@ fs_read(Ixp9Req *r) {
                         write_buf(r, def.keys, def.keyssz);
                         respond(r, nil);
                         return;
- case FsFClabel:
- write_buf(r, f->content.client->name, strlen(f->content.client->name));
- respond(r, nil);
- return;
                 case FsFCtags:
                         write_buf(r, f->content.client->tags, strlen(f->content.client->tags));
                         respond(r, nil);
@@ -718,9 +740,7 @@ void
 void
 fs_write(Ixp9Req *r) {
         FileId *f;
- Client *c;
         char *errstr = nil;
- XClassHint ch;
         uint i;
 
         if(r->ifcall.count == 0) {
@@ -742,25 +762,6 @@ fs_write(Ixp9Req *r) {
                 return;
         case FsFKeys:
                 write_to_buf(r, &def.keys, &def.keyssz, 0);
- respond(r, nil);
- return;
- case FsFClabel:
- data_to_cstring(r);
- c = f->content.client;
- strncpy(c->name, r->ifcall.data, sizeof(c->name));
- if(XGetClassHint(blz.dpy, c->win, &ch)) {
- snprintf(c->props, sizeof(c->props),
- "%s:%s:%s",
- str_nil(ch.res_class),
- str_nil(ch.res_name),
- c->name);
- if(ch.res_class)
- XFree(ch.res_class);
- if(ch.res_name)
- XFree(ch.res_name);
- }
- draw_frame(f->content.client->sel);
- r->ofcall.count = r->ifcall.count;
                 respond(r, nil);
                 return;
         case FsFCtags:
@@ -945,7 +946,7 @@ fs_clunk(Ixp9Req *r) {
         case FsFBar:
                 buf = f->content.bar->buf;
                 i = strlen(f->content.bar->buf);
- parse_colors(&buf, &i, &f->content.bar->brush.color);
+ parse_colors(&buf, &i, &f->content.bar->col);
                 while(i > 0 && buf[i - 1] == '\n')
                         buf[--i] = '\0';
                 strncpy(f->content.bar->text, buf, sizeof(f->content.bar->text));
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/geom.c
--- a/cmd/wmii/geom.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/geom.c Mon Apr 16 14:06:32 2007 -0400
@@ -7,31 +7,31 @@
 #include "fns.h"
 
 Bool
-ptinrect(int x, int y, XRectangle * r) {
- return (x >= r->x) && (x < r_east(r))
- && (y >= r->y) && (y < r_south(r));
+ptinrect(Point pt, Rectangle r) {
+ return (pt.x >= r.min.x) && (pt.x < r.max.x)
+ && (pt.y >= r.min.y) && (pt.y < r.max.y);
 }
 
-BlitzAlign
-quadrant(XRectangle *rect, int x, int y) {
- BlitzAlign ret = 0;
- x -= rect->x;
- y -= rect->y;
+Align
+quadrant(Rectangle r, Point pt) {
+ Align ret = 0;
 
- if(x >= rect->width * .5)
+ pt = subpt(pt, r.min);
+
+ if(pt.x >= Dx(r) * .5)
                 ret |= EAST;
- if(x <= rect->width * .5)
+ if(pt.x <= Dx(r) * .5)
                 ret |= WEST;
- if(y <= rect->height * .5)
+ if(pt.y <= Dy(r) * .5)
                 ret |= NORTH;
- if(y >= rect->height * .5)
+ if(pt.y >= Dy(r) * .5)
                 ret |= SOUTH;
 
         return ret;
 }
 
 Cursor
-cursor_of_quad(BlitzAlign align) {
+cursor_of_quad(Align align) {
         switch(align) {
         case NEAST:
                 return cursor[CurNECorner];
@@ -46,39 +46,15 @@ cursor_of_quad(BlitzAlign align) {
         }
 }
 
-/* Syntax: <x> <y> <width> <height> */
-int
-strtorect(XRectangle *r, const char *val) {
- XRectangle new;
- if (!val)
- return -1;
+Align
+get_sticky(Rectangle src, Rectangle dst) {
+ Align stickycorner = 0;
 
- if(sscanf(val, "%hd %hd %hu %hu", &new.x, &new.y, &new.width, &new.height) != 4)
- return -1;
-
- *r = new;
- return 0;
-}
-
-int
-r_east(XRectangle *r) {
- return r->x + r->width;
-}
-
-int
-r_south(XRectangle *r) {
- return r->y + r->height;
-}
-
-BlitzAlign
-get_sticky(XRectangle *src, XRectangle *dst) {
- BlitzAlign stickycorner = 0;
-
- if(src->x != dst->x && r_east(src) == r_east(dst))
+ if(src.min.x != dst.min.x && src.max.x == dst.max.x)
                 stickycorner |= EAST;
         else
                 stickycorner |= WEST;
- if(src->y != dst->y && r_south(src) == r_south(dst))
+ if(src.min.y != dst.min.y && src.max.y == dst.max.y)
                 stickycorner |= SOUTH;
         else
                 stickycorner |= NORTH;
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/key.c
--- a/cmd/wmii/key.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/key.c Mon Apr 16 14:06:32 2007 -0400
@@ -19,8 +19,8 @@ init_lock_keys() {
         int i;
 
         num_lock_mask = 0;
- modmap = XGetModifierMapping(blz.dpy);
- num_lock = XKeysymToKeycode(blz.dpy, XStringToKeysym("Num_Lock"));
+ modmap = XGetModifierMapping(display);
+ num_lock = XKeysymToKeycode(display, XStringToKeysym("Num_Lock"));
         if(modmap && modmap->max_keypermod > 0) {
                 int max = (sizeof(masks) / sizeof(int)) * modmap->max_keypermod;
                 for(i = 0; i < max; i++)
@@ -54,25 +54,25 @@ mod_key_of_str(char *val) {
 
 static void
 grab_key(Key *k) {
- XGrabKey(blz.dpy, k->key, k->mod, blz.root,
+ XGrabKey(display, k->key, k->mod, scr.root.w,
                         True, GrabModeAsync, GrabModeAsync);
         if(num_lock_mask) {
- XGrabKey(blz.dpy, k->key, k->mod | num_lock_mask, blz.root,
+ XGrabKey(display, k->key, k->mod | num_lock_mask, scr.root.w,
                                 True, GrabModeAsync, GrabModeAsync);
- XGrabKey(blz.dpy, k->key, k->mod | num_lock_mask | LockMask, blz.root,
+ XGrabKey(display, k->key, k->mod | num_lock_mask | LockMask, scr.root.w,
                                 True, GrabModeAsync, GrabModeAsync);
         }
- XSync(blz.dpy, False);
+ XSync(display, False);
 }
 
 static void
 ungrab_key(Key *k) {
- XUngrabKey(blz.dpy, k->key, k->mod, blz.root);
+ XUngrabKey(display, k->key, k->mod, scr.root.w);
         if(num_lock_mask) {
- XUngrabKey(blz.dpy, k->key, k->mod | num_lock_mask, blz.root);
- XUngrabKey(blz.dpy, k->key, k->mod | num_lock_mask | LockMask, blz.root);
- }
- XSync(blz.dpy, False);
+ XUngrabKey(display, k->key, k->mod | num_lock_mask, scr.root.w);
+ XUngrabKey(display, k->key, k->mod | num_lock_mask | LockMask, scr.root.w);
+ }
+ XSync(display, False);
 }
 
 static Key *
@@ -111,7 +111,7 @@ get_key(const char *name) {
                         kstr++;
                 else
                         kstr = seq[i];
- k->key = XKeysymToKeycode(blz.dpy, XStringToKeysym(kstr));
+ k->key = XKeysymToKeycode(display, XStringToKeysym(kstr));
                 k->mod = mod_key_of_str(seq[i]);
         }
         if(r) {
@@ -130,30 +130,30 @@ next_keystroke(ulong *mod, KeyCode *code
         *mod = 0;
 
         do {
- XMaskEvent(blz.dpy, KeyPressMask, &e);
+ XMaskEvent(display, KeyPressMask, &e);
                 *mod |= e.xkey.state & valid_mask;
                 *code = (KeyCode) e.xkey.keycode;
- sym = XKeycodeToKeysym(blz.dpy, e.xkey.keycode, 0);
+ sym = XKeycodeToKeysym(display, e.xkey.keycode, 0);
         } while(IsModifierKey(sym));
 }
 
 static void
 emulate_key_press(ulong mod, KeyCode key) {
         XEvent e;
- Window client_win;
+ XWindow client_win;
         int revert;
 
- XGetInputFocus(blz.dpy, &client_win, &revert);
+ XGetInputFocus(display, &client_win, &revert);
         e.xkey.type = KeyPress;
         e.xkey.time = CurrentTime;
         e.xkey.window = client_win;
- e.xkey.display = blz.dpy;
+ e.xkey.display = display;
         e.xkey.state = mod;
         e.xkey.keycode = key;
- XSendEvent(blz.dpy, client_win, True, KeyPressMask, &e);
+ XSendEvent(display, client_win, True, KeyPressMask, &e);
         e.xkey.type = KeyRelease;
- XSendEvent(blz.dpy, client_win, True, KeyReleaseMask, &e);
- XSync(blz.dpy, False);
+ XSendEvent(display, client_win, True, KeyReleaseMask, &e);
+ XSync(display, False);
 }
 
 static Key *
@@ -172,7 +172,7 @@ match_keys(Key *k, ulong mod, KeyCode ke
 }
 
 static void
-kpress_seq(Window w, Key *done) {
+kpress_seq(XWindow w, Key *done) {
         ulong mod;
         KeyCode key;
         Key *found;
@@ -183,7 +183,7 @@ kpress_seq(Window w, Key *done) {
                 emulate_key_press(mod, key); /* double key */
         else {
                 if(!found) {
- XBell(blz.dpy, 0);
+ XBell(display, 0);
                 } /* grabbed but not found */
                 else if(!found->tnext && !found->next)
                         write_event("Key %s\n", found->name);
@@ -193,22 +193,22 @@ kpress_seq(Window w, Key *done) {
 }
 
 void
-kpress(Window w, ulong mod, KeyCode keycode) {
+kpress(XWindow w, ulong mod, KeyCode keycode) {
         Key *k, *found;
 
         for(k=key; k; k=k->lnext)
                  k->tnext=k->lnext;
         found = match_keys(key, mod, keycode, False);
         if(!found) {
- XBell(blz.dpy, 0);
+ XBell(display, 0);
         } /* grabbed but not found */
         else if(!found->tnext && !found->next)
                 write_event("Key %s\n", found->name);
         else {
- XGrabKeyboard(blz.dpy, w, True, GrabModeAsync, GrabModeAsync, CurrentTime);
+ XGrabKeyboard(display, w, True, GrabModeAsync, GrabModeAsync, CurrentTime);
                 kpress_seq(w, found);
- XUngrabKeyboard(blz.dpy, CurrentTime);
- XSync(blz.dpy, False);
+ XUngrabKeyboard(display, CurrentTime);
+ XSync(display, False);
         }
 }
 
@@ -241,5 +241,5 @@ update_keys() {
                 if((k = get_key(l)))
                         grab_key(k);
         }
- XSync(blz.dpy, False);
-}
+ XSync(display, False);
+}
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/main.c
--- a/cmd/wmii/main.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/main.c Mon Apr 16 14:06:32 2007 -0400
@@ -2,7 +2,6 @@
  * Copyright ©2006-2007 Kris Maglione <fbsdaemon_AT_gmail.com>
  * See LICENSE file for license details.
  */
-#include <X11/Xatom.h>
 #include <X11/Xproto.h>
 #include <X11/cursorfont.h>
 #include <errno.h>
@@ -38,70 +37,29 @@ scan_wins() {
 scan_wins() {
         int i;
         uint num;
- Window *wins;
+ XWindow *wins;
         XWindowAttributes wa;
- Window d1, d2;
-
- if(XQueryTree(blz.dpy, blz.root, &d1, &d2, &wins, &num)) {
+ XWindow d1, d2;
+
+ if(XQueryTree(display, scr.root.w, &d1, &d2, &wins, &num)) {
                 for(i = 0; i < num; i++) {
- if(!XGetWindowAttributes(blz.dpy, wins[i], &wa))
+ if(!XGetWindowAttributes(display, wins[i], &wa))
                                 continue;
- if(wa.override_redirect || XGetTransientForHint(blz.dpy, wins[i], &d1))
+ if(wa.override_redirect || XGetTransientForHint(display, wins[i], &d1))
                                 continue;
                         if(wa.map_state == IsViewable)
                                 manage_client(create_client(wins[i], &wa));
                 }
                 for(i = 0; i < num; i++) {
- if(!XGetWindowAttributes(blz.dpy, wins[i], &wa))
+ if(!XGetWindowAttributes(display, wins[i], &wa))
                                 continue;
- if((XGetTransientForHint(blz.dpy, wins[i], &d1))
+ if((XGetTransientForHint(display, wins[i], &d1))
                         && (wa.map_state == IsViewable))
                                 manage_client(create_client(wins[i], &wa));
                 }
         }
         if(wins)
                 XFree(wins);
-}
-
-int
-win_proto(Window w) {
- Atom *protocols;
- Atom real;
- ulong nitems, extra;
- int i, format, status, protos;
-
- status = XGetWindowProperty(
- /* display */ blz.dpy,
- /* window */ w,
- /* property */ atom[WMProtocols],
- /* offset */ 0L,
- /* length */ 20L,
- /* delete */ False,
- /* req_type */ XA_ATOM,
- /* type_ret */ &real,
- /* format_ret */&format,
- /* nitems_ret */&nitems,
- /* extra_bytes */&extra,
- /* prop_return */(uchar**)&protocols
- );
-
- if(status != Success || protocols == 0) {
- return 0;
- }
-
- if(nitems == 0) {
- free(protocols);
- return 0;
- }
-
- protos = 0;
- for(i = 0; i < nitems; i++) {
- if(protocols[i] == atom[WMDelete])
- protos |= WM_PROTOCOL_DELWIN;
- }
-
- free(protocols);
- return protos;
 }
 
 static char*
@@ -186,26 +144,21 @@ init_environment() {
 }
 
 static void
-intern_atom(int ident, char *name) {
- atom[ident] = XInternAtom(blz.dpy, name, False);
-}
-
-static void
 init_atoms() {
- intern_atom(WMState, "WM_STATE");
- intern_atom(WMProtocols, "WM_PROTOCOLS");
- intern_atom(WMDelete, "WM_DELETE_WINDOW");
- intern_atom(NetSupported, "_NET_SUPPORTED");
- intern_atom(NetWMName, "_NET_WM_NAME");
- intern_atom(TagsAtom, "_WIN_TAGS");
-
- XChangeProperty(blz.dpy, blz.root, atom[NetSupported], XA_ATOM, 32,
+ atom[WMState] = xatom("WM_STATE");
+ atom[WMProtocols] = xatom("WM_PROTOCOLS");
+ atom[WMDelete] = xatom("WM_DELETE_WINDOW");
+ atom[NetSupported] = xatom("_NET_SUPPORTED");
+ atom[NetWMName] = xatom("_NET_WM_NAME");
+ atom[TagsAtom] = xatom("_WIN_TAGS");
+
+ XChangeProperty(display, scr.root.w, atom[NetSupported], XA_ATOM, 32,
                         PropModeReplace, (uchar *)&atom[NetSupported], 2);
 }
 
 static void
 create_cursor(int ident, uint shape) {
- cursor[ident] = XCreateFontCursor(blz.dpy, shape);
+ cursor[ident] = XCreateFontCursor(display, shape);
 }
 
 static void
@@ -222,23 +175,24 @@ init_cursors() {
         create_cursor(CurDHArrow, XC_sb_h_double_arrow);
         create_cursor(CurInput, XC_xterm);
 
- XAllocNamedColor(blz.dpy, DefaultColormap(blz.dpy, blz.screen),
+ XAllocNamedColor(display, scr.colormap,
                         "black", &black,
                         &dummy);
- pix = XCreateBitmapFromData(blz.dpy, blz.root,
+ pix = XCreateBitmapFromData(
+ display, scr.root.w,
                         (char[]){0}, 1, 1);
 
- cursor[CurInvisible] = XCreatePixmapCursor(blz.dpy,
+ cursor[CurInvisible] = XCreatePixmapCursor(display,
                         pix, pix,
                         &black, &black,
                         0, 0);
 
- XFreePixmap(blz.dpy, pix);
+ XFreePixmap(display, pix);
 }
 
 static void
 init_screen(WMScreen *screen) {
- Window w;
+ XWindow w;
         int ret;
         unsigned mask;
         XGCValues gcv;
@@ -248,7 +202,10 @@ init_screen(WMScreen *screen) {
         gcv.foreground = def.normcolor.bg;
         gcv.plane_mask = AllPlanes;
         gcv.graphics_exposures = False;
- xorgc = XCreateGC(blz.dpy, blz.root,
+
+ xor.type = WImage;
+ xor.image = scr.root.w;
+ xor.gc = XCreateGC(display, scr.root.w,
                           GCForeground
                         | GCGraphicsExposures
                         | GCFunction
@@ -256,12 +213,10 @@ init_screen(WMScreen *screen) {
                         | GCPlaneMask,
                         &gcv);
 
- screen->rect.x = screen->rect.y = 0;
- screen->rect.width = DisplayWidth(blz.dpy, blz.screen);
- screen->rect.height = DisplayHeight(blz.dpy, blz.screen);
- def.snap = screen->rect.height / 63;
-
- sel_screen = XQueryPointer(blz.dpy, blz.root,
+ screen->rect = scr.rect;
+ def.snap = Dy(scr.rect) / 63;
+
+ sel_screen = XQueryPointer(display, scr.root.w,
                         &w, &w,
                         &ret, &ret, &ret, &ret,
                         &mask);
@@ -281,7 +236,7 @@ struct {
 
 /*
  * There's no way to check accesses to destroyed windows, thus
- * those cases are ignored (especially on UnmapNotifies).
+ * those cases are ignored (especially on UnmapNotify's).
  * Other types of errors call Xlib's default error handler, which
  * calls exit().
  */
@@ -299,16 +254,19 @@ wmii_error_handler(Display *dpy, XErrorE
 
         fprintf(stderr, "%s: fatal error: Xrequest code=%d, Xerror code=%d\n",
                         argv0, error->request_code, error->error_code);
- return x_error_handler(blz.dpy, error); /* calls exit() */
+ return x_error_handler(display, error); /* calls exit() */
 }
 
 static void
 cleanup() {
         Client *c;
 
- for(c=client; c; c=c->next)
- reparent_client(c, blz.root, c->sel->rect.x, c->sel->rect.y);
- XSync(blz.dpy, False);
+ for(c=client; c; c=c->next) {
+ reparent_client(c, &scr.root, c->sel->rect.min);
+ if(c->sel->view != screen->sel)
+ unmap_client(c, IconicState);
+ }
+ XSync(display, False);
 }
 
 static void
@@ -341,18 +299,18 @@ init_traps() {
                 break; /* not reached */
         case 0:
                 close(fd[1]);
- close(ConnectionNumber(blz.dpy));
+ close(ConnectionNumber(display));
                 setsid();
 
- blz.dpy = XOpenDisplay(0);
- if(!blz.dpy)
+ display = XOpenDisplay(0);
+ if(!display)
                         fatal("Can't open display");
 
                 /* Wait for parent to exit */
                 read(fd[0], buf, 1);
 
- XSetInputFocus(blz.dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
- XCloseDisplay(blz.dpy);
+ XSetInputFocus(display, PointerRoot, RevertToPointerRoot, CurrentTime);
+ XCloseDisplay(display);
                 exit(0);
         default:
                 break;
@@ -389,7 +347,7 @@ spawn_command(const char *cmd) {
                         if(setsid() == -1)
                                 fatal("Can't setsid:");
                         close(sock);
- close(ConnectionNumber(blz.dpy));
+ close(ConnectionNumber(display));
 
                         shell = passwd->pw_shell;
                         if(shell[0] != '/')
@@ -424,7 +382,7 @@ main(int argc, char *argv[]) {
 main(int argc, char *argv[]) {
         char *wmiirc;
         WMScreen *s;
- XSetWindowAttributes wa;
+ WinAttr wa;
         int i;
 
         wmiirc = "wmiistartrc";
@@ -453,16 +411,12 @@ main(int argc, char *argv[]) {
         setlocale(LC_CTYPE, "");
         starting = True;
 
- blz.dpy = XOpenDisplay(0);
- if(!blz.dpy)
- fatal("Can't open display");
- blz.screen = DefaultScreen(blz.dpy);
- blz.root = RootWindow(blz.dpy, blz.screen);
+ initdisplay();
 
         check_other_wm = True;
         x_error_handler = XSetErrorHandler(wmii_error_handler);
- XSelectInput(blz.dpy, blz.root, SubstructureRedirectMask | EnterWindowMask);
- XSync(blz.dpy, False);
+ XSelectInput(display, scr.root.w, SubstructureRedirectMask | EnterWindowMask);
+ XSync(display, False);
         check_other_wm = False;
 
         passwd = getpwuid(getuid());
@@ -478,50 +432,47 @@ main(int argc, char *argv[]) {
         if(wmiirc)
                 spawn_command(wmiirc);
 
+ init_traps();
+ init_atoms();
+ init_cursors();
+ init_lock_keys();
+
         ixp_listen(&srv, sock, &p9srv, check_9pcon, nil);
- ixp_listen(&srv, ConnectionNumber(blz.dpy), nil, check_x_event, nil);
+ ixp_listen(&srv, ConnectionNumber(display), nil, check_x_event, nil);
 
         view = nil;
         client = nil;
         key = nil;
 
- def.font.fontstr = estrdup(BLITZ_FONT);
+ def.font = loadfont(FONT);
         def.border = 1;
         def.colmode = Coldefault;
 
         def.mod = Mod1Mask;
         strncpy(def.grabmod, "Mod1", sizeof(def.grabmod));
 
- strncpy(def.focuscolor.colstr, BLITZ_FOCUSCOLORS, sizeof(def.focuscolor.colstr));
- strncpy(def.normcolor.colstr, BLITZ_NORMCOLORS, sizeof(def.normcolor.colstr));
- loadcolor(&blz, &def.focuscolor);
- loadcolor(&blz, &def.normcolor);
-
- init_traps();
- init_atoms();
- init_cursors();
- loadfont(&blz, &def.font);
- init_lock_keys();
+ loadcolor(&def.focuscolor, FOCUSCOLORS);
+ loadcolor(&def.normcolor, NORMCOLORS);
 
         num_screens = 1;
         screens = emallocz(num_screens * sizeof(*screens));
+ screen = &screens[0];
         for(i = 0; i < num_screens; i++) {
                 s = &screens[i];
                 init_screen(s);
- pmap = XCreatePixmap(
- /* display */ blz.dpy,
- /* drawable */ blz.root,
- /* width */ s->rect.width,
- /* height */ s->rect.height,
- /* depth */ DefaultDepth(blz.dpy, blz.screen)
- );
+
+ s->ibuf = allocimage(Dx(s->rect), Dy(s->rect), scr.depth);
+
                 wa.event_mask =
                           SubstructureRedirectMask
                         | EnterWindowMask
                         | LeaveWindowMask
                         | FocusChangeMask;
                 wa.cursor = cursor[CurNormal];
- XChangeWindowAttributes(blz.dpy, blz.root, CWEventMask | CWCursor, &wa);
+ setwinattr(&scr.root, &wa,
+ CWEventMask
+ | CWCursor);
+
                 wa.override_redirect = 1;
                 wa.background_pixmap = ParentRelative;
                 wa.event_mask =
@@ -530,40 +481,23 @@ main(int argc, char *argv[]) {
                         | FocusChangeMask
                         | SubstructureRedirectMask
                         | SubstructureNotifyMask;
+
                 s->brect = s->rect;
- s->brect.height = labelh(&def.font);
- s->brect.y = s->rect.height - s->brect.height;
- s->barwin = XCreateWindow(
- /* display */ blz.dpy,
- /* parent */ RootWindow(blz.dpy, blz.screen),
- /* x */ s->brect.x,
- /* y */ s->brect.y,
- /* width */ s->brect.width,
- /* height */ s->brect.height,
- /*border_width*/0,
- /* depth */ DefaultDepth(blz.dpy, blz.screen),
- /* class */ CopyFromParent,
- /* visual */ DefaultVisual(blz.dpy, blz.screen),
- /* valuemask */ CWOverrideRedirect | CWBackPixmap | CWEventMask,
- /* attrubutes */&wa
- );
- XSync(blz.dpy, False);
- s->bbrush.blitz = &blz;
- s->bbrush.gc = XCreateGC(blz.dpy, s->barwin, 0, 0);
- s->bbrush.drawable = pmap;
- s->bbrush.rect = s->brect;
- s->bbrush.rect.x = 0;
- s->bbrush.rect.y = 0;
- s->bbrush.color = def.normcolor;
- s->bbrush.font = &def.font;
- s->bbrush.border = 1;
+ s->brect.min.y = s->brect.max.y - labelh(def.font);
+
+ s->barwin = createwindow(&scr.root, s->brect, scr.depth, InputOutput, &wa,
+ CWOverrideRedirect
+ | CWBackPixmap
+ | CWEventMask);
+
+ XSync(display, False);
                 draw_bar(s);
- XMapRaised(blz.dpy, s->barwin);
+ XMapRaised(display, s->barwin->w);
         }
 
         screen = &screens[0];
         screen->focus = nil;
- XSetInputFocus(blz.dpy, screen->barwin, RevertToParent, CurrentTime);
+ XSetInputFocus(display, screen->barwin->w, RevertToParent, CurrentTime);
 
         scan_wins();
         starting = False;
@@ -577,7 +511,7 @@ main(int argc, char *argv[]) {
                 fprintf(stderr, "%s: error: %s\n", argv0, errstr);
 
         cleanup();
- XCloseDisplay(blz.dpy);
+ XCloseDisplay(display);
         ixp_server_close(&srv);
         close(sleeperfd);
 
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/mouse.c
--- a/cmd/wmii/mouse.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/mouse.c Mon Apr 16 14:06:32 2007 -0400
@@ -1,4 +1,4 @@
-/* Copyright ©2006 Kris Maglione <fbsdaemon_AT_gmail.com>
+/* Copyright ©2006-2007 Kris Maglione <fbsdaemon_AT_gmail.com>
  * See LICENSE file for license details.
  */
 #include <stdlib.h>
@@ -16,92 +16,70 @@ enum {
 };
 
 static void
-rect_morph_xy(XRectangle *rect, int dx, int dy, BlitzAlign *mask) {
- BlitzAlign nmask;
-
- nmask = 0;
- if(*mask & NORTH) {
- if(rect->height - dy >= 0 || *mask & SOUTH) {
- rect->y += dy;
- rect->height -= dy;
- }
- else {
- rect->y += rect->height;
- rect->height = dy - rect->height;
- nmask ^= NORTH|SOUTH;
- }
- }
- if(*mask & SOUTH) {
- if(rect->height + dy >= 0 || *mask & NORTH)
- rect->height += dy;
- else {
- rect->height = -dy - rect->height;
- rect->y -= rect->height;
- nmask ^= NORTH|SOUTH;
- }
- }
- if(*mask & EAST) {
- if(rect->width + dx >= 0 || *mask & WEST)
- rect->width += dx;
- else {
- rect->width = -dx - rect->width;
- rect->x -= rect->width;
- nmask ^= EAST|WEST;
- }
- }
- if(*mask & WEST) {
- if(rect->width - dx >= 0 || *mask & EAST) {
- rect->x += dx;
- rect->width -= dx;
- }
- else {
- rect->x += rect->width;
- rect->width = dx - rect->width;
- nmask ^= EAST|WEST;
- }
- }
- *mask ^= nmask;
+rect_morph_xy(Rectangle *r, Point d, Align *mask) {
+ int n;
+
+ if(*mask & NORTH)
+ r->min.y += d.y;
+ if(*mask & WEST)
+ r->min.x += d.x;
+ if(*mask & SOUTH)
+ r->max.y += d.y;
+ if(*mask & EAST)
+ r->max.x += d.x;
+
+ if(r->min.x > r->max.x) {
+ n = r->min.x;
+ r->min.x = r->max.x;
+ r->max.x = n;
+ *mask ^= EAST|WEST;
+ }
+ if(r->min.y > r->max.y) {
+ n = r->min.y;
+ r->min.y = r->max.y;
+ r->max.y = n;
+ *mask ^= NORTH|SOUTH;
+ }
 }
 
 typedef struct {
- XRectangle *rects;
+ Rectangle *rects;
         int num;
- int x1, y1;
- int x2, y2;
+ Rectangle r;
+ int x, y;
         int dx, dy;
- BlitzAlign mask;
+ Align mask;
 } SnapArgs;
 
 static void
 snap_line(SnapArgs *a) {
- int i, t_xy;
-
- /* horizontal */
- if(a->y1 == a->y2 && (a->mask & (NORTH|SOUTH))) {
+ Rectangle *r;
+ int i, x, y;
+
+ if(a->mask & (NORTH|SOUTH)) {
                 for(i=0; i < a->num; i++) {
- if(!(r_east(&a->rects[i]) < a->x1) ||
- (a->rects[i].x > a->x2)) {
-
- if(abs(a->rects[i].y - a->y1) <= abs(a->dy))
- a->dy = a->rects[i].y - a->y1;
-
- t_xy = r_south(&a->rects[i]);
- if(abs(t_xy - a->y1) < abs(a->dy))
- a->dy = t_xy - a->y1;
+ r = &a->rects[i];
+ if((r->min.x <= a->r.max.x) && (r->max.x >= a->r.min.x)) {
+ y = r->min.y;
+ if(abs(y - a->y) <= abs(a->dy))
+ a->dy = y - a->y;
+
+ y = r->max.y;
+ if(abs(y - a->y) <= abs(a->dy))
+ a->dy = y - a->y;
                         }
                 }
- }
- else if (a->mask & (EAST|WEST)) {
+ }else {
                 for(i=0; i < a->num; i++) {
- if(!(r_south(&a->rects[i]) < a->y1) ||
- (a->rects[i].y > a->y2)) {
-
- if(abs(a->rects[i].x - a->x1) <= abs(a->dx))
- a->dx = a->rects[i].x - a->x1;
-
- t_xy = r_east(&a->rects[i]);
- if(abs(t_xy - a->x1) < abs(a->dx))
- a->dx = t_xy - a->x1;
+ r = &a->rects[i];
+ if((r->min.y <= a->r.max.y) && (r->max.y >= a->r.min.y)) {
+ x = r->min.x;
+ if(abs(x - a->x) <= abs(a->dx))
+ a->dx = x - a->x;
+
+ x = r->max.x;
+ if(abs(x - a->x) <= abs(a->dx))
+ a->dx = x - a->x;
                         }
                 }
         }
@@ -111,92 +89,81 @@ snap_line(SnapArgs *a) {
  * (the directions that we're resizing in), unless a snap occurs, in which case, it's the
  * direction of the snap.
  */
-BlitzAlign
-snap_rect(XRectangle *rects, int num, XRectangle *current, BlitzAlign *mask, int snap) {
+Align
+snap_rect(Rectangle *rects, int num, Rectangle *r, Align *mask, int snap) {
         SnapArgs a = { 0, };
- BlitzAlign ret;
+ Align ret;
 
         a.rects = rects;
         a.num = num;
- a.mask = *mask;
         a.dx = snap + 1;
         a.dy = snap + 1;
-
- a.x1 = current->x;
- a.x2 = r_east(current);
+ a.r = *r;
+
+ a.mask = NORTH|SOUTH;
         if(*mask & NORTH) {
- a.y2 = a.y1 = current->y;
+ a.y = r->min.y;
                 snap_line(&a);
         }
         if(*mask & SOUTH) {
- a.y2 = a.y1 = r_south(current);
+ a.y = r->max.y;
                 snap_line(&a);
         }
 
- a.y1 = current->y;
- a.y2 = r_south(current);
+ a.mask = EAST|WEST;
         if(*mask & EAST) {
- a.x1 = a.x2 = r_east(current);
+ a.x = r->max.x;
                 snap_line(&a);
         }
         if(*mask & WEST) {
- a.x1 = a.x2 = current->x;
+ a.x = r->min.x;
                 snap_line(&a);
         }
 
         ret = CENTER;
- if(abs(a.dx) > snap)
+ if(abs(a.dx) <= snap)
+ ret ^= EAST|WEST;
+ else
                 a.dx = 0;
+
+ if(abs(a.dy) <= snap)
+ ret ^= NORTH|SOUTH;
         else
- ret ^= EAST|WEST;
-
- if(abs(a.dy) > snap)
                 a.dy = 0;
- else
- ret ^= NORTH|SOUTH;
-
- rect_morph_xy(current, a.dx, a.dy, mask);
-
+
+ rect_morph_xy(r, Pt(a.dx, a.dy), mask);
         return ret ^ *mask;
 }
 
 static void
-xorborder(XRectangle *r) {
- XRectangle xor;
-
- xor = *r;
- xor.x += 2;
- xor.y += 2;
- xor.width = xor.width > 4 ? xor.width - 4 : 0;
- xor.height = xor.height > 4 ? xor.height - 4 : 0;
-
- XSetLineAttributes(blz.dpy, xorgc, 1, LineSolid, CapNotLast, JoinMiter);
- XSetForeground(blz.dpy, xorgc, def.focuscolor.bg);
- if(xor.height > 4 && xor.width > 2)
- XDrawLine(blz.dpy, blz.root, xorgc,
- xor.x + 2,
- xor.y + xor.height / 2,
- r_east(&xor) - 2,
- xor.y + xor.height / 2);
- if(xor.width > 4 && xor.height > 2)
- XDrawLine(blz.dpy, blz.root, xorgc,
- xor.x + xor.width / 2,
- xor.y + 2,
- xor.x + xor.width / 2,
- r_south(&xor) - 2);
- XSetLineAttributes(blz.dpy, xorgc, 4, LineSolid, CapNotLast, JoinMiter);
- XDrawRectangles(blz.dpy, blz.root, xorgc, &xor, 1);
-}
-
-static void
-xorrect(XRectangle *r) {
- XSetLineAttributes(blz.dpy, xorgc, 1, LineSolid, CapNotLast, JoinMiter);
- XSetForeground(blz.dpy, xorgc, 0x00888888l);
- XFillRectangles(blz.dpy, blz.root, xorgc, r, 1);
-}
-
-static void
-find_droppoint(Frame *frame, int x, int y, XRectangle *rect, Bool do_move) {
+xorborder(Rectangle r) {
+ Rectangle r2;
+ ulong col;
+
+ col = def.focuscolor.bg;
+
+ r2 = insetrect(r, 4);
+
+ if(Dy(r) > 4 && Dx(r) > 2)
+ drawline(&xor,
+ Pt(r2.min.x, r2.min.y + Dy(r2)/2),
+ Pt(r2.max.x, r2.min.y + Dy(r2)/2),
+ CapNotLast, 1, col);
+ if(Dx(r) > 4 && Dy(r) > 2)
+ drawline(&xor,
+ Pt(r2.min.x + Dx(r2)/2, r.min.y),
+ Pt(r2.min.x + Dx(r2)/2, r.max.y),
+ CapNotLast, 1, col);
+ border(&xor, r, 4, col);
+}
+
+static void
+xorrect(Rectangle r) {
+ fill(&xor, r, 0x00888888L);
+}
+
+static void
+find_droppoint(Frame *frame, int x, int y, Rectangle *r, Bool do_move) {
         enum { Delta = 5 };
         View *v;
         Area *a, *a_prev;
@@ -208,63 +175,59 @@ find_droppoint(Frame *frame, int x, int
         /* New column? */
         a_prev = v->area;
         for(a = a_prev->next; a && a->next; a = a->next) {
- if(x < r_east(&a->rect))
+ if(x < a->rect.max.x)
                         break;
                 a_prev = a;
         }
 
- rect->y = 0;
- rect->height = screen->rect.height - screen->brect.height;
- rect->width = 2 * Delta;
- if(x < (a->rect.x + labelh(&def.font))) {
- rect->x = a->rect.x - Delta;
+ r->min.y = screen->rect.min.y;
+ r->max.y = screen->brect.min.y;
+ if(x < (a->rect.min.x + labelh(def.font))) {
+ r->min.x = a->rect.min.x + Delta;
+ r->max.x = a->rect.min.x + Delta;
                 if(do_move) {
                         a = new_column(v, a_prev, 0);
                         send_to_area(a, frame);
                         focus(frame->client, False);
- focus_view(screen, v);
- }
- return;
- }
- if(x > (r_east(&a->rect) - labelh(&def.font))) {
- rect->x = r_east(&a->rect) - Delta;
+ }
+ return;
+ }
+ if(x > (a->rect.max.x - labelh(def.font))) {
+ r->min.x = a->rect.max.x + Delta;
+ r->max.x = a->rect.max.x + Delta;
                 if(do_move) {
                         a = new_column(v, a, 0);
                         send_to_area(a, frame);
                         focus(frame->client, False);
- focus_view(screen, v);
                 }
                 return;
         }
 
         /* Over/under frame? */
- for(f = a->frame; f; f = f->anext) {
- if(y < f->rect.y)
- break;
- if(y < r_south(&f->rect))
- break;
- }
-
- rect->x = a->rect.x;
- rect->width = a->rect.width;
- rect->height = 2 * Delta;
- if(y < (f->rect.y + labelh(&def.font))) {
+ for(f = a->frame; f; f = f->anext)
+ if(y < f->rect.max.y || f->anext == nil)
+ break;
+
+ *r = a->rect;
+ if(y < (f->rect.min.y + labelh(def.font))) {
                 before = True;
- rect->y = f->rect.y - Delta;
+ r->min.y = f->rect.min.y - Delta;
+ r->max.y = f->rect.min.y + Delta;
                 if(do_move)
                         goto do_move;
                 return;
         }
- if(y > r_south(&f->rect) - labelh(&def.font)) {
+ if(y > f->rect.max.y - labelh(def.font)) {
                 before = False;
- rect->y = r_south(&f->rect) - Delta;
+ r->min.y = f->rect.max.y - Delta;
+ r->max.y = f->rect.max.y + Delta;
                 if(do_move)
                         goto do_move;
                 return;
         }
 
         /* No? Swap. */
- *rect = f->rect;
+ *r = f->rect;
         if(do_move) {
                 swap_frames(frame, f);
                 focus(frame->client, False);
@@ -284,19 +247,19 @@ do_move:
 }
 
 void
-querypointer(Window w, int *x, int *y) {
- Window dummy;
+querypointer(Window *w, int *x, int *y) {
+ XWindow dummy;
         uint ui;
         int i;
         
- XQueryPointer(blz.dpy, w, &dummy, &dummy, &i, &i, x, y, &ui);
+ XQueryPointer(display, w->w, &dummy, &dummy, &i, &i, x, y, &ui);
 }
 
 void
 warppointer(int x, int y) {
- XWarpPointer(blz.dpy,
+ XWarpPointer(display,
                 /* src_w */ None,
- /* dest_w */ blz.root,
+ /* dest_w */ scr.root.w,
                 /* src_rect */ 0, 0, 0, 0,
                 /* target */ x, y
                 );
@@ -304,7 +267,7 @@ warppointer(int x, int y) {
 
 static void
 do_managed_move(Client *c) {
- XRectangle frect, ofrect;
+ Rectangle frect, ofrect;
         XEvent ev;
         Frame *f;
         int x, y;
@@ -312,27 +275,29 @@ do_managed_move(Client *c) {
         focus(c, False);
         f = c->sel;
 
- XSync(blz.dpy, False);
- if(XGrabPointer(blz.dpy, c->framewin, False, MouseMask, GrabModeAsync, GrabModeAsync,
- None, cursor[CurMove], CurrentTime) != GrabSuccess)
- return;
- XGrabServer(blz.dpy);
-
- querypointer(blz.root, &x, &y);
+ XSync(display, False);
+ if(XGrabPointer(display, c->framewin->w, False,
+ MouseMask, GrabModeAsync, GrabModeAsync,
+ None, cursor[CurMove], CurrentTime
+ ) != GrabSuccess)
+ return;
+ XGrabServer(display);
+
+ querypointer(&scr.root, &x, &y);
 
         find_droppoint(f, x, y, &frect, False);
- xorrect(&frect);
+ xorrect(frect);
         for(;;) {
- XMaskEvent(blz.dpy, MouseMask | ExposureMask, &ev);
+ XMaskEvent(display, MouseMask | ExposureMask, &ev);
                 switch (ev.type) {
                 case ButtonRelease:
- xorrect(&frect);
+ xorrect(frect);
 
                         find_droppoint(f, x, y, &frect, True);
 
- XUngrabServer(blz.dpy);
- XUngrabPointer(blz.dpy, CurrentTime);
- XSync(blz.dpy, False);
+ XUngrabServer(display);
+ XUngrabPointer(display, CurrentTime);
+ XSync(display, False);
                         return;
                 case MotionNotify:
                         ofrect = frect;
@@ -341,9 +306,9 @@ do_managed_move(Client *c) {
 
                         find_droppoint(f, x, y, &frect, False);
 
- if(memcmp(&frect, &ofrect, sizeof(frect))) {
- xorrect(&ofrect);
- xorrect(&frect);
+ if(!eqrect(frect, ofrect)) {
+ xorrect(ofrect);
+ xorrect(frect);
                         }
                         break;
                 case Expose:
@@ -356,14 +321,14 @@ do_managed_move(Client *c) {
 
 void
 mouse_resizecol(Divide *d) {
- XSetWindowAttributes wa;
+ WinAttr wa;
         XEvent ev;
- Window cwin;
+ Window *cwin;
         Divide *dp;
         View *v;
         Area *a;
- uint w, minw;
- int x, y;
+ uint minw;
+ int x, y, x2;
 
         v = screen->sel;
 
@@ -374,47 +339,39 @@ mouse_resizecol(Divide *d) {
         if(a == nil || a->next == nil)
                 return;
 
- minw = screen->rect.width/NCOL;
-
- querypointer(blz.root, &x, &y);
- x = a->rect.x + minw;
- w = r_east(&a->next->rect) - minw;
- w -= x;
-
- cwin = XCreateWindow(blz.dpy, blz.root,
- x, y, w, 1,
- /* border */ 0,
- /* depth */ CopyFromParent,
- /* class */ InputOnly,
- /* visual */ CopyFromParent,
- /* valuemask */ 0,
- /* attrib */ &wa
- );
- XMapWindow(blz.dpy, cwin);
+ minw = Dx(screen->rect)/NCOL;
+
+ querypointer(&scr.root, &x, &y);
+ x = a->rect.min.x + minw;
+ x2 = x + a->next->rect.max.x - minw;
+
+ cwin = createwindow(&scr.root, Rect(x, y, x2, y+1), 0, InputOnly, &wa, 0);
+ mapwin(cwin);
 
         if(XGrabPointer(
- blz.dpy, blz.root,
+ display, scr.root.w,
                 /* owner_events*/ False,
                 /* event_mask */ MouseMask,
                 /* kbd, mouse */ GrabModeAsync, GrabModeAsync,
- /* confine_to */ cwin,
+ /* confine_to */ cwin->w,
                 /* cursor */ cursor[CurInvisible],
                 /* time */ CurrentTime
                 ) != GrabSuccess)
                 goto done;
 
+ querypointer(&scr.root, &x, &y);
         for(;;) {
- XMaskEvent(blz.dpy, MouseMask | ExposureMask, &ev);
+ XMaskEvent(display, MouseMask | ExposureMask, &ev);
                 switch (ev.type) {
                 case ButtonRelease:
- resize_column(a, x - a->rect.x);
-
- XUngrabPointer(blz.dpy, CurrentTime);
- XSync(blz.dpy, False);
+ resize_column(a, x - a->rect.min.x);
+
+ XUngrabPointer(display, CurrentTime);
+ XSync(display, False);
                         goto done;
                 case MotionNotify:
                         x = ev.xmotion.x_root;
- XMoveWindow(blz.dpy, d->w, x, 0);
+ setdiv(d, x);
                         break;
                 case Expose:
                         dispatch_event(&ev);
@@ -423,16 +380,16 @@ mouse_resizecol(Divide *d) {
                 }
         }
 done:
- XDestroyWindow(blz.dpy, cwin);
+ destroywindow(cwin);
 }
 
 void
-do_mouse_resize(Client *c, Bool opaque, BlitzAlign align) {
- BlitzAlign grav;
- Window dummy;
+do_mouse_resize(Client *c, Bool opaque, Align align) {
+ Align grav;
+ XWindow dummy;
         Cursor cur;
         XEvent ev;
- XRectangle *rects, ofrect, frect, origin;
+ Rectangle *rects, ofrect, frect, origin;
         int snap, dx, dy, pt_x, pt_y, hr_x, hr_y;
         uint num;
         Bool floating;
@@ -445,7 +402,7 @@ do_mouse_resize(Client *c, Bool opaque,
         cur = cursor_of_quad(align);
         if(floating) {
                 rects = rects_of_view(f->area->view, &num, (opaque ? c->frame : nil));
- snap = screen->rect.height / 66;
+ snap = def.snap;
         }else{
                 rects = nil;
                 snap = 0;
@@ -461,12 +418,12 @@ do_mouse_resize(Client *c, Bool opaque,
         }
 
         querypointer(c->framewin, &pt_x, &pt_y);
- rx = (float)pt_x / frect.width;
- ry = (float)pt_y / frect.height;
+ rx = (float)pt_x / Dx(frect);
+ ry = (float)pt_y /Dy(frect);
 
         if(XGrabPointer(
- /* display */ blz.dpy,
- /* window */ c->framewin,
+ /* display */ display,
+ /* window */ c->framewin->w,
                 /* owner_events */ False,
                 /* event_mask */ MouseMask,
                 /* pointer_mode */ GrabModeAsync,
@@ -477,18 +434,18 @@ do_mouse_resize(Client *c, Bool opaque,
                 ) != GrabSuccess)
                 return;
 
- querypointer(blz.root, &pt_x, &pt_y);
+ querypointer(&scr.root, &pt_x, &pt_y);
 
         if(align != CENTER) {
- hr_x = dx = frect.width / 2;
- hr_y = dy = frect.height / 2;
+ hr_x = dx = Dx(frect) / 2;
+ hr_y = dy = Dy(frect) / 2;
                 if(align&NORTH) dy -= hr_y;
                 if(align&SOUTH) dy += hr_y;
                 if(align&EAST) dx += hr_x;
                 if(align&WEST) dx -= hr_x;
 
- XTranslateCoordinates(blz.dpy,
- /* src, dst */ c->framewin, blz.root,
+ XTranslateCoordinates(display,
+ /* src, dst */ c->framewin->w, scr.root.w,
                         /* src x,y */ dx, dy,
                         /* dest x,y */ &pt_x, &pt_y,
                         /* child */ &dummy
@@ -496,33 +453,33 @@ do_mouse_resize(Client *c, Bool opaque,
                 warppointer(pt_x, pt_y);
         }
         else if(f->client->fullscreen) {
- XUngrabPointer(blz.dpy, CurrentTime);
+ XUngrabPointer(display, CurrentTime);
                 return;
         }
         else if(!opaque) {
- hrx = (double)(screen->rect.width + frect.width - 2 * labelh(&def.font))
- / screen->rect.width;
- hry = (double)(screen->rect.height + frect.height - 3 * labelh(&def.font))
- / screen->rect.height;
- pt_x = r_east(&frect) - labelh(&def.font);
- pt_y = r_south(&frect) - labelh(&def.font);
+ hrx = (double)(Dx(screen->rect) + Dx(frect) - 2 * labelh(def.font))
+ / Dx(screen->rect);
+ hry = (double)(Dy(screen->rect) + Dy(frect) - 3 * labelh(def.font))
+ / Dy(screen->rect);
+ pt_x = frect.max.x - labelh(def.font);
+ pt_y = frect.max.y - labelh(def.font);
                 warppointer(pt_x / hrx, pt_y / hry);
                 flushevents(PointerMotionMask, False);
         }
 
- XSync(blz.dpy, False);
+ XSync(display, False);
         if(!opaque) {
- XGrabServer(blz.dpy);
- xorborder(&frect);
+ XGrabServer(display);
+ xorborder(frect);
         }else
                 unmap_client(c, IconicState);
 
         for(;;) {
- XMaskEvent(blz.dpy, MouseMask | ExposureMask, &ev);
+ XMaskEvent(display, MouseMask | ExposureMask, &ev);
                 switch (ev.type) {
                 case ButtonRelease:
                         if(!opaque)
- xorborder(&frect);
+ xorborder(frect);
 
                         if(!floating)
                                 resize_colframe(f, &frect);
@@ -530,24 +487,24 @@ do_mouse_resize(Client *c, Bool opaque,
                                 resize_client(c, &frect);
 
                         if(!opaque) {
- XTranslateCoordinates(blz.dpy,
- /* src, dst */ c->framewin, blz.root,
- /* src_x */ (frect.width * rx),
- /* src_y */ (frect.height * ry),
+ XTranslateCoordinates(display,
+ /* src, dst */ c->framewin->w, scr.root.w,
+ /* src_x */ (Dx(frect) * rx),
+ /* src_y */ (Dy(frect) * ry),
                                         /* dest x,y */ &pt_x, &pt_y,
                                         /* child */ &dummy
                                         );
- if(pt_y > screen->brect.y)
- pt_y = screen->brect.y - 1;
+ if(pt_y > screen->brect.min.y)
+ pt_y = screen->brect.min.y - 1;
                                 warppointer(pt_x, pt_y);
- XUngrabServer(blz.dpy);
+ XUngrabServer(display);
                         }else
                                 map_client(c);
 
                         free(rects);
 
- XUngrabPointer(blz.dpy, CurrentTime);
- XSync(blz.dpy, False);
+ XUngrabPointer(display, CurrentTime);
+ XSync(display, False);
                         return;
                 case MotionNotify:
                         ofrect = frect;
@@ -557,31 +514,31 @@ do_mouse_resize(Client *c, Bool opaque,
                         if(align == CENTER && !opaque) {
                                 dx = (dx * hrx) - pt_x;
                                 dy = (dy * hry) - pt_y;
- }else{
+ }else {
                                 dx -= pt_x;
                                 dy -= pt_y;
                         }
                         pt_x += dx;
                         pt_y += dy;
 
- rect_morph_xy(&origin, dx, dy, &align);
- check_frame_constraints(&origin);
+ rect_morph_xy(&origin, Pt(dx, dy), &align);
+ origin = constrain(origin);
                         frect = origin;
 
                         if(floating)
                                 grav = snap_rect(rects, num, &frect, &align, snap);
                         else
- grav = align ^ CENTER;
+ grav = align^CENTER;
 
                         apply_sizehints(c, &frect, floating, True, grav);
- check_frame_constraints(&frect);
+ frect = constrain(frect);
 
                         if(opaque) {
- XMoveWindow(blz.dpy, c->framewin, frect.x, frect.y);
- XSync(blz.dpy, False);
- } else {
- xorborder(&ofrect);
- xorborder(&frect);
+ movewin(c->framewin, frect.min);
+ XSync(display, False);
+ }else {
+ xorborder(ofrect);
+ xorborder(frect);
                         }
                         break;
                 case Expose:
@@ -594,13 +551,13 @@ do_mouse_resize(Client *c, Bool opaque,
 }
 
 void
-grab_button(Window w, uint button, ulong mod) {
- XGrabButton(blz.dpy, button, mod, w, False, ButtonMask,
+grab_button(XWindow w, uint button, ulong mod) {
+ XGrabButton(display, button, mod, w, False, ButtonMask,
                         GrabModeSync, GrabModeSync, None, None);
         if((mod != AnyModifier) && (num_lock_mask != 0)) {
- XGrabButton(blz.dpy, button, mod | num_lock_mask, w, False, ButtonMask,
+ XGrabButton(display, button, mod | num_lock_mask, w, False, ButtonMask,
                         GrabModeSync, GrabModeAsync, None, None);
- XGrabButton(blz.dpy, button, mod | num_lock_mask | LockMask, w, False,
+ XGrabButton(display, button, mod | num_lock_mask | LockMask, w, False,
                         ButtonMask, GrabModeSync, GrabModeAsync, None, None);
         }
 }
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/printevent.c
--- a/cmd/wmii/printevent.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/printevent.c Mon Apr 16 14:06:32 2007 -0400
@@ -47,8 +47,8 @@ can get it touch with me at the followin
 #include <X11/Intrinsic.h>
 #include <X11/Xproto.h>
 #include <util.h>
-#include "dat.h"
-#include "fns.h"
+//#include "dat.h"
+//#include "fns.h"
 #include "printevent.h"
 
 static char* sep = " ";
@@ -854,11 +854,12 @@ char *eventtype(XEvent *ev)
 
 void printevent(XEvent *e)
 {
+ extern Display* display;
     XAnyEvent *ev = (void*)e;
     char *name;
 
     if(ev->window) {
- XFetchName(blz.dpy, ev->window, &name);
+ XFetchName(display, ev->window, &name);
             if(name) {
                     fprintf(stderr, "\ttitle=%s\n", name);
                     XFree(name);
diff -r f00e1be34737 -r b358a8133947 cmd/wmii/view.c
--- a/cmd/wmii/view.c Sun May 20 21:26:05 2007 -0400
+++ b/cmd/wmii/view.c Mon Apr 16 14:06:32 2007 -0400
@@ -62,6 +62,7 @@ create_view(const char *name) {
 
         v = emallocz(sizeof(View));
         v->id = id++;
+
         strncpy(v->name, name, sizeof(v->name));
 
         write_event("CreateTag %s\n", v->name);
@@ -86,14 +87,19 @@ destroy_view(View *v) {
         while((a = v->area)) {
                 v->area = a->next;
                 destroy_area(a);
- };
+ }
+
         for(i=&view; *i; i=&(*i)->next)
                 if(*i == v) break;
         *i = v->next;
+
         write_event("DestroyTag %s\n", v->name);
+
         if(v == screen->sel) {
- for(tv=view; tv && tv->next; tv=tv->next)
+ for(tv=view; tv; tv=tv->next)
                         if(tv->next == *i) break;
+ if(tv == nil)
+ tv = view;
                 if(tv)
                         focus_view(screen, tv);
         }
@@ -117,7 +123,9 @@ focus_view(WMScreen *s, View *v) {
         Client *c;
 
         old = screen->sel;
- XGrabServer(blz.dpy);
+
+ XGrabServer(display);
+
         assign_sel_view(v);
         update_frame_selectors(v);
         update_divs();
@@ -135,8 +143,9 @@ focus_view(WMScreen *s, View *v) {
         restack_view(v);
         focus_area(v->sel);
         draw_frames();
- XSync(blz.dpy, False);
- XUngrabServer(blz.dpy);
+
+ XSync(display, False);
+ XUngrabServer(display);
         flushevents(EnterWindowMask, False);
 }
 
@@ -146,10 +155,12 @@ select_view(const char *arg) {
 
         strncpy(buf, arg, sizeof(buf));
         trim(buf, " \t+/");
- if(!strlen(buf))
- return;
- if(!strncmp(buf, ".", 2) || !strncmp(buf, "..", 3))
- return;
+
+ if(strlen(buf) == 0)
+ return;
+ if(!strcmp(buf, ".") || !strcmp(buf, ".."))
+ return;
+
         assign_sel_view(get_view(buf));
         update_views(); /* performs focus_view */
 }
@@ -168,8 +179,8 @@ attach_to_view(View *v, Frame *f) {
 
 void
 restack_view(View *v) {
- static Window *wins = nil;
- static uint winssz = 0;
+ static XWindow *wins;
+ static uint winssz;
         Divide *d;
         Frame *f;
         Client *c;
@@ -180,8 +191,6 @@ restack_view(View *v) {
                 return;
 
         i = 0;
- n = 0;
-
         for(c = client; c; c = c->next)
                 i++;
         if(i == 0)
@@ -195,7 +204,8 @@ restack_view(View *v) {
                 wins = erealloc(wins, sizeof(Window) * winssz);
         }
 
- wins[n++] = screen->barwin;
+ n = 0;
+ wins[n++] = screen->barwin->w;
         for(f = v->area->frame; f; f = f->anext)
                 if(f->client->fullscreen) {
                         n--;
@@ -203,98 +213,110 @@ restack_view(View *v) {
                 }
 
         for(f=v->area->stack; f; f=f->snext)
- wins[n++] = f->client->framewin;
+ wins[n++] = f->client->framewin->w;
 
         for(d = divs; d && d->mapped; d = d->next)
- wins[n++] = d->w;
+ wins[n++] = d->w->w;
 
         for(a=v->area->next; a; a=a->next)
                 if(a->frame) {
- wins[n++] = a->sel->client->framewin;
+ wins[n++] = a->sel->client->framewin->w;
                         for(f=a->frame; f; f=f->anext)
                                 if(f != a->sel)
- wins[n++] = f->client->framewin;
- }
- if(n) {
- XRaiseWindow(blz.dpy, wins[0]);
- XRestackWindows(blz.dpy, wins, n);
- }
-}
-
-void
-scale_view(View *v, float w) {
+ wins[n++] = f->client->framewin->w;
+ }
+ if(n)
+ XRestackWindows(display, wins, n);
+}
+
+void
+scale_view(View *v, int w) {
         uint xoff, num_col;
         uint min_width;
         Area *a;
- float scale, dx = 0;
- int wdiff = 0;
-
- min_width = screen->rect.width/NCOL;
+ float scale, dx;
+ int wdiff;
+
+ min_width = Dx(screen->rect)/NCOL;
 
         if(!v->area->next)
                 return;
 
         num_col = 0;
- for(a=v->area->next; a; a=a->next)
- num_col++, dx += a->rect.width;
-
- scale = w / dx;
+ dx = 0;
+ for(a=v->area->next; a; a=a->next) {
+ num_col++;
+ dx += Dx(a->rect);
+ }
+
+ scale = (float)w / dx;
         xoff = 0;
         for(a=v->area->next; a; a=a->next) {
- a->rect.width *= scale;
+ a->rect.min.x = xoff;
+ a->rect.max.x = xoff + Dx(a->rect) * scale;
                 if(!a->next)
- a->rect.width = w - xoff;
- xoff += a->rect.width;
- }
+ a->rect.max.x = w;
+ xoff = a->rect.max.x;
+ }
+
         /* min_width can only be respected when there is enough space;
          * the caller should guarantee this */
         if(num_col * min_width > w)
                 return;
+
         xoff = 0;
         for(a=v->area->next, num_col--; a; a=a->next, num_col--) {
- if(a->rect.width < min_width)
- a->rect.width = min_width;
- else if((wdiff = xoff + a->rect.width - w + num_col * min_width) > 0)
- a->rect.width -= wdiff;
+ a->rect.min.x = xoff;
+
+ if(Dx(a->rect) < min_width)
+ a->rect.max.x = xoff + min_width;
+ else if((wdiff = xoff + Dx(a->rect) - w + num_col * min_width) > 0)
+ a->rect.max.x -= wdiff;
                 if(!a->next)
- a->rect.width = w - xoff;
- xoff += a->rect.width;
+ a->rect.max.x = w;
+
+ xoff = a->rect.max.x;
         }
 }
 
 void
 arrange_view(View *v) {
- uint xoff = 0;
+ uint xoff;
         Area *a;
 
         if(!v->area->next)
                 return;
- scale_view(v, screen->rect.width);
+
+ scale_view(v, Dx(screen->rect));
+ xoff = 0;
         for(a=v->area->next; a; a=a->next) {
- a->rect.x = xoff;
- a->rect.y = 0;
- a->rect.height = screen->rect.height - screen->brect.height;
- xoff += a->rect.width;
+ a->rect.min.x = xoff;
+ a->rect.min.y = 0;
+ a->rect.max.y = screen->brect.min.y;
+ xoff = a->rect.max.x;
                 arrange_column(a, False);
         }
 }
 
-XRectangle *
+Rectangle *
 rects_of_view(View *v, uint *num, Frame *ignore) {
- XRectangle *result;
+ Rectangle *result;
         Frame *f;
         int i;
 
         i = 2;
         for(f=v->area->frame; f; f=f->anext)
                 i++;
- result = emallocz(i * sizeof(XRectangle));
+
+ result = emallocz(i * sizeof(Rectangle));
+
         i = 0;
         for(f=v->area->frame; f; f=f->anext)
                 if(f != ignore)
                         result[i++] = f->rect;
         result[i++] = screen->rect;
         result[i++] = screen->brect;
+
         *num = i;
         return result;
 }
@@ -302,40 +324,43 @@ rects_of_view(View *v, uint *num, Frame
 /* XXX: This will need cleanup */
 uchar *
 view_index(View *v) {
- uint a_i, buf_i, n;
+ Frame *f;
+ Area *a;
+ char *buf;
+ uint i, n;
         int len;
- Frame *f;
- Area *a;
 
         len = sizeof(buffer);
- buf_i = 0;
- for((a = v->area), (a_i = 0); a && len > 0; (a=a->next), (a_i++)) {
+ buf = buffer;
+ for((a=v->area), (i=0); a && len > 0; (a=a->next), i++) {
                 if(a->floating)
- n = snprintf(&buffer[buf_i], len, "# ~ %d %d\n",
- a->rect.width, a->rect.height);
+ n = snprintf(buf, len, "# ~ %d %d\n",
+ Dx(a->rect), Dy(a->rect));
                 else
- n = snprintf(&buffer[buf_i], len, "# %d %d %d\n",
- a_i, a->rect.x, a->rect.width);
- buf_i += n;
+ n = snprintf(buf, len, "# %d %d %d\n",
+ i, a->rect.min.x, Dx(a->rect));
+
+ buf += n;
                 len -= n;
                 for(f=a->frame; f && len > 0; f=f->anext) {
- XRectangle *r = &f->rect;
+ Rectangle *r = &f->rect;
                         if(a->floating)
- n = snprintf(&buffer[buf_i], len, "~ 0x%x %d %d %d %d %s\n",
- (uint)f->client->win,
- r->x, r->y, r->width, r->height,
+ n = snprintf(buf, len, "~ 0x%x %d %d %d %d %s\n",
+ (uint)f->client->win.w,
+ r->min.x, r->min.y, Dx(*r), Dy(*r),
                                                 f->client->props);
                         else
- n = snprintf(&buffer[buf_i], len, "%d 0x%x %d %d %s\n",
- a_i, (uint)f->client->win, r->y,
- r->height, f->client->props);
+ n = snprintf(buf, len, "%d 0x%x %d %d %s\n",
+ i, (uint)f->client->win.w,
+ r->min.y, Dy(*r),
+ f->client->props);
                         if(len - n < 0)
                                 return (uchar*)buffer;
- buf_i += n;
+ buf += n;
                         len -= n;
                 }
         }
- return (uchar *)buffer;
+ return (uchar*)buffer;
 }
 
 Client *
@@ -347,12 +372,15 @@ client_of_message(View *v, char *message
                 *next = 4;
                 return view_selclient(v);
         }
+
         sscanf(message, "0x%lx %n", &id, next);
         if(!id)
                 sscanf(message, "%lu %n", &id, next);
         if(!id)
                 return nil;
- for(c=client; c && c->win!=id; c=c->next);
+
+ for(c=client; c; c=c->next)
+ if(c->win.w == id) break;
         return c;
 }
 
@@ -369,10 +397,11 @@ area_of_message(View *v, char *message,
                 *next = 2;
                 return v->area;
         }
+
         if(1 != sscanf(message, "%u %n", &i, next) || i == 0)
                 return nil;
- for(a=v->area; i && a; a=a->next)
- i--;
+ for(a=v->area; a; a=a->next)
+ if(i-- == 0) break;
         return a;
 }
 
@@ -465,7 +494,7 @@ newcolw_of_view(View *v, int num) {
                         n = tokenize(toks, 16, buf, '+');
                         if(n > num)
                                 if(sscanf(toks[num], "%u", &n) == 1)
- return screen->rect.width * ((double)n / 100);
+ return Dx(screen->rect) * ((double)n / 100);
                         break;
                 }
         return 0;
diff -r f00e1be34737 -r b358a8133947 cmd/wmiiloop.awk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd/wmiiloop.awk Mon Apr 16 14:06:32 2007 -0400
@@ -0,0 +1,35 @@
+#!AWKPATH -f
+BEGIN {
+ arg[1] = "Nop"
+ body = "";
+ writekeys = "wmiir write /keys"
+ print "IFS=''"
+}
+
+function addevent() {
+ if(arg[1] == "Key")
+ keys[arg[2]] = 1;
+
+ var = arg[1] "s"
+ print var "=\"$" var " " arg[2] "\""
+
+ gsub("[^a-zA-Z_0-9]", "_", arg[2]);
+ if(body != "")
+ print arg[1] "_" arg[2] "() {" body "\n}"
+}
+
+/^(Event|Key|Action)[ \t]/ {
+ addevent()
+ split($0, arg)
+ body = ""
+}
+/^[ \t]/ {
+ body = body"\n"$0
+}
+
+END {
+ addevent()
+ for(key in keys)
+ print key | writekeys;
+ close(writekeys);
+}
diff -r f00e1be34737 -r b358a8133947 cmd/wmiiloop.sh
--- a/cmd/wmiiloop.sh Sun May 20 21:26:05 2007 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-#!/bin/sh
-
-eval "text() {
- cat <<!
-$(sed '/^[[:blank:]]/s/\([$`]\)/\\\1/g')
-!
-}"
-
-script() {
- cat <<'!'
- BEGIN {
- arg[1] = "Nop"
- body = "";
- writekeys = "wmiir write /keys"
- print "IFS=''"
- }
-
- function addevent() {
- if(arg[1] == "Key")
- keys[arg[2]] = 1;
-
- var = arg[1] "s"
- print var "=\"$" var " " arg[2] "\""
-
- gsub("[^a-zA-Z_0-9]", "_", arg[2]);
- if(body != "")
- print arg[1] "_" arg[2] "() {" body "\n}"
- }
-
- /^(Event|Key|Action)[ \t]/ {
- addevent()
- split($0, arg)
- body = ""
- }
- /^[ \t]/ {
- body = body"\n"$0
- }
-
- END {
- addevent()
- for(key in keys)
- print key | writekeys;
- close(writekeys);
- }
-!
-}
-
-text | awk "`script`"
-
diff -r f00e1be34737 -r b358a8133947 config.mk
--- a/config.mk Sun May 20 21:26:05 2007 -0400
+++ b/config.mk Mon Apr 16 14:06:32 2007 -0400
@@ -22,19 +22,19 @@ CC = cc -c
 # Linker (Under normal circumstances, this should *not* be 'ld')
 LD = cc
 # Other
-AR = ar crs
-#AR = sh -c 'ar cr "$$@" && ranlib "$$@"'
+AR = ar cr
+RANLIB = ranlib
 
+AWKPATH = /usr/bin/awk
 P9PATHS = /usr/local/plan9 /usr/local/9 /opt/plan9 /opt/9 /usr/plan9 /usr/9
 
 INCX11 = -I/usr/X11R6/include
 LIBX11 = -L/usr/X11R6/lib -lX11
 LIBIXP = ${ROOT}/libixp/libixp.a
+LIBIXP = ${LIBDIR}/libixp.a
 
 # Solaris
 #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
 #LDFLAGS = ${LIBS} -R${PREFIX}/lib
 #LDFLAGS += -lsocket -lnsl
 #CFLAGS += -xtarget=ultra
-#FCALL_H_VERSION=.nounion
-
diff -r f00e1be34737 -r b358a8133947 include/Makefile
--- a/include/Makefile Sun May 20 21:26:05 2007 -0400
+++ b/include/Makefile Mon Apr 16 14:06:32 2007 -0400
@@ -3,4 +3,7 @@ include ${ROOT}/mk/hdr.mk
 
 HFILES = ixp.h ixp_fcall.h
 
+install: ${HFILES:.h=.install}
+uninstall: ${HFILES:.h=.uninstall}
+
 include ${ROOT}/mk/common.mk
diff -r f00e1be34737 -r b358a8133947 mk/dir.mk
--- a/mk/dir.mk Sun May 20 21:26:05 2007 -0400
+++ b/mk/dir.mk Mon Apr 16 14:06:32 2007 -0400
@@ -1,5 +1,5 @@ MKSUBDIR = targ=$@; \
 MKSUBDIR = targ=$@; \
- for i in $$dirs; do \
+ for i in ${DIRS}; do \
                 if [ ! -d $$i ]; then \
                         echo Skipping nonexistent directory: $$i 1>&2; \
                 else \
@@ -7,23 +7,19 @@ MKSUBDIR = targ=$@; \
                         (cd $$i && ${MAKE} BASE="${BASE}$$i/" $${targ\#d}) || exit $?; \
                 fi; \
         done
-
 dall:
- dirs="${DIRS}"; ${MKSUBDIR}
+ ${MKSUBDIR}
 dclean:
- dirs="${DIRS}"; ${MKSUBDIR}
+ ${MKSUBDIR}
 dinstall:
- dirs="${INSTDIRS}"; ${MKSUBDIR}
+ ${MKSUBDIR}
 duninstall:
- dirs="${INSTDIRS}"; ${MKSUBDIR}
+ ${MKSUBDIR}
 ddepend:
- dirs="${DIRS}"; ${MKSUBDIR}
+ ${MKSUBDIR}
 
 all: dall
 clean: dclean
 install: dinstall
 uninstall: duninstall
 depend: ddepend
-
-INSTDIRS = ${DIRS}
-
diff -r f00e1be34737 -r b358a8133947 mk/lib.mk
--- a/mk/lib.mk Sun May 20 21:26:05 2007 -0400
+++ b/mk/lib.mk Mon Apr 16 14:06:32 2007 -0400
@@ -20,5 +20,6 @@ printinstall:
 ${LIB}: ${OFILES}
         @echo AR $@
         @${AR} $@ ${OFILES}
+ @${RANLIB} $@
 
 include ${ROOT}/mk/common.mk
diff -r f00e1be34737 -r b358a8133947 rc/wmiirc.sh
--- a/rc/wmiirc.sh Sun May 20 21:26:05 2007 -0400
+++ b/rc/wmiirc.sh Mon Apr 16 14:06:32 2007 -0400
@@ -13,7 +13,7 @@ WMII_FOCUSCOLORS='#ffffff #153F1F #2A7F3
 WMII_FOCUSCOLORS='#ffffff #153F1F #2A7F3F'
 
 WMII_BACKGROUND='#333333'
-WMII_FONT='-*-fixed-medium-r-*-*-13-*-*-*-*-*-*-*'
+WMII_FONT='-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*'
 
 set -- $(echo $WMII_NORMCOLORS $WMII_FOCUSCOLORS)
 WMII_MENU="dmenu -b -fn $WMII_FONT -nf $1 -nb $2 -sf $4 -sb $5"
@@ -39,8 +39,7 @@ status() {
 }
 
 # Event processing
-# Processed later by `wmiiloop' and evaled.
-# Duplicate the eval line and replace 'eval' with 'echo' for details.
+# processed later by `wmiiloop' and evaled
 eventstuff() {
         cat <<'!'
         # Events
@@ -94,9 +93,11 @@ eventstuff() {
                         esac
                         menulast=${do:-"$menulast"}
                 esac
+!
+ cat <<!
         # Key Bindings
         Key $MODKEY-Control-t
- case $(wmiir read /keys | wc -l | tr -d ' \t\n') in
+ case \$(wmiir read /keys | wc -l | tr -d ' \t\n') in
                 0|1)
                         echo -n \$Keys | tr ' ' '\012' | wmiir write /keys
                         wmiir xwrite /ctl grabmod $MODKEY;;
@@ -104,6 +105,14 @@ eventstuff() {
                         wmiir xwrite /keys $MODKEY-Control-t
                         wmiir xwrite /ctl grabmod Mod3;;
                 esac
+ Key $MODKEY-$LEFT
+ wmiir xwrite /tag/sel/ctl select left
+ Key $MODKEY-$RIGHT
+ wmiir xwrite /tag/sel/ctl select right
+ Key $MODKEY-$DOWN
+ wmiir xwrite /tag/sel/ctl select down
+ Key $MODKEY-$UP
+ wmiir xwrite /tag/sel/ctl select up
         Key $MODKEY-space
                 wmiir xwrite /tag/sel/ctl select toggle
         Key $MODKEY-d
@@ -113,27 +122,13 @@ eventstuff() {
         Key $MODKEY-m
                 wmiir xwrite /tag/sel/ctl colmode sel max
         Key $MODKEY-a
- Action $(actionlist | $WMII_MENU) &
+ Action \$(actionlist | \$WMII_MENU) &
         Key $MODKEY-p
- sh -c "$($WMII_MENU <$progsfile)" &
+ sh -c "\$(\$WMII_MENU <\$progsfile)" &
         Key $MODKEY-t
- wmiir xwrite /ctl "view $(tagsmenu)" &
+ wmiir xwrite /ctl "view \$(tagsmenu)" &
         Key $MODKEY-Return
                 $WMII_TERM &
- Key $MODKEY-Shift-space
- wmiir xwrite /tag/sel/ctl send sel toggle
- Key $MODKEY-Shift-c
- wmiir xwrite /client/sel/ctl kill
- Key $MODKEY-Shift-t
- wmiir xwrite "/client/$(wmiir read /client/sel/ctl)/tags" "$(tagsmenu)" &
- Key $MODKEY-$LEFT
- wmiir xwrite /tag/sel/ctl select left
- Key $MODKEY-$RIGHT
- wmiir xwrite /tag/sel/ctl select right
- Key $MODKEY-$DOWN
- wmiir xwrite /tag/sel/ctl select down
- Key $MODKEY-$UP
- wmiir xwrite /tag/sel/ctl select up
         Key $MODKEY-Shift-$LEFT
                 wmiir xwrite /tag/sel/ctl send sel left
         Key $MODKEY-Shift-$RIGHT
@@ -142,6 +137,12 @@ eventstuff() {
                 wmiir xwrite /tag/sel/ctl send sel down
         Key $MODKEY-Shift-$UP
                 wmiir xwrite /tag/sel/ctl send sel up
+ Key $MODKEY-Shift-space
+ wmiir xwrite /tag/sel/ctl send sel toggle
+ Key $MODKEY-Shift-c
+ wmiir xwrite /client/sel/ctl kill
+ Key $MODKEY-Shift-t
+ wmiir xwrite "/client/\$(wmiir read /client/sel/ctl)/tags" "\$(tagsmenu)" &
 !
         for i in 0 1 2 3 4 5 6 7 8 9; do
                 cat <<!
@@ -163,7 +164,11 @@ EOF
 EOF
 
 # Feed events to `wmiiloop' for processing
-eval "$(eventstuff | sed 's/^[ ]//' | wmiiloop)"
+IFS=''
+regex=''
+for i in MODKEY LEFT RIGHT UP DOWN; do regex="$regex""s|\\\$$i|`eval echo '$'$i`|g;"; done
+eval $(eventstuff | sed "$regex""s/^[ ]//" | wmiiloop)
+unset IFS
 
 # Functions
 Action() {
@@ -192,11 +197,11 @@ export WMII_FOCUSCOLORS WMII_SELCOLORS W
 export WMII_FOCUSCOLORS WMII_SELCOLORS WMII_NORMCOLORS
 
 # Setup Tag Bar
-seltag="$(wmiir read /tag/sel/ctl 2>/dev/null)"
 wmiir ls /lbar |
 while read bar; do
         wmiir remove "/lbar/$bar"
 done
+seltag="$(wmiir read /tag/sel/ctl 2>/dev/null)"
 wmiir ls /tag | sed -e 's|/||; /^sel$/d' |
 while read tag; do
         if [ "X$tag" = "X$seltag" ]; then
Received on Fri Jun 01 2007 - 03:09:11 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 15:57:13 UTC