t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit a3d8c05a95edbd4dad544c3373301551440c8092
   DIR parent fd01413fae6dea101ed07e6ee7c0d26be5e92d03
   URI Author: anselm@anselm1 <unknown>
       Date:   Sat, 23 Feb 2008 23:11:27 +0000
       
       pushing my changes of tonight upstream (hg tip is NOW very UNSTABLE -- but those changes are necessary to get a decent multihead support) -- I renamed Monitor into View, to reflect in a better way the dwm terminology of the past
       Diffstat:
         M config.def.h                        |      14 +++++++-------
         M dwm.c                               |     697 +++++++++++++++----------------
       
       2 files changed, 345 insertions(+), 366 deletions(-)
       ---
   DIR diff --git a/config.def.h b/config.def.h
       t@@ -3,7 +3,7 @@
        /* appearance */
        #define BARPOS                        BarTop /* BarBot, BarOff */
        #define BORDERPX                1
       -#define FONT                        "-*-terminus-medium-r-normal-*-14-*-*-*-*-*-*-*"
       +#define FONT                        "-*-terminus-medium-r-normal-*-12-*-*-*-*-*-*-*"
        #define NORMBORDERCOLOR                "#cccccc"
        #define NORMBGCOLOR                "#cccccc"
        #define NORMFGCOLOR                "#000000"
       t@@ -13,13 +13,13 @@
        
        /* tagging */
        const char tags[][MAXTAGLEN] = { "1", "2", "3", "4", "5", "6", "7", "8", "www" };
       -Bool initags[LENGTH(tags)] = {[0] = True};
       +int initags[LENGTH(tags)]    = { [0] = 1 };
        Rule rules[] = {
       -        /* class:instance:title regex        tags regex        isfloating */        /* monitor */
       -        { "Firefox",                        "www",                False,                -1 },
       -        { "Gimp",                        NULL,                True,                -1 },
       -        { "MPlayer",                        NULL,                True,                -1 },
       -        { "Acroread",                        NULL,                True,                -1 },
       +        /* class:instance:title regex        tags regex        isfloating */
       +        { "Firefox",                        "www",                False },
       +        { "Gimp",                        NULL,                True },
       +        { "MPlayer",                        NULL,                True },
       +        { "Acroread",                        NULL,                True },
        };
        
        /* layout(s) */
   DIR diff --git a/dwm.c b/dwm.c
       t@@ -17,7 +17,7 @@
         * set the override_redirect flag.  Clients are organized in a global
         * doubly-linked client list, the focus history is remembered through a global
         * stack list. Each client contains an array of Bools of the same size as the
       - * global tags array to indicate the tags of a client.  
       + * global tags array to indicate the tags of a client.
         *
         * Keys and tagging rules are organized as arrays and defined in config.h.
         *
       t@@ -45,11 +45,11 @@
        //#endif
        
        /* macros */
       -#define BUTTONMASK                (ButtonPressMask | ButtonReleaseMask)
       -#define CLEANMASK(mask)                (mask & ~(numlockmask | LockMask))
       +#define BUTTONMASK                (ButtonPressMask|ButtonReleaseMask)
       +#define CLEANMASK(mask)                (mask & ~(numlockmask|LockMask))
        #define LENGTH(x)                (sizeof x / sizeof x[0])
        #define MAXTAGLEN                16
       -#define MOUSEMASK                (BUTTONMASK | PointerMotionMask)
       +#define MOUSEMASK                (BUTTONMASK|PointerMotionMask)
        
        
        /* enums */
       t@@ -60,22 +60,21 @@ enum { NetSupported, NetWMName, NetLast };                /* EWMH atoms */
        enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
        
        /* typedefs */
       -typedef struct Monitor Monitor;
       +typedef struct View View;
        typedef struct Client Client;
        struct Client {
                char name[256];
                int x, y, w, h;
                int basew, baseh, incw, inch, maxw, maxh, minw, minh;
                int minax, maxax, minay, maxay;
       +        int *tags;
                long flags;
                unsigned int border, oldborder;
                Bool isbanned, isfixed, isfloating, isurgent;
       -        Bool *tags;
                Client *next;
                Client *prev;
                Client *snext;
                Window win;
       -        Monitor *monitor;
        };
        
        typedef struct {
       t@@ -102,14 +101,13 @@ typedef struct {
        
        typedef struct {
                const char *symbol;
       -        void (*arrange)(Monitor *);
       +        void (*arrange)(View *);
        } Layout;
        
        typedef struct {
                const char *prop;
                const char *tags;
                Bool isfloating;
       -        int monitor;
        } Rule;
        
        typedef struct {
       t@@ -117,19 +115,17 @@ typedef struct {
                regex_t *tagregex;
        } Regs;
        
       -struct Monitor {
       -        int sx, sy, sw, sh, wax, way, wah, waw;
       +struct View {
       +        int id;
       +        int x, y, w, h, wax, way, wah, waw;
                double mwfact;
       -        Bool *seltags;
       -        Bool *prevtags;
                Layout *layout;
                Window barwin;
        };
        
       -
        /* function declarations */
        void applyrules(Client *c);
       -void arrange(Monitor *m);
       +void arrange(void);
        void attach(Client *c);
        void attachstack(Client *c);
        void ban(Client *c);
       t@@ -143,45 +139,46 @@ void configurerequest(XEvent *e);
        void destroynotify(XEvent *e);
        void detach(Client *c);
        void detachstack(Client *c);
       -void drawbar(Monitor *m);
       -void drawsquare(Monitor *m, Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
       -void drawtext(Monitor *m, const char *text, unsigned long col[ColLast], Bool invert);
       +void drawbar(View *v);
       +void drawsquare(View *v, Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
       +void drawtext(View *v, const char *text, unsigned long col[ColLast], Bool invert);
        void *emallocz(unsigned int size);
        void enternotify(XEvent *e);
        void eprint(const char *errstr, ...);
        void expose(XEvent *e);
       -void floating(Monitor *m); /* default floating layout */
       +void floating(View *v); /* default floating layout */
        void focus(Client *c);
        void focusin(XEvent *e);
        void focusnext(const char *arg);
        void focusprev(const char *arg);
        Client *getclient(Window w);
        unsigned long getcolor(const char *colstr);
       -Monitor *getmonitor(Window barwin);
       +View *getviewbar(Window barwin);
       +View *getview(Client *c);
        long getstate(Window w);
        Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
        void grabbuttons(Client *c, Bool focused);
        void grabkeys(void);
        unsigned int idxoftag(const char *tag);
        void initfont(const char *fontstr);
       -Bool isoccupied(Monitor *monitor, unsigned int t);
       +Bool isoccupied(unsigned int t);
        Bool isprotodel(Client *c);
       -Bool isurgent(Monitor *monitor, unsigned int t);
       -Bool isvisible(Client *c, Monitor *m);
       +Bool isurgent(unsigned int t);
       +Bool isvisible(Client *c);
        void keypress(XEvent *e);
        void killclient(const char *arg);
        void manage(Window w, XWindowAttributes *wa);
        void mappingnotify(XEvent *e);
        void maprequest(XEvent *e);
       -Monitor *monitorat(void);
       +View *viewat(void);
        void movemouse(Client *c);
       -Client *nexttiled(Client *c, Monitor *monitor);
       +Client *nexttiled(Client *c, View *v);
        void propertynotify(XEvent *e);
        void quit(const char *arg);
        void reapply(const char *arg);
        void resize(Client *c, int x, int y, int w, int h, Bool sizehints);
        void resizemouse(Client *c);
       -void restack(Monitor *m);
       +void restack(View *v);
        void run(void);
        void scan(void);
        void setclientstate(Client *c, long state);
       t@@ -192,7 +189,7 @@ void spawn(const char *arg);
        void tag(const char *arg);
        unsigned int textnw(const char *text, unsigned int len);
        unsigned int textw(const char *text);
       -void tile(Monitor *m);
       +void tile(View *v);
        void togglebar(const char *arg);
        void togglefloating(const char *arg);
        void toggletag(const char *arg);
       t@@ -200,24 +197,25 @@ void toggleview(const char *arg);
        void unban(Client *c);
        void unmanage(Client *c);
        void unmapnotify(XEvent *e);
       -void updatebarpos(Monitor *m);
       +void updatebarpos(View *v);
        void updatesizehints(Client *c);
        void updatetitle(Client *c);
        void updatewmhints(Client *c);
        void view(const char *arg);
        void viewprevtag(const char *arg);        /* views previous selected tags */
        int xerror(Display *dpy, XErrorEvent *ee);
       -int xerrordummy(Display *dsply, XErrorEvent *ee);
       -int xerrorstart(Display *dsply, XErrorEvent *ee);
       +int xerrordummy(Display *dpy, XErrorEvent *ee);
       +int xerrorstart(Display *dpy, XErrorEvent *ee);
        void zoom(const char *arg);
       -void movetomonitor(const char *arg);
       -void selectmonitor(const char *arg);
       +void selectview(const char *arg);
        
        /* variables */
        char stext[256];
       -int mcount = 1;
       -Monitor *selmonitor;
       +int nviews = 1;
       +View *selview;
        int screen;
       +int *seltags;
       +int *prevtags;
        int (*xerrorxlib)(Display *, XErrorEvent *);
        unsigned int bh, bpos;
        unsigned int blw = 0;
       t@@ -249,14 +247,12 @@ Cursor cursor[CurLast];
        Display *dpy;
        DC dc = {0};
        Regs *regs = NULL;
       -Monitor *monitors;
       +View *views;
        Window root;
        
        /* configuration, allows nested code to access above variables */
        #include "config.h"
        
       -//Bool prevtags[LENGTH(tags)];
       -
        /* function implementations */
        void
        applyrules(Client *c) {
       t@@ -264,7 +260,6 @@ applyrules(Client *c) {
                unsigned int i, j;
                regmatch_t tmp;
                Bool matched_tag = False;
       -        Bool matched_monitor = False;
                XClassHint ch = { 0 };
        
                /* rule matching */
       t@@ -274,16 +269,11 @@ applyrules(Client *c) {
                                ch.res_name ? ch.res_name : "", c->name);
                for(i = 0; i < LENGTH(rules); i++)
                        if(regs[i].propregex && !regexec(regs[i].propregex, buf, 1, &tmp, 0)) {
       -                        if (rules[i].monitor >= 0 && rules[i].monitor < mcount) {
       -                                matched_monitor = True;
       -                                c->monitor = &monitors[rules[i].monitor];
       -                        }
       -
                                c->isfloating = rules[i].isfloating;
                                for(j = 0; regs[i].tagregex && j < LENGTH(tags); j++) {
                                        if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) {
                                                matched_tag = True;
       -                                        c->tags[j] = True;
       +                                        c->tags[j] = selview->id;
                                        }
                                }
                        }
       t@@ -292,29 +282,27 @@ applyrules(Client *c) {
                if(ch.res_name)
                        XFree(ch.res_name);
                if(!matched_tag)
       -                memcpy(c->tags, monitorat()->seltags, sizeof initags);
       -        if (!matched_monitor)
       -                c->monitor = monitorat();
       +                memcpy(c->tags, seltags, sizeof initags);
        }
        
       +
       +
        void
       -arrange(Monitor *m) {
       +arrange(void) {
                unsigned int i;
                Client *c;
        
                for(c = clients; c; c = c->next)
       -                if(isvisible(c, c->monitor))
       +                if(isvisible(c))
                                unban(c);
                        else
                                ban(c);
        
       -        if(m)
       -                m->layout->arrange(m);
       -        else
       -                for(i = 0; i < mcount; i++)
       -                        monitors[i].layout->arrange(&monitors[i]);
       +        for(i = 0; i < nviews; i++) {
       +                views[i].layout->arrange(&views[i]);
       +                restack(&views[i]);
       +        }
                focus(NULL);
       -        restack(m);
        }
        
        void
       t@@ -335,7 +323,7 @@ void
        ban(Client *c) {
                if(c->isbanned)
                        return;
       -        XMoveWindow(dpy, c->win, c->x + 3 * c->monitor->sw, c->y);
       +        XMoveWindow(dpy, c->win, c->x + 3 * getview(c)->w, c->y);
                c->isbanned = True;
        }
        
       t@@ -345,9 +333,9 @@ buttonpress(XEvent *e) {
                Client *c;
                XButtonPressedEvent *ev = &e->xbutton;
        
       -        Monitor *m = monitorat();
       +        View *v = selview;
        
       -        if(ev->window == m->barwin) {
       +        if(ev->window == v->barwin) {
                        x = 0;
                        for(i = 0; i < LENGTH(tags); i++) {
                                x += textw(tags[i]);
       t@@ -375,17 +363,17 @@ buttonpress(XEvent *e) {
                        if(CLEANMASK(ev->state) != MODKEY)
                                return;
                        if(ev->button == Button1) {
       -                        restack(c->monitor);
       +                        restack(getview(c));
                                movemouse(c);
                        }
                        else if(ev->button == Button2) {
       -                        if((floating != m->layout->arrange) && c->isfloating)
       +                        if((floating != v->layout->arrange) && c->isfloating)
                                        togglefloating(NULL);
                                else
                                        zoom(NULL);
                        }
                        else if(ev->button == Button3 && !c->isfixed) {
       -                        restack(c->monitor);
       +                        restack(getview(c));
                                resizemouse(c);
                        }
                }
       t@@ -426,8 +414,8 @@ cleanup(void) {
                XFreeCursor(dpy, cursor[CurNormal]);
                XFreeCursor(dpy, cursor[CurResize]);
                XFreeCursor(dpy, cursor[CurMove]);
       -        for(i = 0; i < mcount; i++)
       -                XDestroyWindow(dpy, monitors[i].barwin);
       +        for(i = 0; i < nviews; i++)
       +                XDestroyWindow(dpy, views[i].barwin);
                XSync(dpy, False);
                XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
        }
       t@@ -479,17 +467,17 @@ configure(Client *c) {
        void
        configurenotify(XEvent *e) {
                XConfigureEvent *ev = &e->xconfigure;
       -        Monitor *m = selmonitor;
       +        View *v = selview;
        
       -        if(ev->window == root && (ev->width != m->sw || ev->height != m->sh)) {
       +        if(ev->window == root && (ev->width != v->w || ev->height != v->h)) {
                        /* TODO -- update Xinerama dimensions here */
       -                m->sw = ev->width;
       -                m->sh = ev->height;
       +                v->w = ev->width;
       +                v->h = ev->height;
                        XFreePixmap(dpy, dc.drawable);
                        dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(root, screen), bh, DefaultDepth(dpy, screen));
       -                XResizeWindow(dpy, m->barwin, m->sw, bh);
       -                updatebarpos(m);
       -                arrange(m);
       +                XResizeWindow(dpy, v->barwin, v->w, bh);
       +                updatebarpos(v);
       +                arrange();
                }
        }
        
       t@@ -500,26 +488,26 @@ configurerequest(XEvent *e) {
                XWindowChanges wc;
        
                if((c = getclient(ev->window))) {
       -                Monitor *m = c->monitor;
       +                View *v = getview(c);
                        if(ev->value_mask & CWBorderWidth)
                                c->border = ev->border_width;
       -                if(c->isfixed || c->isfloating || (floating == m->layout->arrange)) {
       +                if(c->isfixed || c->isfloating || (floating == v->layout->arrange)) {
                                if(ev->value_mask & CWX)
       -                                c->x = m->sx+ev->x;
       +                                c->x = v->x + ev->x;
                                if(ev->value_mask & CWY)
       -                                c->y = m->sy+ev->y;
       +                                c->y = v->y + ev->y;
                                if(ev->value_mask & CWWidth)
                                        c->w = ev->width;
                                if(ev->value_mask & CWHeight)
                                        c->h = ev->height;
       -                        if((c->x - m->sx + c->w) > m->sw && c->isfloating)
       -                                c->x = m->sx + (m->sw / 2 - c->w / 2); /* center in x direction */
       -                        if((c->y - m->sy + c->h) > m->sh && c->isfloating)
       -                                c->y = m->sy + (m->sh / 2 - c->h / 2); /* center in y direction */
       -                        if((ev->value_mask & (CWX | CWY))
       -                        && !(ev->value_mask & (CWWidth | CWHeight)))
       +                        if((c->x - v->x + c->w) > v->w && c->isfloating)
       +                                c->x = v->x + (v->w / 2 - c->w / 2); /* center in x direction */
       +                        if((c->y - v->y + c->h) > v->h && c->isfloating)
       +                                c->y = v->y + (v->h / 2 - c->h / 2); /* center in y direction */
       +                        if((ev->value_mask & (CWX|CWY))
       +                        && !(ev->value_mask & (CWWidth|CWHeight)))
                                        configure(c);
       -                        if(isvisible(c, monitorat()))
       +                        if(isvisible(c))
                                        XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
                        }
                        else
       t@@ -567,55 +555,53 @@ detachstack(Client *c) {
        }
        
        void
       -drawbar(Monitor *m) {
       -        int j, x;
       +drawbar(View *v) {
       +        int i, x;
                Client *c;
        
                dc.x = 0;
       -        for(c = stack; c && !isvisible(c, m); c = c->snext);
       -        for(j = 0; j < LENGTH(tags); j++) {
       -                dc.w = textw(tags[j]);
       -                if(m->seltags[j]) {
       -                        drawtext(m, tags[j], dc.sel, isurgent(m, j));
       -                        drawsquare(m, c && c->tags[j] && c->monitor == m,
       -                                        isoccupied(m, j), isurgent(m, j), dc.sel);
       +        for(c = stack; c && !isvisible(c); c = c->snext);
       +        for(i = 0; i < LENGTH(tags); i++) {
       +                dc.w = textw(tags[i]);
       +                if(seltags[i]) {
       +                        drawtext(v, tags[i], dc.sel, isurgent(i));
       +                        drawsquare(v, c && c->tags[i], isoccupied(i), isurgent(i), dc.sel);
                        }
                        else {
       -                        drawtext(m, tags[j], dc.norm, isurgent(m, j));
       -                        drawsquare(m, c && c->tags[j] && c->monitor == m,
       -                                        isoccupied(m, j), isurgent(m, j), dc.norm);
       +                        drawtext(v, tags[i], dc.norm, isurgent(i));
       +                        drawsquare(v, c && c->tags[i], isoccupied(i), isurgent(i), dc.norm);
                        }
                        dc.x += dc.w;
                }
                dc.w = blw;
       -        drawtext(m, m->layout->symbol, dc.norm, False);
       +        drawtext(v, v->layout->symbol, dc.norm, False);
                x = dc.x + dc.w;
       -        if(m == selmonitor) {
       +        if(v == selview) {
                        dc.w = textw(stext);
       -                dc.x = m->sw - dc.w;
       +                dc.x = v->w - dc.w;
                        if(dc.x < x) {
                                dc.x = x;
       -                        dc.w = m->sw - x;
       +                        dc.w = v->w - x;
                        }
       -                drawtext(m, stext, dc.norm, False);
       +                drawtext(v, stext, dc.norm, False);
                }
                else
       -                dc.x = m->sw;
       +                dc.x = v->w;
                if((dc.w = dc.x - x) > bh) {
                        dc.x = x;
                        if(c) {
       -                        drawtext(m, c->name, dc.sel, False);
       -                        drawsquare(m, False, c->isfloating, False, dc.sel);
       +                        drawtext(v, c->name, dc.sel, False);
       +                        drawsquare(v, False, c->isfloating, False, dc.sel);
                        }
                        else
       -                        drawtext(m, NULL, dc.norm, False);
       +                        drawtext(v, NULL, dc.norm, False);
                }
       -        XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->sw, bh, 0, 0);
       +        XCopyArea(dpy, dc.drawable, v->barwin, dc.gc, 0, 0, v->w, bh, 0, 0);
                XSync(dpy, False);
        }
        
        void
       -drawsquare(Monitor *m, Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
       +drawsquare(View *v, Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
                int x;
                XGCValues gcv;
                XRectangle r = { dc.x, dc.y, dc.w, dc.h };
       t@@ -636,7 +622,7 @@ drawsquare(Monitor *m, Bool filled, Bool empty, Bool invert, unsigned long col[C
        }
        
        void
       -drawtext(Monitor *m, const char *text, unsigned long col[ColLast], Bool invert) {
       +drawtext(View *v, const char *text, unsigned long col[ColLast], Bool invert) {
                int x, y, w, h;
                static char buf[256];
                unsigned int len, olen;
       t@@ -695,11 +681,8 @@ enternotify(XEvent *e) {
                }
                if((c = getclient(ev->window)))
                        focus(c);
       -        else {
       -                selmonitor = monitorat();
       -                fprintf(stderr, "updating selmonitor %d\n", selmonitor - monitors);
       +        else
                        focus(NULL);
       -        }
        }
        
        void
       t@@ -714,29 +697,34 @@ eprint(const char *errstr, ...) {
        
        void
        expose(XEvent *e) {
       -        Monitor *m;
       +        View *v;
                XExposeEvent *ev = &e->xexpose;
        
       -        if(ev->count == 0 && (m = getmonitor(ev->window)))
       -                drawbar(m);
       +        if(ev->count == 0 && (v = getviewbar(ev->window)))
       +                drawbar(v);
        }
        
        void
       -floating(Monitor *m) { /* default floating layout */
       +floating(View *v) { /* default floating layout */
                Client *c;
        
                domwfact = dozoom = False;
                for(c = clients; c; c = c->next)
       -                if(isvisible(c, m))
       +                if(isvisible(c))
                                resize(c, c->x, c->y, c->w, c->h, True);
        }
        
        void
        focus(Client *c) {
       +        View *v = selview;
                if(c)
       -                selmonitor = c->monitor;
       -        if(!c || (c && !isvisible(c, selmonitor)))
       -                for(c = stack; c && !isvisible(c, c->monitor); c = c->snext);
       +                selview = getview(c);
       +        else
       +                selview = viewat();
       +        if(selview != v)
       +                drawbar(v);
       +        if(!c || (c && !isvisible(c)))
       +                for(c = stack; c && !isvisible(c); c = c->snext);
                if(sel && sel != c) {
                        grabbuttons(sel, False);
                        XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
       t@@ -750,11 +738,11 @@ focus(Client *c) {
                if(c) {
                        XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
                        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
       -                selmonitor = c->monitor;
       +                selview = getview(c);
                }
                else
                        XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
       -        drawbar(selmonitor);
       +        drawbar(selview);
        }
        
        void
       t@@ -771,12 +759,12 @@ focusnext(const char *arg) {
        
                if(!sel)
                        return;
       -        for(c = sel->next; c && !isvisible(c, selmonitor); c = c->next);
       +        for(c = sel->next; c && !isvisible(c); c = c->next);
                if(!c)
       -                for(c = clients; c && !isvisible(c, selmonitor); c = c->next);
       +                for(c = clients; c && !isvisible(c); c = c->next);
                if(c) {
                        focus(c);
       -                restack(c->monitor);
       +                restack(getview(c));
                }
        }
        
       t@@ -786,14 +774,14 @@ focusprev(const char *arg) {
        
                if(!sel)
                        return;
       -        for(c = sel->prev; c && !isvisible(c, selmonitor); c = c->prev);
       +        for(c = sel->prev; c && !isvisible(c); c = c->prev);
                if(!c) {
                        for(c = clients; c && c->next; c = c->next);
       -                for(; c && !isvisible(c, selmonitor); c = c->prev);
       +                for(; c && !isvisible(c); c = c->prev);
                }
                if(c) {
                        focus(c);
       -                restack(c->monitor);
       +                restack(getview(c));
                }
        }
        
       t@@ -815,16 +803,26 @@ getcolor(const char *colstr) {
                return color.pixel;
        }
        
       -Monitor *
       -getmonitor(Window barwin) {
       +View *
       +getviewbar(Window barwin) {
                unsigned int i;
        
       -        for(i = 0; i < mcount; i++)
       -                if(monitors[i].barwin == barwin)
       -                        return &monitors[i];
       +        for(i = 0; i < nviews; i++)
       +                if(views[i].barwin == barwin)
       +                        return &views[i];
                return NULL;
        }
        
       +View *
       +getview(Client *c) {
       +        unsigned int i;
       +
       +        for(i = 0; i < LENGTH(tags); i++)
       +                if(c->tags[i])
       +                        return &views[c->tags[i] - 1];
       +        return &views[0]; /* fallback */
       +}
       +
        long
        getstate(Window w) {
                int format, status;
       t@@ -876,29 +874,29 @@ grabbuttons(Client *c, Bool focused) {
                if(focused) {
                        XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button1, MODKEY|LockMask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button1, MODKEY|numlockmask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button1, MODKEY|numlockmask|LockMask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
        
                        XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button2, MODKEY|LockMask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button2, MODKEY|numlockmask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button2, MODKEY|numlockmask|LockMask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
        
                        XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button3, MODKEY|LockMask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button3, MODKEY|numlockmask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
       -                XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
       +                XGrabButton(dpy, Button3, MODKEY|numlockmask|LockMask, c->win, False, BUTTONMASK,
                                        GrabModeAsync, GrabModeSync, None, None);
                }
                else
       t@@ -926,11 +924,11 @@ grabkeys(void)  {
                        code = XKeysymToKeycode(dpy, keys[i].keysym);
                        XGrabKey(dpy, code, keys[i].mod, root, True,
                                        GrabModeAsync, GrabModeAsync);
       -                XGrabKey(dpy, code, keys[i].mod | LockMask, root, True,
       +                XGrabKey(dpy, code, keys[i].mod|LockMask, root, True,
                                        GrabModeAsync, GrabModeAsync);
       -                XGrabKey(dpy, code, keys[i].mod | numlockmask, root, True,
       +                XGrabKey(dpy, code, keys[i].mod|numlockmask, root, True,
                                        GrabModeAsync, GrabModeAsync);
       -                XGrabKey(dpy, code, keys[i].mod | numlockmask | LockMask, root, True,
       +                XGrabKey(dpy, code, keys[i].mod|numlockmask|LockMask, root, True,
                                        GrabModeAsync, GrabModeAsync);
                }
        }
       t@@ -986,11 +984,11 @@ initfont(const char *fontstr) {
        }
        
        Bool
       -isoccupied(Monitor *monitor, unsigned int t) {
       +isoccupied(unsigned int t) {
                Client *c;
        
                for(c = clients; c; c = c->next)
       -                if(c->tags[t] && c->monitor == monitor)
       +                if(c->tags[t])
                                return True;
                return False;
        }
       t@@ -1011,23 +1009,21 @@ isprotodel(Client *c) {
        }
        
        Bool
       -isurgent(Monitor *monitor, unsigned int t) {
       +isurgent(unsigned int t) {
                Client *c;
        
                for(c = clients; c; c = c->next)
       -                if(c->monitor == monitor && c->isurgent && c->tags[t])
       +                if(c->isurgent && c->tags[t])
                                return True;
                return False;
        }
        
        Bool
       -isvisible(Client *c, Monitor *m) {
       +isvisible(Client *c) {
                unsigned int i;
        
       -        if(c->monitor != m)
       -                return False;
                for(i = 0; i < LENGTH(tags); i++)
       -                if(c->tags[i] && c->monitor->seltags[i])
       +                if(c->tags[i] && seltags[i])
                                return True;
                return False;
        }
       t@@ -1071,7 +1067,7 @@ killclient(const char *arg) {
        void
        manage(Window w, XWindowAttributes *wa) {
                Client *c, *t = NULL;
       -        Monitor *m;
       +        View *v;
                Status rettrans;
                Window trans;
                XWindowChanges wc;
       t@@ -1082,28 +1078,28 @@ manage(Window w, XWindowAttributes *wa) {
        
                applyrules(c);
        
       -        m = c->monitor;
       +        v = getview(c);
        
       -        c->x = wa->x + m->sx;
       -        c->y = wa->y + m->sy;
       +        c->x = wa->x + v->x;
       +        c->y = wa->y + v->y;
                c->w = wa->width;
                c->h = wa->height;
                c->oldborder = wa->border_width;
        
       -        if(c->w == m->sw && c->h == m->sh) {
       -                c->x = m->sx;
       -                c->y = m->sy;
       +        if(c->w == v->w && c->h == v->h) {
       +                c->x = v->x;
       +                c->y = v->y;
                        c->border = wa->border_width;
                }
                else {
       -                if(c->x + c->w + 2 * c->border > m->wax + m->waw)
       -                        c->x = m->wax + m->waw - c->w - 2 * c->border;
       -                if(c->y + c->h + 2 * c->border > m->way + m->wah)
       -                        c->y = m->way + m->wah - c->h - 2 * c->border;
       -                if(c->x < m->wax)
       -                        c->x = m->wax;
       -                if(c->y < m->way)
       -                        c->y = m->way;
       +                if(c->x + c->w + 2 * c->border > v->wax + v->waw)
       +                        c->x = v->wax + v->waw - c->w - 2 * c->border;
       +                if(c->y + c->h + 2 * c->border > v->way + v->wah)
       +                        c->y = v->way + v->wah - c->h - 2 * c->border;
       +                if(c->x < v->wax)
       +                        c->x = v->wax;
       +                if(c->y < v->way)
       +                        c->y = v->way;
                        c->border = BORDERPX;
                }
                wc.border_width = c->border;
       t@@ -1111,7 +1107,7 @@ manage(Window w, XWindowAttributes *wa) {
                XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
                configure(c); /* propagates border_width, if size doesn't change */
                updatesizehints(c);
       -        XSelectInput(dpy, w, EnterWindowMask | FocusChangeMask | PropertyChangeMask | StructureNotifyMask);
       +        XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
                grabbuttons(c, False);
                updatetitle(c);
                if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
       t@@ -1126,7 +1122,7 @@ manage(Window w, XWindowAttributes *wa) {
                ban(c);
                XMapWindow(dpy, c->win);
                setclientstate(c, NormalState);
       -        arrange(m);
       +        arrange();
        }
        
        void
       t@@ -1151,17 +1147,17 @@ maprequest(XEvent *e) {
                        manage(ev->window, &wa);
        }
        
       -Monitor *
       -monitorat() {
       +View *
       +viewat() {
                int i, x, y;
                Window win;
                unsigned int mask;
        
                XQueryPointer(dpy, root, &win, &win, &x, &y, &i, &i, &mask);
       -        for(i = 0; i < mcount; i++) {
       -                if((x >= monitors[i].sx && x < monitors[i].sx + monitors[i].sw)
       -                && (y >= monitors[i].sy && y < monitors[i].sy + monitors[i].sh)) {
       -                        return &monitors[i];
       +        for(i = 0; i < nviews; i++) {
       +                if((x >= views[i].x && x < views[i].x + views[i].w)
       +                && (y >= views[i].y && y < views[i].y + views[i].h)) {
       +