t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit a05beb6585713aeb661cf30c080e77fbfdb28867
   DIR parent 48b6e9a3968e54a87f022c8e68b5bec5423cb75f
   URI Author: Anselm R. Garbe <garbeam@wmii.de>
       Date:   Tue, 11 Jul 2006 22:49:09 +0200
       
       made code more readable
       
       Diffstat:
         M client.c                            |      50 +++++++++++++++++++-------------
         M event.c                             |      20 ++++++--------------
         M kb.c                                |       2 +-
         M mouse.c                             |      52 +++++++++++++++----------------
         M wm.h                                |      13 +++++--------
       
       5 files changed, 67 insertions(+), 70 deletions(-)
       ---
   DIR diff --git a/client.c b/client.c
       t@@ -44,6 +44,24 @@ update_name(Client *c)
        }
        
        void
       +update_size(Client *c)
       +{
       +        XSizeHints size;
       +        long msize;
       +        if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
       +                size.flags = PSize;
       +        c->flags = size.flags;
       +        c->basew = size.base_width;
       +        c->baseh = size.base_height;
       +        c->incw = size.width_inc;
       +        c->inch = size.height_inc;
       +        c->maxw = size.max_width;
       +        c->maxh = size.max_height;
       +        c->minw = size.min_width;
       +        c->minh = size.min_height;
       +}
       +
       +void
        focus(Client *c)
        {
                Client **l;
       t@@ -62,31 +80,24 @@ manage(Window w, XWindowAttributes *wa)
        {
                Client *c, **l;
                XSetWindowAttributes twa;
       -        long msize;
        
                c = emallocz(sizeof(Client));
                c->win = w;
       -        c->r[RFloat].x = wa->x;
       -        c->r[RFloat].y = wa->y;
       -        c->r[RFloat].width = wa->width;
       -        c->r[RFloat].height = wa->height;
       +        c->x = wa->x;
       +        c->y = wa->y;
       +        c->w = wa->width;
       +        c->h = wa->height;
       +        update_size(c);
                XSetWindowBorderWidth(dpy, c->win, 1);
                XSelectInput(dpy, c->win, CLIENT_MASK);
                XGetTransientForHint(dpy, c->win, &c->trans);
       -        if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize) || !c->size.flags)
       -                c->size.flags = PSize;
       -        c->fixedsize =
       -                (c->size.flags & PMinSize && c->size.flags & PMaxSize
       -                 && c->size.min_width == c->size.max_width
       -                 && c->size.min_height == c->size.max_height);
                update_name(c);
                twa.override_redirect = 1;
                twa.background_pixmap = ParentRelative;
                twa.event_mask = ExposureMask;
        
       -        c->title = XCreateWindow(dpy, root, c->r[RFloat].x, c->r[RFloat].y,
       -                        c->r[RFloat].width, barrect.height, 0,
       -                        DefaultDepth(dpy, screen), CopyFromParent,
       +        c->title = XCreateWindow(dpy, root, c->x, c->y, c->w, barrect.height,
       +                        0, DefaultDepth(dpy, screen), CopyFromParent,
                                DefaultVisual(dpy, screen),
                                CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
        
       t@@ -110,15 +121,14 @@ resize(Client *c)
        {
                XConfigureEvent e;
        
       -        XMoveResizeWindow(dpy, c->win, c->r[RFloat].x, c->r[RFloat].y,
       -                        c->r[RFloat].width, c->r[RFloat].height);
       +        XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
                e.type = ConfigureNotify;
                e.event = c->win;
                e.window = c->win;
       -        e.x = c->r[RFloat].x;
       -        e.y = c->r[RFloat].y;
       -        e.width = c->r[RFloat].width;
       -        e.height = c->r[RFloat].height;
       +        e.x = c->x;
       +        e.y = c->y;
       +        e.width = c->w;
       +        e.height = c->h;
                e.border_width = 0;
                e.above = None;
                e.override_redirect = False;
   DIR diff --git a/event.c b/event.c
       t@@ -79,13 +79,13 @@ configurerequest(XEvent *e)
                ev->value_mask &= ~CWSibling;
                if((c = getclient(ev->window))) {
                        if(ev->value_mask & CWX)
       -                        c->r[RFloat].x = ev->x;
       +                        c->x = ev->x;
                        if(ev->value_mask & CWY)
       -                        c->r[RFloat].y = ev->y;
       +                        c->y = ev->y;
                        if(ev->value_mask & CWWidth)
       -                        c->r[RFloat].width = ev->width;
       +                        c->w = ev->width;
                        if(ev->value_mask & CWHeight)
       -                        c->r[RFloat].height = ev->height;
       +                        c->h = ev->height;
                }
        
                wc.x = ev->x;
       t@@ -179,7 +179,6 @@ static void
        propertynotify(XEvent *e)
        {
                XPropertyEvent *ev = &e->xproperty;
       -        long msize;
                Client *c;
        
                if(ev->state == PropertyDelete)
       t@@ -195,16 +194,9 @@ propertynotify(XEvent *e)
                                case XA_WM_TRANSIENT_FOR:
                                        XGetTransientForHint(dpy, c->win, &c->trans);
                                        break;
       +                                update_size(c);
                                case XA_WM_NORMAL_HINTS:
       -                                if(!XGetWMNormalHints(dpy, c->win, &c->size, &msize)
       -                                                || !c->size.flags)
       -                                        c->size.flags = PSize;
       -                                if(c->size.flags & PMinSize && c->size.flags & PMaxSize
       -                                                && c->size.min_width == c->size.max_width
       -                                                && c->size.min_height == c->size.max_height)
       -                                        c->fixedsize = True;
       -                                else
       -                                        c->fixedsize = False;
       +                                update_size(c);
                                        break;
                        }
                        if(ev->atom == XA_WM_NAME || ev->atom == net_atom[NetWMName]) {
   DIR diff --git a/kb.c b/kb.c
       t@@ -8,7 +8,7 @@
        #include <X11/keysym.h>
        
        static const char *term[] = { 
       -        "xterm", "-u8", "-bg", "black", "-fg", "white", "-fn",
       +        "xterm", "-bg", "black", "-fg", "white", "-fn",
                "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", 0 
        };
        
   DIR diff --git a/mouse.c b/mouse.c
       t@@ -16,22 +16,22 @@
        static void
        mmatch(Client *c, int x1, int y1, int x2, int y2)
        {
       -        c->r[RFloat].width = abs(x1 - x2);
       -        c->r[RFloat].height = abs(y1 - y2);
       -        c->r[RFloat].width -=
       -                (c->r[RFloat].width - c->size.base_width) % c->size.width_inc;
       -        c->r[RFloat].height -=
       -                (c->r[RFloat].height - c->size.base_height) % c->size.height_inc;
       -        if(c->size.min_width && c->r[RFloat].width < c->size.min_width)
       -                c->r[RFloat].width = c->size.min_width;
       -        if(c->size.min_height && c->r[RFloat].height < c->size.min_height)
       -                c->r[RFloat].height = c->size.min_height;
       -        if(c->size.max_width && c->r[RFloat].width > c->size.max_width)
       -                c->r[RFloat].width = c->size.max_width;
       -        if(c->size.max_height && c->r[RFloat].height > c->size.max_height)
       -                c->r[RFloat].height = c->size.max_height;
       -        c->r[RFloat].x = (x1 <= x2) ? x1 : x1 - c->r[RFloat].width;
       -        c->r[RFloat].y = (y1 <= y2) ? y1 : y1 - c->r[RFloat].height;
       +        c->w = abs(x1 - x2);
       +        c->h = abs(y1 - y2);
       +        if(c->incw)
       +                c->w -= (c->w - c->basew) % c->incw;
       +        if(c->inch)
       +                c->h -= (c->h - c->baseh) % c->inch;
       +        if(c->minw && c->w < c->minw)
       +                c->w = c->minw;
       +        if(c->minh && c->h < c->minh)
       +                c->h = c->minh;
       +        if(c->maxw && c->w > c->maxw)
       +                c->w = c->maxw;
       +        if(c->maxh && c->h > c->maxh)
       +                c->h = c->maxh;
       +        c->x = (x1 <= x2) ? x1 : x1 - c->w;
       +        c->y = (y1 <= y2) ? y1 : y1 - c->h;
        }
        
        void
       t@@ -40,14 +40,13 @@ mresize(Client *c)
                XEvent ev;
                int old_cx, old_cy;
        
       -        old_cx = c->r[RFloat].x;
       -        old_cy = c->r[RFloat].y;
       +        old_cx = c->x;
       +        old_cy = c->y;
                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->r[RFloat].width, c->r[RFloat].height);
       +        XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
                for(;;) {
                        XMaskEvent(dpy, MouseMask, &ev);
                        switch(ev.type) {
       t@@ -55,7 +54,7 @@ mresize(Client *c)
                        case MotionNotify:
                                XUngrabServer(dpy);
                                mmatch(c, old_cx, old_cy, ev.xmotion.x, ev.xmotion.y);
       -                        XResizeWindow(dpy, c->win, c->r[RFloat].width, c->r[RFloat].height);
       +                        XResizeWindow(dpy, c->win, c->w, c->h);
                                XGrabServer(dpy);
                                break;
                        case ButtonRelease:
       t@@ -75,8 +74,8 @@ mmove(Client *c)
                unsigned int dui;
                Window dummy;
        
       -        old_cx = c->r[RFloat].x;
       -        old_cy = c->r[RFloat].y;
       +        old_cx = c->x;
       +        old_cy = c->y;
                if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
                                        None, cursor[CurMove], CurrentTime) != GrabSuccess)
                        return;
       t@@ -88,10 +87,9 @@ mmove(Client *c)
                        default: break;
                        case MotionNotify:
                                XUngrabServer(dpy);
       -                        c->r[RFloat].x = old_cx + (ev.xmotion.x - x1);
       -                        c->r[RFloat].y = old_cy + (ev.xmotion.y - y1);
       -                        XMoveResizeWindow(dpy, c->win, c->r[RFloat].x, c->r[RFloat].y,
       -                                        c->r[RFloat].width, c->r[RFloat].height);
       +                        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:
   DIR diff --git a/wm.h b/wm.h
       t@@ -21,19 +21,15 @@ enum { NetSupported, NetWMName, NetLast };
        /* cursor */
        enum { CurNormal, CurResize, CurMove, CurInput, CurLast };
        
       -/* rects */
       -enum { RFloat, RGrid, RLast };
       -
        struct Client {
       -        char name[256];
       -        char tag[256];
       +        char name[256], tag[256];
                int proto;
       -        Bool fixedsize;
       +        int x, y, w, h;
       +        int basew, baseh, incw, inch, maxw, maxh, minw, minh;
       +        long flags; 
                Window win;
                Window trans;
                Window title;
       -        XSizeHints size;
       -        XRectangle r[RLast];
                Client *next;
                Client *snext;
        };
       t@@ -75,6 +71,7 @@ extern void focus(Client *c);
        extern void update_name(Client *c);
        extern void draw_client(Client *c);
        extern void resize(Client *c);
       +extern void update_size(Client *c);
        
        /* event.c */
        extern unsigned int discard_events(long even_mask);