t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit dfd84f9bf3b9d949412a73bc62a43109b340d395
   DIR parent 7696c89c90c926f6371b1ee3ec1b13dd2414aa40
   URI Author: Anselm R. Garbe <garbeam@wmii.de>
       Date:   Wed, 12 Jul 2006 15:17:22 +0200
       
       simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
       
       Diffstat:
         M bar.c                               |      17 ++++++++---------
         M client.c                            |      64 ++++++++++++++++++++-----------
         M cmd.c                               |      12 +++++++-----
         M config.h                            |       8 ++++----
         M draw.c                              |      45 ++++++++++++++++---------------
         M draw.h                              |       8 ++++----
         M event.c                             |      17 ++++++-----------
         D font.c                              |      81 ------------------------------
         M menu.c                              |      97 +++++++++++++++----------------
         M mouse.c                             |      20 ++++++++++----------
         M wm.c                                |      23 ++++++++++-------------
         M wm.h                                |       7 ++++---
       
       12 files changed, 164 insertions(+), 235 deletions(-)
       ---
   DIR diff --git a/bar.c b/bar.c
       t@@ -8,23 +8,22 @@
        void
        draw_bar()
        {
       -        brush.rect = barrect;
       -        brush.rect.x = brush.rect.y = 0;
       +        brush.x = brush.y = 0;
       +        brush.w = bw;
       +        brush.h = bh;
                draw(dpy, &brush, False, NULL);
        
                if(stack) {
       -                brush.rect.width = textwidth(&brush.font, stack->name) + labelheight(&brush.font);
       +                brush.w = textw(&brush.font, stack->name) + bh;
                        swap((void **)&brush.fg, (void **)&brush.bg);
                        draw(dpy, &brush, True, stack->name);
                        swap((void **)&brush.fg, (void **)&brush.bg);
       -                brush.rect.x += brush.rect.width;
       +                brush.x += brush.w;
                }
        
       -        brush.rect.width = textwidth(&brush.font, statustext) + labelheight(&brush.font);
       -        brush.rect.x = barrect.x + barrect.width - brush.rect.width;
       +        brush.w = textw(&brush.font, statustext) + bh;
       +        brush.x = bx + bw - brush.w;
                draw(dpy, &brush, False, statustext);
       -
       -        XCopyArea(dpy, brush.drawable, barwin, brush.gc, 0, 0, barrect.width,
       -                        barrect.height, 0, 0);
       +        XCopyArea(dpy, brush.drawable, barwin, brush.gc, 0, 0, bw, bh, 0, 0);
                XFlush(dpy);
        }
   DIR diff --git a/client.c b/client.c
       t@@ -10,7 +10,16 @@
        #include "util.h"
        #include "wm.h"
        
       -#define CLIENT_MASK                (StructureNotifyMask | PropertyChangeMask | EnterWindowMask)
       +static void
       +resize_title(Client *c)
       +{
       +        c->tw = textw(&brush.font, c->name) + bh;
       +        if(c->tw > c->w)
       +                c->tw = c->w + 2;
       +        c->tx = c->x + c->w - c->tw + 2;
       +        c->ty = c->y;
       +        XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
       +}
        
        void
        update_name(Client *c)
       t@@ -37,6 +46,7 @@ update_name(Client *c)
                        }
                }
                XFree(name.value);
       +        resize_title(c);
        }
        
        void
       t@@ -74,26 +84,37 @@ update_size(Client *c)
        }
        
        void
       +raise(Client *c)
       +{
       +        XRaiseWindow(dpy, c->win);
       +        XRaiseWindow(dpy, c->title);
       +}
       +
       +void
       +lower(Client *c)
       +{
       +        XLowerWindow(dpy, c->title);
       +        XLowerWindow(dpy, c->win);
       +}
       +
       +void
        focus(Client *c)
        {
                Client **l, *old;
        
                old = stack;
       -        for(l=&stack; *l && *l != c; l=&(*l)->snext);
       +        for(l = &stack; *l && *l != c; l = &(*l)->snext);
                eassert(*l == c);
                *l = c->snext;
                c->snext = stack;
                stack = c;
       -        XRaiseWindow(dpy, c->win);
       -        XRaiseWindow(dpy, c->title);
       -        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
                if(old && old != c) {
                        XMapWindow(dpy, old->title);
                        draw_client(old);
                }
                XUnmapWindow(dpy, c->title);
       -        draw_bar();
       -        discard_events(EnterWindowMask);
       +        draw_client(old);
       +        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
                XFlush(dpy);
        }
        
       t@@ -107,13 +128,16 @@ manage(Window w, XWindowAttributes *wa)
                c->win = w;
                c->tx = c->x = wa->x;
                c->ty = c->y = wa->y;
       +        if(c->y < bh)
       +                c->ty = c->y += bh;
                c->tw = c->w = wa->width;
                c->h = wa->height;
       -        c->th = barrect.height;
       +        c->th = bh;
                update_size(c);
                XSetWindowBorderWidth(dpy, c->win, 1);
                XSetWindowBorder(dpy, c->win, brush.border);
       -        XSelectInput(dpy, c->win, CLIENT_MASK);
       +        XSelectInput(dpy, c->win,
       +                        StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
                XGetTransientForHint(dpy, c->win, &c->trans);
                twa.override_redirect = 1;
                twa.background_pixmap = ParentRelative;
       t@@ -130,8 +154,8 @@ manage(Window w, XWindowAttributes *wa)
                *l = c;
                c->snext = stack;
                stack = c;
       -        XMapWindow(dpy, c->win);
       -        XMapWindow(dpy, c->title);
       +        XMapRaised(dpy, c->win);
       +        XMapRaised(dpy, c->title);
                XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask,
                                GrabModeAsync, GrabModeSync, None, None);
                XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,
       t@@ -147,6 +171,7 @@ resize(Client *c)
        {
                XConfigureEvent e;
        
       +        resize_title(c);
                XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
                e.type = ConfigureNotify;
                e.event = c->win;
       t@@ -158,9 +183,7 @@ resize(Client *c)
                e.border_width = 0;
                e.above = None;
                e.override_redirect = False;
       -        XSelectInput(dpy, c->win, CLIENT_MASK & ~StructureNotifyMask);
                XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
       -        XSelectInput(dpy, c->win, CLIENT_MASK);
                XFlush(dpy);
        }
        
       t@@ -219,17 +242,14 @@ getclient(Window w)
        void
        draw_client(Client *c)
        {
       -        if(c == stack)
       +        if(c == stack) {
                        draw_bar();
       +                return;
       +        }
        
       -        c->tw = textwidth(&brush.font, c->name) + labelheight(&brush.font);
       -        c->tx = c->x + c->w - c->tw + 2;
       -        c->ty = c->y;
       -        XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
       -
       -        brush.rect.x = brush.rect.y = 0;
       -        brush.rect.width = c->tw;
       -        brush.rect.height = c->th;
       +        brush.x = brush.y = 0;
       +        brush.w = c->tw;
       +        brush.h = c->th;
        
                draw(dpy, &brush, True, c->name);
                XCopyArea(dpy, brush.drawable, c->title, brush.gc,
   DIR diff --git a/cmd.c b/cmd.c
       t@@ -23,16 +23,18 @@ void
        sel(void *aux)
        {
                const char *arg = aux;
       -        Client *c;
       +        Client *c = NULL;
        
                if(!arg || !stack)
                        return;
                if(!strncmp(arg, "next", 5))
       -                focus(stack->snext ? stack->snext : stack);
       -        else if(!strncmp(arg, "prev", 5)) {
       +                c = stack->snext ? stack->snext : stack;
       +        else if(!strncmp(arg, "prev", 5))
                        for(c = stack; c && c->snext; c = c->snext);
       -                focus(c ? c : stack);
       -        }
       +        if(!c)
       +                c = stack;
       +        raise(c);
       +        focus(c);
        }
        
        void
   DIR diff --git a/config.h b/config.h
       t@@ -4,7 +4,7 @@
         */
        
        #define FONT                "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
       -#define BGCOLOR                "#0c0c33"
       -#define FGCOLOR                "#b2c8cd"
       -#define BORDERCOLOR        "#3030c0"
       -#define STATUSDELAY        10 /* milliseconds */
       +#define BGCOLOR                "#666699"
       +#define FGCOLOR                "#ffffff"
       +#define BORDERCOLOR        "#9999CC"
       +#define STATUSDELAY        10 /* seconds */
   DIR diff --git a/draw.c b/draw.c
       t@@ -15,16 +15,16 @@ drawborder(Display *dpy, Brush *b)
                XPoint points[5];
                XSetLineAttributes(dpy, b->gc, 1, LineSolid, CapButt, JoinMiter);
                XSetForeground(dpy, b->gc, b->border);
       -        points[0].x = b->rect.x;
       -        points[0].y = b->rect.y;
       -        points[1].x = b->rect.width - 1;
       +        points[0].x = b->x;
       +        points[0].y = b->y;
       +        points[1].x = b->w - 1;
                points[1].y = 0;
                points[2].x = 0;
       -        points[2].y = b->rect.height - 1;
       -        points[3].x = -(b->rect.width - 1);
       +        points[2].y = b->h - 1;
       +        points[3].x = -(b->w - 1);
                points[3].y = 0;
                points[4].x = 0;
       -        points[4].y = -(b->rect.height - 1);
       +        points[4].y = -(b->h - 1);
                XDrawLines(dpy, b->drawable, b->gc, points, 5, CoordModePrevious);
        }
        
       t@@ -34,9 +34,10 @@ draw(Display *dpy, Brush *b, Bool border, const char *text)
                unsigned int x, y, w, h, len;
                static char buf[256];
                XGCValues gcv;
       +        XRectangle r = { b->x, b->y, b->w, b->h };
        
                XSetForeground(dpy, b->gc, b->bg);
       -        XFillRectangles(dpy, b->drawable, b->gc, &b->rect, 1);
       +        XFillRectangles(dpy, b->drawable, b->gc, &r, 1);
        
                if(border)
                        drawborder(dpy, b);
       t@@ -51,14 +52,14 @@ draw(Display *dpy, Brush *b, Bool border, const char *text)
                buf[len] = 0;
        
                h = b->font.ascent + b->font.descent;
       -        y = b->rect.y + (b->rect.height / 2) - (h / 2) + b->font.ascent;
       -        x = b->rect.x + (h / 2);
       +        y = b->y + (b->h / 2) - (h / 2) + b->font.ascent;
       +        x = b->x + (h / 2);
        
                /* shorten text if necessary */
       -        while(len && (w = textwidth_l(&b->font, buf, len)) > b->rect.width - h)
       +        while(len && (w = textnw(&b->font, buf, len)) > b->w - h)
                        buf[--len] = 0;
        
       -        if(w > b->rect.width)
       +        if(w > b->w)
                        return; /* too long */
        
                gcv.foreground = b->fg;
       t@@ -94,20 +95,26 @@ loadcolors(Display *dpy, int screen, Brush *b,
        }
        
        unsigned int
       -textwidth_l(Fnt *font, char *text, unsigned int len)
       +textnw(Fnt *font, char *text, unsigned int len)
        {
       +        XRectangle r;
                if(font->set) {
       -                XRectangle r;
       -                XmbTextExtents(font->set, text, len, 0, &r);
       +                XmbTextExtents(font->set, text, len, NULL, &r);
                        return r.width;
                }
                return XTextWidth(font->xfont, text, len);
        }
        
        unsigned int
       -textwidth(Fnt *font, char *text)
       +textw(Fnt *font, char *text)
        {
       -        return textwidth_l(font, text, strlen(text));
       +        return textnw(font, text, strlen(text));
       +}
       +
       +unsigned int
       +texth(Fnt *font)
       +{
       +        return font->height + 4;
        }
        
        void
       t@@ -162,9 +169,3 @@ loadfont(Display *dpy, Fnt *font, const char *fontstr)
                }
                font->height = font->ascent + font->descent;
        }
       -
       -unsigned int
       -labelheight(Fnt *font)
       -{
       -        return font->height + 4;
       -}
   DIR diff --git a/draw.h b/draw.h
       t@@ -20,7 +20,7 @@ struct Fnt {
        struct Brush {
                GC gc;
                Drawable drawable;
       -        XRectangle rect;
       +        int x, y, w, h;
                Fnt font;
                unsigned long bg;
                unsigned long fg;
       t@@ -31,6 +31,6 @@ extern void draw(Display *dpy, Brush *b, Bool border, const char *text);
        extern void loadcolors(Display *dpy, int screen, Brush *b,
                        const char *bg, const char *fg, const char *bo);
        extern void loadfont(Display *dpy, Fnt *font, const char *fontstr);
       -extern unsigned int textwidth_l(Fnt *font, char *text, unsigned int len);
       -extern unsigned int textwidth(Fnt *font, char *text);
       -extern unsigned int labelheight(Fnt *font);
       +extern unsigned int textnw(Fnt *font, char *text, unsigned int len);
       +extern unsigned int textw(Fnt *font, char *text);
       +extern unsigned int texth(Fnt *font);
   DIR diff --git a/event.c b/event.c
       t@@ -37,13 +37,11 @@ void (*handler[LASTEvent]) (XEvent *) = {
                [UnmapNotify] = unmapnotify
        };
        
       -unsigned int
       +void
        discard_events(long even_mask)
        {
                XEvent ev;
       -        unsigned int n = 0;
       -        while(XCheckMaskEvent(dpy, even_mask, &ev)) n++;
       -        return n;
       +        while(XCheckMaskEvent(dpy, even_mask, &ev));
        }
        
        static void
       t@@ -53,6 +51,7 @@ buttonpress(XEvent *e)
                Client *c;
        
                if((c = getclient(ev->window))) {
       +                raise(c);
                        switch(ev->button) {
                        default:
                                break;
       t@@ -60,7 +59,7 @@ buttonpress(XEvent *e)
                                mmove(c);
                                break;
                        case Button2:
       -                        XLowerWindow(dpy, c->win);
       +                        lower(c);
                                break;
                        case Button3:
                                mresize(c);
       t@@ -122,10 +121,8 @@ enternotify(XEvent *e)
        
                if((c = getclient(ev->window)))
                        focus(c);
       -        else if(ev->window == root) {
       +        else if(ev->window == root)
                        sel_screen = True;
       -                /*draw_frames();*/
       -        }
        }
        
        static void
       t@@ -133,10 +130,8 @@ leavenotify(XEvent *e)
        {
                XCrossingEvent *ev = &e->xcrossing;
        
       -        if((ev->window == root) && !ev->same_screen) {
       +        if((ev->window == root) && !ev->same_screen)
                        sel_screen = True;
       -                /*draw_frames();*/
       -        }
        }
        
        static void
   DIR diff --git a/font.c b/font.c
       t@@ -1,81 +0,0 @@
       -/*
       - * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
       - * See LICENSE file for license details.
       - */
       -
       -#include <stdio.h>
       -#include <stdlib.h>
       -#include <string.h>
       -#include <locale.h>
       -
       -unsigned int
       -textwidth_l(BlitzFont *font, char *text, unsigned int len)
       -{
       -        if(font->set) {
       -                XRectangle r;
       -                XmbTextExtents(font->set, text, len, nil, &r);
       -                return r.width;
       -        }
       -        return XTextWidth(font->xfont, text, len);
       -}
       -
       -unsigned int
       -textwidth(BlitzFont *font, char *text)
       -{
       -        return blitz_textwidth_l(font, text, strlen(text));
       -}
       -
       -void
       -loadfont(Blitz *blitz, BlitzFont *font)
       -{
       -        char *fontname = font->fontstr;
       -        char **missing = nil, *def = "?";
       -        int n;
       -
       -        setlocale(LC_ALL, "");
       -        if(font->set)
       -                XFreeFontSet(blitz->dpy, font->set);
       -        font->set = XCreateFontSet(blitz->dpy, fontname, &missing, &n, &def);
       -        if(missing) {
       -                while(n--)
       -                        fprintf(stderr, "missing fontset: %s\n", missing[n]);
       -                XFreeStringList(missing);
       -                if(font->set) {
       -                        XFreeFontSet(blitz->dpy, font->set);
       -                        font->set = nil;
       -                }
       -        }
       -        if(font->set) {
       -                XFontSetExtents *font_extents;
       -                XFontStruct **xfonts;
       -                char **font_names;
       -                unsigned int i;
       -
       -                font->ascent = font->descent = 0;
       -                font_extents = XExtentsOfFontSet(font->set);
       -                n = XFontsOfFontSet(font->set, &xfonts, &font_names);
       -                for(i = 0, font->ascent = 0, font->descent = 0; i < n; i++) {
       -                        if(font->ascent < (*xfonts)->ascent)
       -                                font->ascent = (*xfonts)->ascent;
       -                        if(font->descent < (*xfonts)->descent)
       -                                font->descent = (*xfonts)->descent;
       -                        xfonts++;
       -                }
       -        }
       -        else {
       -                if(font->xfont)
       -                        XFreeFont(blitz->dpy, font->xfont);
       -                font->xfont = nil;
       -                font->xfont = XLoadQueryFont(blitz->dpy, fontname);
       -                if (!font->xfont) {
       -                        fontname = "fixed";
       -                        font->xfont = XLoadQueryFont(blitz->dpy, fontname);
       -                }
       -                if (!font->xfont) {
       -                        fprintf(stderr, "%s", "error, cannot load 'fixed' font\n");
       -                        exit(1);
       -                }
       -                font->ascent = font->xfont->ascent;
       -                font->descent = font->xfont->descent;
       -        }
       -}
   DIR diff --git a/menu.c b/menu.c
       t@@ -31,7 +31,6 @@ struct Item {
        static Display *dpy;
        static Window root;
        static Window win;
       -static XRectangle rect;
        static Bool done = False;
        
        static Item *allitem = NULL;        /* first of all items */
       t@@ -41,14 +40,14 @@ static Item *nextoff = NULL;
        static Item *prevoff = NULL;
        static Item *curroff = NULL;
        
       -static int screen;
       +static int screen, mx, my, mw, mh;
        static char *title = NULL;
        static char text[4096];
        static int ret = 0;
        static int nitem = 0;
        static unsigned int cmdw = 0;
       -static unsigned int twidth = 0;
       -static unsigned int cwidth = 0;
       +static unsigned int tw = 0;
       +static unsigned int cw = 0;
        static const int seek = 30;                /* 30px */
        
        static Brush brush = {0};
       t@@ -74,21 +73,21 @@ update_offsets()
                        return;
        
                for(nextoff = curroff; nextoff; nextoff=nextoff->right) {
       -                tw = textwidth(&brush.font, nextoff->text);
       -                if(tw > rect.width / 3)
       -                        tw = rect.width / 3;
       +                tw = textw(&brush.font, nextoff->text);
       +                if(tw > mw / 3)
       +                        tw = mw / 3;
                        w += tw + brush.font.height;
       -                if(w > rect.width)
       +                if(w > mw)
                                break;
                }
        
                w = cmdw + 2 * seek;
                for(prevoff = curroff; prevoff && prevoff->left; prevoff=prevoff->left) {
       -                tw = textwidth(&brush.font, prevoff->left->text);
       -                if(tw > rect.width / 3)
       -                        tw = rect.width / 3;
       +                tw = textw(&brush.font, prevoff->left->text);
       +                if(tw > mw / 3)
       +                        tw = mw / 3;
                        w += tw + brush.font.height;
       -                if(w > rect.width)
       +                if(w > mw)
                                break;
                }
        }
       t@@ -103,9 +102,9 @@ update_items(char *pattern)
                        return;
        
                if(!title || *pattern)
       -                cmdw = cwidth;
       +                cmdw = cw;
                else
       -                cmdw = twidth;
       +                cmdw = tw;
        
                item = j = NULL;
                nitem = 0;
       t@@ -143,42 +142,40 @@ update_items(char *pattern)
        static void
        draw_menu()
        {
       -        unsigned int offx = 0;
                Item *i;
        
       -        brush.rect = rect;
       -        brush.rect.x = 0;
       -        brush.rect.y = 0;
       +        brush.x = 0;
       +        brush.y = 0;
       +        brush.w = mw;
       +        brush.h = mh;
                draw(dpy, &brush, False, 0);
        
                /* print command */
                if(!title || text[0]) {
       -                cmdw = cwidth;
       +                cmdw = cw;
                        if(cmdw && item)
       -                        brush.rect.width = cmdw;
       +                        brush.w = cmdw;
                        draw(dpy, &brush, False, text);
                }
                else {
       -                cmdw = twidth;
       -                brush.rect.width = cmdw;
       +                cmdw = tw;
       +                brush.w = cmdw;
                        draw(dpy, &brush, False, title);
                }
       -        offx += brush.rect.width;
       +        brush.x += brush.w;
        
                if(curroff) {
       -                brush.rect.x = offx;
       -                brush.rect.width = seek;
       -                offx += brush.rect.width;
       +                brush.w = seek;
                        draw(dpy, &brush, False, (curroff && curroff->left) ? "<" : 0);
       +                brush.x += brush.w;
        
                        /* determine maximum items */
                        for(i = curroff; i != nextoff; i=i->right) {
                                brush.border = False;
       -                        brush.rect.x = offx;
       -                        brush.rect.width = textwidth(&brush.font, i->text);
       -                        if(brush.rect.width > rect.width / 3)
       -                                brush.rect.width = rect.width / 3;
       -                        brush.rect.width += brush.font.height;
       +                        brush.w = textw(&brush.font, i->text);
       +                        if(brush.w > mw / 3)
       +                                brush.w = mw / 3;
       +                        brush.w += brush.font.height;
                                if(sel == i) {
                                        swap((void **)&brush.fg, (void **)&brush.bg);
                                        draw(dpy, &brush, True, i->text);
       t@@ -186,15 +183,14 @@ draw_menu()
                                }
                                else
                                        draw(dpy, &brush, False, i->text);
       -                        offx += brush.rect.width;
       +                        brush.x += brush.w;
                        }
        
       -                brush.rect.x = rect.width - seek;
       -                brush.rect.width = seek;
       +                brush.x = mw - seek;
       +                brush.w = seek;
                        draw(dpy, &brush, False, nextoff ? ">" : 0);
                }
       -        XCopyArea(dpy, brush.drawable, win, brush.gc, 0, 0, rect.width,
       -                        rect.height, 0, 0);
       +        XCopyArea(dpy, brush.drawable, win, brush.gc, 0, 0, mw, mh, 0, 0);
                XFlush(dpy);
        }
        
       t@@ -399,36 +395,35 @@ main(int argc, char *argv[])
                wa.background_pixmap = ParentRelative;
                wa.event_mask = ExposureMask | ButtonPressMask | KeyPressMask;
        
       -        rect.width = DisplayWidth(dpy, screen);
       -        rect.height = labelheight(&brush.font);
       -        rect.y = DisplayHeight(dpy, screen) - rect.height;
       -        rect.x = 0;
       +        mx = my = 0;
       +        mw = DisplayWidth(dpy, screen);
       +        mh = texth(&brush.font);
        
       -        win = XCreateWindow(dpy, root, rect.x, rect.y,
       -                        rect.width, rect.height, 0, DefaultDepth(dpy, screen),
       -                        CopyFromParent, DefaultVisual(dpy, screen),
       +        win = XCreateWindow(dpy, root, mx, my, mw, mh, 0,
       +                        DefaultDepth(dpy, screen), CopyFromParent,
       +                        DefaultVisual(dpy, screen),
                                CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
                XDefineCursor(dpy, win, XCreateFontCursor(dpy, XC_xterm));
                XFlush(dpy);
        
                /* pixmap */
                brush.gc = XCreateGC(dpy, root, 0, 0);
       -        brush.drawable = XCreatePixmap(dpy, win, rect.width, rect.height,
       +        brush.drawable = XCreatePixmap(dpy, win, mw, mh,
                                DefaultDepth(dpy, screen));
                XFlush(dpy);
        
                if(maxname)
       -                cwidth = textwidth(&brush.font, maxname) + brush.font.height;
       -        if(cwidth > rect.width / 3)
       -                cwidth = rect.width / 3;
       +                cw = textw(&brush.font, maxname) + brush.font.height;
       +        if(cw > mw / 3)
       +                cw = mw / 3;
        
                if(title) {
       -                twidth = textwidth(&brush.font, title) + brush.font.height;
       -                if(twidth > rect.width / 3)
       -                        twidth = rect.width / 3;
       +                tw = textw(&brush.font, title) + brush.font.height;
       +                if(tw > mw / 3)
       +                        tw = mw / 3;
                }
        
       -        cmdw = title ? twidth : cwidth;
       +        cmdw = title ? tw : cw;
        
                text[0] = 0;
                update_items(text);
   DIR diff --git a/mouse.c b/mouse.c
       t@@ -45,21 +45,21 @@ mresize(Client *c)
                if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
                                        None, cursor[CurResize], CurrentTime) != GrabSuccess)
                        return;
       -        XGrabServer(dpy);
                XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
                for(;;) {
       -                XMaskEvent(dpy, MouseMask, &ev);
       +                XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
                        switch(ev.type) {
                        default: break;
       +                case Expose:
       +                        handler[Expose](&ev);
       +                        break;
                        case MotionNotify:
       -                        XUngrabServer(dpy);
       +                        XFlush(dpy);
                                mmatch(c, old_cx, old_cy, ev.xmotion.x, ev.xmotion.y);
                                XResizeWindow(dpy, c->win, c->w, c->h);
       -                        XGrabServer(dpy);
                                break;
                        case ButtonRelease:
                                resize(c);
       -                        XUngrabServer(dpy);
                                XUngrabPointer(dpy, CurrentTime);
                                return;
                        }
       t@@ -80,21 +80,21 @@ mmove(Client *c)
                                        None, cursor[CurMove], CurrentTime) != GrabSuccess)
                        return;
                XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
       -        XGrabServer(dpy);
                for(;;) {
       -                XMaskEvent(dpy, MouseMask, &ev);
       +                XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
                        switch (ev.type) {
                        default: break;
       +                case Expose:
       +                        handler[Expose](&ev);
       +                        break;
                        case MotionNotify:
       -                        XUngrabServer(dpy);
       +                        XFlush(dpy);
                                c->x = old_cx + (ev.xmotion.x - x1);
                                c->y = old_cy + (ev.xmotion.y - y1);
                                XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
       -                        XGrabServer(dpy);
                                break;
                        case ButtonRelease:
                                resize(c);
       -                        XUngrabServer(dpy);
                                XUngrabPointer(dpy, CurrentTime);
                                return;
                        }
   DIR diff --git a/wm.c b/wm.c
       t@@ -23,12 +23,11 @@ Display *dpy;
        Window root, barwin;
        Atom wm_atom[WMLast], net_atom[NetLast];
        Cursor cursor[CurLast];
       -XRectangle rect, barrect;
        Bool running = True;
        Bool sel_screen;
        
        char statustext[1024], tag[256];
       -int screen;
       +int screen, sx, sy, sw, sh, bx, by, bw, bh;
        
        Brush brush = {0};
        Client *clients = NULL;
       t@@ -39,7 +38,7 @@ static const char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. 
        static int (*x_error_handler) (Display *, XErrorEvent *);
        
        static const char *status[] = {
       -        "sh", "-c", "echo -n `date '+%Y/%m/%d %H:%M'`" 
       +        "sh", "-c", "echo -n `date '+%Y-%m-%d %H:%M'`" 
                " `uptime | sed 's/.*://; s/,//g'`"
                " `acpi | awk '{print $4}' | sed 's/,//'`", 0
        };
       t@@ -220,9 +219,9 @@ main(int argc, char *argv[])
                if(other_wm_running)
                        error("gridwm: another window manager is already running\n");
        
       -        rect.x = rect.y = 0;
       -        rect.width = DisplayWidth(dpy, screen);
       -        rect.height = DisplayHeight(dpy, screen);
       +        sx = sy = 0;
       +        sw = DisplayWidth(dpy, screen);
       +        sh = DisplayHeight(dpy, screen);
                sel_screen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
        
                XSetErrorHandler(0);
       t@@ -253,18 +252,16 @@ main(int argc, char *argv[])
                wa.background_pixmap = ParentRelative;
                wa.event_mask = ExposureMask;
        
       -        barrect = rect;
       -        barrect.height = labelheight(&brush.font);
       -        barrect.y = rect.height - barrect.height;
       -        barwin = XCreateWindow(dpy, root, barrect.x, barrect.y,
       -                        barrect.width, barrect.height, 0, DefaultDepth(dpy, screen),
       +        bx = by = 0;
       +        bw = sw;
       +        bh = texth(&brush.font);
       +        barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen),
                                CopyFromParent, DefaultVisual(dpy, screen),
                                CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
                XDefineCursor(dpy, barwin, cursor[CurNormal]);
                XMapRaised(dpy, barwin);
        
       -        brush.drawable = XCreatePixmap(dpy, root, rect.width, barrect.height,
       -                        DefaultDepth(dpy, screen));
       +        brush.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
                brush.gc = XCreateGC(dpy, root, 0, 0);
        
                pipe_spawn(statustext, sizeof(statustext), dpy, (char **)status);
   DIR diff --git a/wm.h b/wm.h
       t@@ -46,11 +46,10 @@ extern Display *dpy;
        extern Window root, barwin;
        extern Atom wm_atom[WMLast], net_atom[NetLast];
        extern Cursor cursor[CurLast];
       -extern XRectangle rect, barrect;
        extern Bool running, sel_screen, grid;
        extern void (*handler[LASTEvent]) (XEvent *);
        
       -extern int screen;
       +extern int screen, sx, sy, sw, sh, bx, by, bw, bh;
        extern char statustext[1024], tag[256];
        
        extern Brush brush;
       t@@ -75,9 +74,11 @@ extern void draw_client(Client *c);
        extern void resize(Client *c);
        extern void update_size(Client *c);
        extern Client *gettitle(Window w);
       +extern void raise(Client *c);
       +extern void lower(Client *c);
        
        /* event.c */
       -extern unsigned int discard_events(long even_mask);
       +extern void discard_events(long even_mask);
        
        /* key.c */
        extern void update_keys();