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)) { +