tproceeded with cleaning up, sorting functions, etc - dwm - [fork] customized build of dwm, the dynamic window manager
 (HTM) git clone git://src.adamsgaard.dk/dwm
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit adaa28a6e600f636f5e86244ccef69e98419ba1a
 (DIR) parent dba23062bad40afb1a90f60b6897cf9e1ca5035b
 (HTM) Author: Anselm R. Garbe <garbeam@wmii.de>
       Date:   Sat, 15 Jul 2006 17:00:56 +0200
       
       proceeded with cleaning up, sorting functions, etc
       
       Diffstat:
         M client.c                            |     411 ++++++++++++++++---------------
         M draw.c                              |     146 ++++++++++++++++---------------
         M dwm.h                               |      39 +++++++++++++++----------------
         M event.c                             |     266 +++++++++++++++----------------
         M main.c                              |      71 +++++++++++++------------------
         M tag.c                               |     118 +++++++++++++++++--------------
         M util.c                              |      24 +++++++++++++-----------
       
       7 files changed, 532 insertions(+), 543 deletions(-)
       ---
 (DIR) diff --git a/client.c b/client.c
       t@@ -2,21 +2,14 @@
         * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
         * See LICENSE file for license details.
         */
       +#include "dwm.h"
        
        #include <stdlib.h>
       -#include <stdio.h>
        #include <string.h>
        #include <X11/Xatom.h>
        #include <X11/Xutil.h>
        
       -#include "dwm.h"
       -
       -void
       -ban(Client *c)
       -{
       -        XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
       -        XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
       -}
       +/* static functions */
        
        static void
        resizetitle(Client *c)
       t@@ -35,70 +28,141 @@ resizetitle(Client *c)
                XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
        }
        
       +static int
       +xerrordummy(Display *dsply, XErrorEvent *ee)
       +{
       +        return 0;
       +}
       +
       +/* extern functions */
       +
        void
       -settitle(Client *c)
       +ban(Client *c)
        {
       -        XTextProperty name;
       -        int n;
       -        char **list = NULL;
       +        XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
       +        XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
       +}
        
       -        name.nitems = 0;
       -        c->name[0] = 0;
       -        XGetTextProperty(dpy, c->win, &name, net_atom[NetWMName]);
       -        if(!name.nitems)
       -                XGetWMName(dpy, c->win, &name);
       -        if(!name.nitems)
       +void
       +focus(Client *c)
       +{
       +        Client *old = sel;
       +        XEvent ev;
       +
       +        XFlush(dpy);
       +        sel = c;
       +        if(old && old != c)
       +                drawtitle(old);
       +        drawtitle(c);
       +        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
       +        XFlush(dpy);
       +        while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
       +}
       +
       +void
       +focusnext(Arg *arg)
       +{
       +        Client *c;
       +   
       +        if(!sel)
                        return;
       -        if(name.encoding == XA_STRING)
       -                strncpy(c->name, (char *)name.value, sizeof(c->name));
       -        else {
       -                if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
       -                                && n > 0 && *list)
       -                {
       -                        strncpy(c->name, *list, sizeof(c->name));
       -                        XFreeStringList(list);
       -                }
       +
       +        if(!(c = getnext(sel->next)))
       +                c = getnext(clients);
       +        if(c) {
       +                higher(c);
       +                c->revert = sel;
       +                focus(c);
                }
       -        XFree(name.value);
       -        resizetitle(c);
        }
        
        void
       -setsize(Client *c)
       +focusprev(Arg *arg)
        {
       -        XSizeHints size;
       -        long msize;
       -        if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
       -                size.flags = PSize;
       -        c->flags = size.flags;
       -        if(c->flags & PBaseSize) {
       -                c->basew = size.base_width;
       -                c->baseh = size.base_height;
       +        Client *c;
       +
       +        if(!sel)
       +                return;
       +
       +        if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) {
       +                higher(c);
       +                focus(c);
                }
       -        else
       -                c->basew = c->baseh = 0;
       -        if(c->flags & PResizeInc) {
       -                c->incw = size.width_inc;
       -                c->inch = size.height_inc;
       +}
       +
       +Client *
       +getclient(Window w)
       +{
       +        Client *c;
       +        for(c = clients; c; c = c->next)
       +                if(c->win == w)
       +                        return c;
       +        return NULL;
       +}
       +
       +Client *
       +getctitle(Window w)
       +{
       +        Client *c;
       +        for(c = clients; c; c = c->next)
       +                if(c->title == w)
       +                        return c;
       +        return NULL;
       +}
       +
       +void
       +gravitate(Client *c, Bool invert)
       +{
       +        int dx = 0, dy = 0;
       +
       +        switch(c->grav) {
       +        case StaticGravity:
       +        case NorthWestGravity:
       +        case NorthGravity:
       +        case NorthEastGravity:
       +                dy = c->border;
       +                break;
       +        case EastGravity:
       +        case CenterGravity:
       +        case WestGravity:
       +                dy = -(c->h / 2) + c->border;
       +                break;
       +        case SouthEastGravity:
       +        case SouthGravity:
       +        case SouthWestGravity:
       +                dy = -c->h;
       +                break;
       +        default:
       +                break;
                }
       -        else
       -                c->incw = c->inch = 0;
       -        if(c->flags & PMaxSize) {
       -                c->maxw = size.max_width;
       -                c->maxh = size.max_height;
       +
       +        switch (c->grav) {
       +        case StaticGravity:
       +        case NorthWestGravity:
       +        case WestGravity:
       +        case SouthWestGravity:
       +                dx = c->border;
       +                break;
       +        case NorthGravity:
       +        case CenterGravity:
       +        case SouthGravity:
       +                dx = -(c->w / 2) + c->border;
       +                break;
       +        case NorthEastGravity:
       +        case EastGravity:
       +        case SouthEastGravity:
       +                dx = -(c->w + c->border);
       +                break;
       +        default:
       +                break;
                }
       -        else
       -                c->maxw = c->maxh = 0;
       -        if(c->flags & PMinSize) {
       -                c->minw = size.min_width;
       -                c->minh = size.min_height;
       +
       +        if(invert) {
       +                dx = -dx;
       +                dy = -dy;
                }
       -        else
       -                c->minw = c->minh = 0;
       -        if(c->flags & PWinGravity)
       -                c->grav = size.win_gravity;
       -        else
       -                c->grav = NorthWestGravity;
       +        c->x += dx;
       +        c->y += dy;
        }
        
        void
       t@@ -109,26 +173,21 @@ higher(Client *c)
        }
        
        void
       -lower(Client *c)
       +killclient(Arg *arg)
        {
       -        XLowerWindow(dpy, c->title);
       -        XLowerWindow(dpy, c->win);
       +        if(!sel)
       +                return;
       +        if(sel->proto & WM_PROTOCOL_DELWIN)
       +                sendevent(sel->win, wm_atom[WMProtocols], wm_atom[WMDelete]);
       +        else
       +                XKillClient(dpy, sel->win);
        }
        
        void
       -focus(Client *c)
       +lower(Client *c)
        {
       -        Client *old = sel;
       -        XEvent ev;
       -
       -        XFlush(dpy);
       -        sel = c;
       -        if(old && old != c)
       -                drawtitle(old);
       -        drawtitle(c);
       -        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
       -        XFlush(dpy);
       -        while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
       +        XLowerWindow(dpy, c->title);
       +        XLowerWindow(dpy, c->win);
        }
        
        void
       t@@ -195,61 +254,18 @@ manage(Window w, XWindowAttributes *wa)
        }
        
        void
       -gravitate(Client *c, Bool invert)
       +maximize(Arg *arg)
        {
       -        int dx = 0, dy = 0;
       -
       -        switch(c->grav) {
       -        case StaticGravity:
       -        case NorthWestGravity:
       -        case NorthGravity:
       -        case NorthEastGravity:
       -                dy = c->border;
       -                break;
       -        case EastGravity:
       -        case CenterGravity:
       -        case WestGravity:
       -                dy = -(c->h / 2) + c->border;
       -                break;
       -        case SouthEastGravity:
       -        case SouthGravity:
       -        case SouthWestGravity:
       -                dy = -c->h;
       -                break;
       -        default:
       -                break;
       -        }
       -
       -        switch (c->grav) {
       -        case StaticGravity:
       -        case NorthWestGravity:
       -        case WestGravity:
       -        case SouthWestGravity:
       -                dx = c->border;
       -                break;
       -        case NorthGravity:
       -        case CenterGravity:
       -        case SouthGravity:
       -                dx = -(c->w / 2) + c->border;
       -                break;
       -        case NorthEastGravity:
       -        case EastGravity:
       -        case SouthEastGravity:
       -                dx = -(c->w + c->border);
       -                break;
       -        default:
       -                break;
       -        }
       -
       -        if(invert) {
       -                dx = -dx;
       -                dy = -dy;
       -        }
       -        c->x += dx;
       -        c->y += dy;
       +        if(!sel)
       +                return;
       +        sel->x = sx;
       +        sel->y = sy + bh;
       +        sel->w = sw - 2 * sel->border;
       +        sel->h = sh - 2 * sel->border - bh;
       +        higher(sel);
       +        resize(sel, False);
        }
        
       -
        void
        resize(Client *c, Bool inc)
        {
       t@@ -290,10 +306,70 @@ resize(Client *c, Bool inc)
                XFlush(dpy);
        }
        
       -static int
       -xerrordummy(Display *dsply, XErrorEvent *ee)
       +void
       +setsize(Client *c)
        {
       -        return 0;
       +        XSizeHints size;
       +        long msize;
       +        if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
       +                size.flags = PSize;
       +        c->flags = size.flags;
       +        if(c->flags & PBaseSize) {
       +                c->basew = size.base_width;
       +                c->baseh = size.base_height;
       +        }
       +        else
       +                c->basew = c->baseh = 0;
       +        if(c->flags & PResizeInc) {
       +                c->incw = size.width_inc;
       +                c->inch = size.height_inc;
       +        }
       +        else
       +                c->incw = c->inch = 0;
       +        if(c->flags & PMaxSize) {
       +                c->maxw = size.max_width;
       +                c->maxh = size.max_height;
       +        }
       +        else
       +                c->maxw = c->maxh = 0;
       +        if(c->flags & PMinSize) {
       +                c->minw = size.min_width;
       +                c->minh = size.min_height;
       +        }
       +        else
       +                c->minw = c->minh = 0;
       +        if(c->flags & PWinGravity)
       +                c->grav = size.win_gravity;
       +        else
       +                c->grav = NorthWestGravity;
       +}
       +
       +void
       +settitle(Client *c)
       +{
       +        XTextProperty name;
       +        int n;
       +        char **list = NULL;
       +
       +        name.nitems = 0;
       +        c->name[0] = 0;
       +        XGetTextProperty(dpy, c->win, &name, net_atom[NetWMName]);
       +        if(!name.nitems)
       +                XGetWMName(dpy, c->win, &name);
       +        if(!name.nitems)
       +                return;
       +        if(name.encoding == XA_STRING)
       +                strncpy(c->name, (char *)name.value, sizeof(c->name));
       +        else {
       +                if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
       +                                && n > 0 && *list)
       +                {
       +                        strncpy(c->name, *list, sizeof(c->name));
       +                        XFreeStringList(list);
       +                }
       +        }
       +        XFree(name.value);
       +        resizetitle(c);
        }
        
        void
       t@@ -325,26 +401,6 @@ unmanage(Client *c)
                        focus(sel);
        }
        
       -Client *
       -getctitle(Window w)
       -{
       -        Client *c;
       -        for(c = clients; c; c = c->next)
       -                if(c->title == w)
       -                        return c;
       -        return NULL;
       -}
       -
       -Client *
       -getclient(Window w)
       -{
       -        Client *c;
       -        for(c = clients; c; c = c->next)
       -                if(c->win == w)
       -                        return c;
       -        return NULL;
       -}
       -
        void
        zoom(Arg *arg)
        {
       t@@ -366,58 +422,3 @@ zoom(Arg *arg)
                arrange(NULL);
                focus(sel);
        }
       -
       -void
       -maximize(Arg *arg)
       -{
       -        if(!sel)
       -                return;
       -        sel->x = sx;
       -        sel->y = sy + bh;
       -        sel->w = sw - 2 * sel->border;
       -        sel->h = sh - 2 * sel->border - bh;
       -        higher(sel);
       -        resize(sel, False);
       -}
       -
       -void
       -focusprev(Arg *arg)
       -{
       -        Client *c;
       -
       -        if(!sel)
       -                return;
       -
       -        if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) {
       -                higher(c);
       -                focus(c);
       -        }
       -}
       -
       -void
       -focusnext(Arg *arg)
       -{
       -        Client *c;
       -   
       -        if(!sel)
       -                return;
       -
       -        if(!(c = getnext(sel->next)))
       -                c = getnext(clients);
       -        if(c) {
       -                higher(c);
       -                c->revert = sel;
       -                focus(c);
       -        }
       -}
       -
       -void
       -killclient(Arg *arg)
       -{
       -        if(!sel)
       -                return;
       -        if(sel->proto & WM_PROTOCOL_DELWIN)
       -                sendevent(sel->win, wm_atom[WMProtocols], wm_atom[WMDelete]);
       -        else
       -                XKillClient(dpy, sel->win);
       -}
 (DIR) diff --git a/draw.c b/draw.c
       t@@ -2,13 +2,34 @@
         * (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
         * See LICENSE file for license details.
         */
       +#include "dwm.h"
        
        #include <stdio.h>
        #include <string.h>
       -
        #include <X11/Xlocale.h>
        
       -#include "dwm.h"
       +/* static functions */
       +
       +static void
       +drawborder(void)
       +{
       +        XPoint points[5];
       +        XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
       +        XSetForeground(dpy, dc.gc, dc.border);
       +        points[0].x = dc.x;
       +        points[0].y = dc.y;
       +        points[1].x = dc.w - 1;
       +        points[1].y = 0;
       +        points[2].x = 0;
       +        points[2].y = dc.h - 1;
       +        points[3].x = -(dc.w - 1);
       +        points[3].y = 0;
       +        points[4].x = 0;
       +        points[4].y = -(dc.h - 1);
       +        XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
       +}
       +
       +/* extern functions */
        
        void
        drawall()
       t@@ -53,59 +74,6 @@ drawstatus()
        }
        
        void
       -drawtitle(Client *c)
       -{
       -        int i;
       -        Bool istile = arrange == dotile;
       -
       -        if(c == sel) {
       -                drawstatus();
       -                XUnmapWindow(dpy, c->title);
       -                XSetWindowBorder(dpy, c->win, dc.fg);
       -                return;
       -        }
       -
       -        XSetWindowBorder(dpy, c->win, dc.bg);
       -        XMapWindow(dpy, c->title);
       -
       -        dc.x = dc.y = 0;
       -
       -        dc.w = 0;
       -        for(i = 0; i < TLast; i++) {
       -                if(c->tags[i]) {
       -                        dc.x += dc.w;
       -                        dc.w = textw(c->tags[i]);
       -                        drawtext(c->tags[i], !istile, True);
       -                }
       -        }
       -        dc.x += dc.w;
       -        dc.w = textw(c->name);
       -        drawtext(c->name, !istile, True);
       -        XCopyArea(dpy, dc.drawable, c->title, dc.gc,
       -                        0, 0, c->tw, c->th, 0, 0);
       -        XFlush(dpy);
       -}
       -
       -static void
       -drawborder(void)
       -{
       -        XPoint points[5];
       -        XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
       -        XSetForeground(dpy, dc.gc, dc.border);
       -        points[0].x = dc.x;
       -        points[0].y = dc.y;
       -        points[1].x = dc.w - 1;
       -        points[1].y = 0;
       -        points[2].x = 0;
       -        points[2].y = dc.h - 1;
       -        points[3].x = -(dc.w - 1);
       -        points[3].y = 0;
       -        points[4].x = 0;
       -        points[4].y = -(dc.h - 1);
       -        XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
       -}
       -
       -void
        drawtext(const char *text, Bool invert, Bool border)
        {
                int x, y, w, h;
       t@@ -155,6 +123,40 @@ drawtext(const char *text, Bool invert, Bool border)
                }
        }
        
       +void
       +drawtitle(Client *c)
       +{
       +        int i;
       +        Bool istile = arrange == dotile;
       +
       +        if(c == sel) {
       +                drawstatus();
       +                XUnmapWindow(dpy, c->title);
       +                XSetWindowBorder(dpy, c->win, dc.fg);
       +                return;
       +        }
       +
       +        XSetWindowBorder(dpy, c->win, dc.bg);
       +        XMapWindow(dpy, c->title);
       +
       +        dc.x = dc.y = 0;
       +
       +        dc.w = 0;
       +        for(i = 0; i < TLast; i++) {
       +                if(c->tags[i]) {
       +                        dc.x += dc.w;
       +                        dc.w = textw(c->tags[i]);
       +                        drawtext(c->tags[i], !istile, True);
       +                }
       +        }
       +        dc.x += dc.w;
       +        dc.w = textw(c->name);
       +        drawtext(c->name, !istile, True);
       +        XCopyArea(dpy, dc.drawable, c->title, dc.gc,
       +                        0, 0, c->tw, c->th, 0, 0);
       +        XFlush(dpy);
       +}
       +
        unsigned long
        getcolor(const char *colstr)
        {
       t@@ -165,23 +167,6 @@ getcolor(const char *colstr)
                return color.pixel;
        }
        
       -unsigned int
       -textnw(char *text, unsigned int len)
       -{
       -        XRectangle r;
       -        if(dc.font.set) {
       -                XmbTextExtents(dc.font.set, text, len, NULL, &r);
       -                return r.width;
       -        }
       -        return XTextWidth(dc.font.xfont, text, len);
       -}
       -
       -unsigned int
       -textw(char *text)
       -{
       -        return textnw(text, strlen(text)) + dc.font.height;
       -}
       -
        void
        setfont(const char *fontstr)
        {
       t@@ -232,3 +217,20 @@ setfont(const char *fontstr)
                }
                dc.font.height = dc.font.ascent + dc.font.descent;
        }
       +
       +unsigned int
       +textnw(char *text, unsigned int len)
       +{
       +        XRectangle r;
       +        if(dc.font.set) {
       +                XmbTextExtents(dc.font.set, text, len, NULL, &r);
       +                return r.width;
       +        }
       +        return XTextWidth(dc.font.xfont, text, len);
       +}
       +
       +unsigned int
       +textw(char *text)
       +{
       +        return textnw(text, strlen(text)) + dc.font.height;
       +}
 (DIR) diff --git a/dwm.h b/dwm.h
       t@@ -104,53 +104,52 @@ extern Client *clients, *sel;
        
        /* client.c */
        extern void ban(Client *c);
       -extern void manage(Window w, XWindowAttributes *wa);
       -extern void unmanage(Client *c);
       -extern Client *getclient(Window w);
        extern void focus(Client *c);
       -extern void settitle(Client *c);
       -extern void resize(Client *c, Bool inc);
       -extern void setsize(Client *c);
       +extern void focusnext(Arg *arg);
       +extern void focusprev(Arg *arg);
       +extern Client *getclient(Window w);
        extern Client *getctitle(Window w);
       +extern void gravitate(Client *c, Bool invert);
        extern void higher(Client *c);
       +extern void killclient(Arg *arg);
        extern void lower(Client *c);
       -extern void gravitate(Client *c, Bool invert);
       -extern void zoom(Arg *arg);
       +extern void manage(Window w, XWindowAttributes *wa);
        extern void maximize(Arg *arg);
       -extern void focusprev(Arg *arg);
       -extern void focusnext(Arg *arg);
       -extern void killclient(Arg *arg);
       +extern void resize(Client *c, Bool inc);
       +extern void setsize(Client *c);
       +extern void settitle(Client *c);
       +extern void unmanage(Client *c);
       +extern void zoom(Arg *arg);
        
        /* draw.c */
        extern void drawall();
        extern void drawstatus();
       -extern void drawtitle(Client *c);
        extern void drawtext(const char *text, Bool invert, Bool border);
       +extern void drawtitle(Client *c);
        extern unsigned long getcolor(const char *colstr);
        extern void setfont(const char *fontstr);
        extern unsigned int textnw(char *text, unsigned int len);
        extern unsigned int textw(char *text);
       -extern unsigned int texth(void);
        
        /* event.c */
        extern void grabkeys();
        
        /* main.c */
       +extern int getproto(Window w);
        extern void quit(Arg *arg);
       -extern int xerror(Display *dsply, XErrorEvent *ee);
        extern void sendevent(Window w, Atom a, long value);
       -extern int getproto(Window w);
       +extern int xerror(Display *dsply, XErrorEvent *ee);
        
        /* tag.c */
       -extern Client *getnext(Client *c);
       -extern void settags(Client *c);
       +extern void appendtag(Arg *arg);
        extern void dofloat(Arg *arg);
        extern void dotile(Arg *arg);
       -extern void view(Arg *arg);
       -extern void appendtag(Arg *arg);
       +extern Client *getnext(Client *c);
        extern void replacetag(Arg *arg);
       +extern void settags(Client *c);
       +extern void view(Arg *arg);
        
        /* util.c */
       -extern void eprint(const char *errstr, ...);
        extern void *emallocz(unsigned int size);
       +extern void eprint(const char *errstr, ...);
        extern void spawn(Arg *arg);
 (DIR) diff --git a/event.c b/event.c
       t@@ -2,17 +2,12 @@
         * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
         * See LICENSE file for license details.
         */
       +#include "dwm.h"
        
       -#include <fcntl.h>
       -#include <stdio.h>
        #include <stdlib.h>
       -#include <string.h>
       -#include <unistd.h>
        #include <X11/keysym.h>
        #include <X11/Xatom.h>
        
       -#include "dwm.h"
       -
        #define ButtonMask      (ButtonPressMask | ButtonReleaseMask)
        #define MouseMask       (ButtonMask | PointerMotionMask)
        
       t@@ -54,130 +49,10 @@ Key key[] = {
        
        /********** CUSTOMIZE **********/
        
       -/* local functions */
       -static void buttonpress(XEvent *e);
       -static void configurerequest(XEvent *e);
       -static void destroynotify(XEvent *e);
       -static void enternotify(XEvent *e);
       -static void leavenotify(XEvent *e);
       -static void expose(XEvent *e);
       -static void keypress(XEvent *e);
       -static void maprequest(XEvent *e);
       -static void propertynotify(XEvent *e);
       -static void unmapnotify(XEvent *e);
       -
       -void (*handler[LASTEvent]) (XEvent *) = {
       -        [ButtonPress] = buttonpress,
       -        [ConfigureRequest] = configurerequest,
       -        [DestroyNotify] = destroynotify,
       -        [EnterNotify] = enternotify,
       -        [LeaveNotify] = leavenotify,
       -        [Expose] = expose,
       -        [KeyPress] = keypress,
       -        [MapRequest] = maprequest,
       -        [PropertyNotify] = propertynotify,
       -        [UnmapNotify] = unmapnotify
       -};
       -
       -void
       -grabkeys()
       -{
       -        static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
       -        unsigned int i;
       -        KeyCode code;
       -
       -        for(i = 0; i < len; i++) {
       -                code = XKeysymToKeycode(dpy, key[i].keysym);
       -                XUngrabKey(dpy, code, key[i].mod, root);
       -                XGrabKey(dpy, code, key[i].mod, root, True,
       -                                GrabModeAsync, GrabModeAsync);
       -        }
       -}
       -
       -static void
       -keypress(XEvent *e)
       -{
       -        XKeyEvent *ev = &e->xkey;
       -        static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
       -        unsigned int i;
       -        KeySym keysym;
       -
       -        keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
       -        for(i = 0; i < len; i++)
       -                if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
       -                        if(key[i].func)
       -                                key[i].func(&key[i].arg);
       -                        return;
       -                }
       -}
       -
       -static void
       -resizemouse(Client *c)
       -{
       -        XEvent ev;
       -        int ocx, ocy;
       -
       -        ocx = c->x;
       -        ocy = c->y;
       -        if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
       -                                None, cursor[CurResize], CurrentTime) != GrabSuccess)
       -                return;
       -        XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
       -        for(;;) {
       -                XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
       -                switch(ev.type) {
       -                default: break;
       -                case Expose:
       -                        handler[Expose](&ev);
       -                        break;
       -                case MotionNotify:
       -                        XFlush(dpy);
       -                        c->w = abs(ocx - ev.xmotion.x);
       -                        c->h = abs(ocy - ev.xmotion.y);
       -                        c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
       -                        c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h;
       -                        resize(c, True);
       -                        break;
       -                case ButtonRelease:
       -                        XUngrabPointer(dpy, CurrentTime);
       -                        return;
       -                }
       -        }
       -}
       -
       -static void
       -movemouse(Client *c)
       -{
       -        XEvent ev;
       -        int x1, y1, ocx, ocy, di;
       -        unsigned int dui;
       -        Window dummy;
       +/* static functions */
        
       -        ocx = c->x;
       -        ocy = c->y;
       -        if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
       -                                None, cursor[CurMove], CurrentTime) != GrabSuccess)
       -                return;
       -        XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
       -        for(;;) {
       -                XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
       -                switch (ev.type) {
       -                default: break;
       -                case Expose:
       -                        handler[Expose](&ev);
       -                        break;
       -                case MotionNotify:
       -                        XFlush(dpy);
       -                        c->x = ocx + (ev.xmotion.x - x1);
       -                        c->y = ocy + (ev.xmotion.y - y1);
       -                        resize(c, False);
       -                        break;
       -                case ButtonRelease:
       -                        XUngrabPointer(dpy, CurrentTime);
       -                        return;
       -                }
       -        }
       -}
       +static void movemouse(Client *c);
       +static void resizemouse(Client *c);
        
        static void
        buttonpress(XEvent *e)
       t@@ -280,15 +155,6 @@ enternotify(XEvent *e)
        }
        
        static void
       -leavenotify(XEvent *e)
       -{
       -        XCrossingEvent *ev = &e->xcrossing;
       -
       -        if((ev->window == root) && !ev->same_screen)
       -                issel = True;
       -}
       -
       -static void
        expose(XEvent *e)
        {
                XExposeEvent *ev = &e->xexpose;
       t@@ -303,6 +169,32 @@ expose(XEvent *e)
        }
        
        static void
       +keypress(XEvent *e)
       +{
       +        XKeyEvent *ev = &e->xkey;
       +        static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
       +        unsigned int i;
       +        KeySym keysym;
       +
       +        keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
       +        for(i = 0; i < len; i++)
       +                if((keysym == key[i].keysym) && (key[i].mod == ev->state)) {
       +                        if(key[i].func)
       +                                key[i].func(&key[i].arg);
       +                        return;
       +                }
       +}
       +
       +static void
       +leavenotify(XEvent *e)
       +{
       +        XCrossingEvent *ev = &e->xcrossing;
       +
       +        if((ev->window == root) && !ev->same_screen)
       +                issel = True;
       +}
       +
       +static void
        maprequest(XEvent *e)
        {
                XMapRequestEvent *ev = &e->xmaprequest;
       t@@ -322,6 +214,40 @@ maprequest(XEvent *e)
        }
        
        static void
       +movemouse(Client *c)
       +{
       +        XEvent ev;
       +        int x1, y1, ocx, ocy, di;
       +        unsigned int dui;
       +        Window dummy;
       +
       +        ocx = c->x;
       +        ocy = c->y;
       +        if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
       +                                None, cursor[CurMove], CurrentTime) != GrabSuccess)
       +                return;
       +        XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
       +        for(;;) {
       +                XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
       +                switch (ev.type) {
       +                default: break;
       +                case Expose:
       +                        handler[Expose](&ev);
       +                        break;
       +                case MotionNotify:
       +                        XFlush(dpy);
       +                        c->x = ocx + (ev.xmotion.x - x1);
       +                        c->y = ocy + (ev.xmotion.y - y1);
       +                        resize(c, False);
       +                        break;
       +                case ButtonRelease:
       +                        XUngrabPointer(dpy, CurrentTime);
       +                        return;
       +                }
       +        }
       +}
       +
       +static void
        propertynotify(XEvent *e)
        {
                XPropertyEvent *ev = &e->xproperty;
       t@@ -355,6 +281,40 @@ propertynotify(XEvent *e)
        }
        
        static void
       +resizemouse(Client *c)
       +{
       +        XEvent ev;
       +        int ocx, ocy;
       +
       +        ocx = c->x;
       +        ocy = c->y;
       +        if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
       +                                None, cursor[CurResize], CurrentTime) != GrabSuccess)
       +                return;
       +        XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
       +        for(;;) {
       +                XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
       +                switch(ev.type) {
       +                default: break;
       +                case Expose:
       +                        handler[Expose](&ev);
       +                        break;
       +                case MotionNotify:
       +                        XFlush(dpy);
       +                        c->w = abs(ocx - ev.xmotion.x);
       +                        c->h = abs(ocy - ev.xmotion.y);
       +                        c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
       +                        c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h;
       +                        resize(c, True);
       +                        break;
       +                case ButtonRelease:
       +                        XUngrabPointer(dpy, CurrentTime);
       +                        return;
       +                }
       +        }
       +}
       +
       +static void
        unmapnotify(XEvent *e)
        {
                Client *c;
       t@@ -363,3 +323,33 @@ unmapnotify(XEvent *e)
                if((c = getclient(ev->window)))
                        unmanage(c);
        }
       +
       +/* extern functions */
       +
       +void (*handler[LASTEvent]) (XEvent *) = {
       +        [ButtonPress] = buttonpress,
       +        [ConfigureRequest] = configurerequest,
       +        [DestroyNotify] = destroynotify,
       +        [EnterNotify] = enternotify,
       +        [LeaveNotify] = leavenotify,
       +        [Expose] = expose,
       +        [KeyPress] = keypress,
       +        [MapRequest] = maprequest,
       +        [PropertyNotify] = propertynotify,
       +        [UnmapNotify] = unmapnotify
       +};
       +
       +void
       +grabkeys()
       +{
       +        static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
       +        unsigned int i;
       +        KeyCode code;
       +
       +        for(i = 0; i < len; i++) {
       +                code = XKeysymToKeycode(dpy, key[i].keysym);
       +                XUngrabKey(dpy, code, key[i].mod, root);
       +                XGrabKey(dpy, code, key[i].mod, root, True,
       +                                GrabModeAsync, GrabModeAsync);
       +        }
       +}
 (DIR) diff --git a/main.c b/main.c
       t@@ -3,31 +3,17 @@
         * See LICENSE file for license details.
         */
        
       +#include "dwm.h"
       +
        #include <errno.h>
       -#include <stdarg.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <string.h>
        #include <unistd.h>
       -
        #include <X11/cursorfont.h>
        #include <X11/Xatom.h>
        #include <X11/Xproto.h>
        
       -#include "dwm.h"
       -
       -/********** CUSTOMIZE **********/
       -
       -char *tags[TLast] = {
       -        [Tscratch] = "scratch",
       -        [Tdev] = "dev",
       -        [Twww] = "www",
       -        [Twork] = "work",
       -};
       -
       -/********** CUSTOMIZE **********/
       -
       -/* X structs */
        Display *dpy;
        Window root, barwin;
        Atom wm_atom[WMLast], net_atom[NetLast];
       t@@ -48,8 +34,17 @@ static const char version[] =
                "dwm-" VERSION ", (C)opyright MMVI Anselm R. Garbe\n";
        static int (*xerrorxlib)(Display *, XErrorEvent *);
        
       +/* static functions */
       +
        static void
       -usage() {        eprint("usage: dwm [-v]\n"); }
       +cleanup()
       +{
       +        while(sel) {
       +                resize(sel, True);
       +                unmanage(sel);
       +        }
       +        XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
       +}
        
        static void
        scan()
       t@@ -73,22 +68,6 @@ scan()
                        XFree(wins);
        }
        
       -static void
       -cleanup()
       -{
       -        while(sel) {
       -                resize(sel, True);
       -                unmanage(sel);
       -        }
       -        XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
       -}
       -
       -void
       -quit(Arg *arg)
       -{
       -        running = False;
       -}
       -
        static int
        win_property(Window w, Atom a, Atom t, long l, unsigned char **prop)
        {
       t@@ -109,6 +88,19 @@ win_property(Window w, Atom a, Atom t, long l, unsigned char **prop)
                return res;
        }
        
       +/*
       + * Startup Error handler to check if another window manager
       + * is already running.
       + */
       +static int
       +xerrorstart(Display *dsply, XErrorEvent *ee)
       +{
       +        otherwm = True;
       +        return -1;
       +}
       +
       +/* extern functions */
       +
        int
        getproto(Window w)
        {
       t@@ -144,15 +136,10 @@ sendevent(Window w, Atom a, long value)
                XFlush(dpy);
        }
        
       -/*
       - * Startup Error handler to check if another window manager
       - * is already running.
       - */
       -static int
       -xerrorstart(Display *dsply, XErrorEvent *ee)
       +void
       +quit(Arg *arg)
        {
       -        otherwm = True;
       -        return -1;
       +        running = False;
        }
        
        /*
       t@@ -201,7 +188,7 @@ main(int argc, char *argv[])
                                exit(0);
                                break;
                        default:
       -                        usage();
       +                        eprint("usage: dwm [-v]\n");
                                break;
                        }
                }
 (DIR) diff --git a/tag.c b/tag.c
       t@@ -2,71 +2,39 @@
         * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
         * See LICENSE file for license details.
         */
       +#include "dwm.h"
        
       -#include <stdlib.h>
       -#include <stdio.h>
        #include <string.h>
       -#include <X11/Xatom.h>
        #include <X11/Xutil.h>
        
       -#include "dwm.h"
       +/********** CUSTOMIZE **********/
       +
       +char *tags[TLast] = {
       +        [Tscratch] = "scratch",
       +        [Tdev] = "dev",
       +        [Twww] = "www",
       +        [Twork] = "work",
       +};
        
        static Rule rule[] = {
                /* class                        instance        tags                                                dofloat */
                { "Firefox-bin",        "Gecko",        { [Twww] = "www" },                        False },
        };
        
       -void (*arrange)(Arg *) = dotile;
       +/********** CUSTOMIZE **********/
        
       -Client *
       -getnext(Client *c)
       -{
       -        for(; c && !c->tags[tsel]; c = c->next);
       -        return c;
       -}
       +/* extern functions */
       +
       +void (*arrange)(Arg *) = dotile;
        
        void
       -settags(Client *c)
       +appendtag(Arg *arg)
        {
       -        XClassHint ch;
       -        static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0;
       -        unsigned int i, j;
       -        Bool matched = False;
       -
       -        if(!len) {
       -                c->tags[tsel] = tags[tsel];
       +        if(!sel)
                        return;
       -        }
       -
       -        if(XGetClassHint(dpy, c->win, &ch)) {
       -                if(ch.res_class && ch.res_name) {
       -                        for(i = 0; i < len; i++)
       -                                if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class))
       -                                        && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance)))
       -                                {
       -                                        for(j = 0; j < TLast; j++)
       -                                                c->tags[j] = rule[i].tags[j];
       -                                        c->dofloat = rule[i].dofloat;
       -                                        matched = True;
       -                                        break;
       -                                }
       -                }
       -                if(ch.res_class)
       -                        XFree(ch.res_class);
       -                if(ch.res_name)
       -                        XFree(ch.res_name);
       -        }
        
       -        if(!matched)
       -                c->tags[tsel] = tags[tsel];
       -}
       -
       -void
       -view(Arg *arg)
       -{
       -        tsel = arg->i;
       +        sel->tags[arg->i] = tags[arg->i];
                arrange(NULL);
       -        drawall();
        }
        
        void
       t@@ -147,14 +115,11 @@ dotile(Arg *arg)
                drawall();
        }
        
       -void
       -appendtag(Arg *arg)
       +Client *
       +getnext(Client *c)
        {
       -        if(!sel)
       -                return;
       -
       -        sel->tags[arg->i] = tags[arg->i];
       -        arrange(NULL);
       +        for(; c && !c->tags[tsel]; c = c->next);
       +        return c;
        }
        
        void
       t@@ -169,3 +134,46 @@ replacetag(Arg *arg)
                appendtag(arg);
        }
        
       +void
       +settags(Client *c)
       +{
       +        XClassHint ch;
       +        static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0;
       +        unsigned int i, j;
       +        Bool matched = False;
       +
       +        if(!len) {
       +                c->tags[tsel] = tags[tsel];
       +                return;
       +        }
       +
       +        if(XGetClassHint(dpy, c->win, &ch)) {
       +                if(ch.res_class && ch.res_name) {
       +                        for(i = 0; i < len; i++)
       +                                if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class))
       +                                        && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance)))
       +                                {
       +                                        for(j = 0; j < TLast; j++)
       +                                                c->tags[j] = rule[i].tags[j];
       +                                        c->dofloat = rule[i].dofloat;
       +                                        matched = True;
       +                                        break;
       +                                }
       +                }
       +                if(ch.res_class)
       +                        XFree(ch.res_class);
       +                if(ch.res_name)
       +                        XFree(ch.res_name);
       +        }
       +
       +        if(!matched)
       +                c->tags[tsel] = tags[tsel];
       +}
       +
       +void
       +view(Arg *arg)
       +{
       +        tsel = arg->i;
       +        arrange(NULL);
       +        drawall();
       +}
 (DIR) diff --git a/util.c b/util.c
       t@@ -2,24 +2,15 @@
         * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
         * See LICENSE file for license details.
         */
       +#include "dwm.h"
        
        #include <stdarg.h>
        #include <stdio.h>
        #include <stdlib.h>
       -#include <sys/types.h>
        #include <sys/wait.h>
        #include <unistd.h>
        
       -#include "dwm.h"
       -
       -void
       -eprint(const char *errstr, ...) {
       -        va_list ap;
       -        va_start(ap, errstr);
       -        vfprintf(stderr, errstr, ap);
       -        va_end(ap);
       -        exit(1);
       -}
       +/* static functions */
        
        static void
        bad_malloc(unsigned int size)
       t@@ -29,6 +20,8 @@ bad_malloc(unsigned int size)
                exit(1);
        }
        
       +/* extern functions */
       +
        void *
        emallocz(unsigned int size)
        {
       t@@ -39,6 +32,15 @@ emallocz(unsigned int size)
        }
        
        void
       +eprint(const char *errstr, ...) {
       +        va_list ap;
       +        va_start(ap, errstr);
       +        vfprintf(stderr, errstr, ap);
       +        va_end(ap);
       +        exit(1);
       +}
       +
       +void
        spawn(Arg *arg)
        {
                char **argv = (char **)arg->argv;