diff options
-rw-r--r-- | LICENSE | 1 | ||||
-rw-r--r-- | dwm.c | 40 |
2 files changed, 21 insertions, 20 deletions
@@ -10,6 +10,7 @@ MIT/X Consortium License © 2007-2008 Peter Hartlich <sgkkr at hartlich dot com> © 2008 Martin Hurton <martin dot hurton at gmail dot com> © 2008 Neale Pickett <neale dot woozle dot org> +© 2009 Mate Nagy <mnagy@port70.net> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -136,6 +136,7 @@ struct Monitor { Client *stack; Monitor *next; Window barwin; + Layout *lt[2]; }; typedef struct { @@ -261,7 +262,6 @@ static Bool running = True; static Cursor cursor[CurLast]; static Display *dpy; static DC dc; -static Layout *lt[] = { NULL, NULL }; static Monitor *mons = NULL, *selmon = NULL; static Window root; @@ -376,8 +376,8 @@ arrange(void) { showhide(m->stack); focus(NULL); for(m = mons; m; m = m->next) { - if(lt[m->sellt]->arrange) - lt[m->sellt]->arrange(m); + if(m->lt[m->sellt]->arrange) + m->lt[m->sellt]->arrange(m); restack(m); } } @@ -456,7 +456,7 @@ cleanup(void) { Monitor *m; view(&a); - lt[selmon->sellt] = &foo; + selmon->lt[selmon->sellt] = &foo; for(m = mons; m; m = m->next) while(m->stack) unmanage(m->stack); @@ -547,7 +547,7 @@ configurerequest(XEvent *e) { if((c = wintoclient(ev->window))) { if(ev->value_mask & CWBorderWidth) c->bw = ev->border_width; - else if(c->isfloating || !lt[selmon->sellt]->arrange) { + else if(c->isfloating || !selmon->lt[selmon->sellt]->arrange) { m = c->mon; if(ev->value_mask & CWX) c->x = m->mx + ev->x; @@ -668,7 +668,7 @@ drawbar(Monitor *m) { } if(blw > 0) { dc.w = blw; - drawtext(lt[m->sellt]->symbol, dc.norm, False); + drawtext(m->lt[m->sellt]->symbol, dc.norm, False); x = dc.x + dc.w; } else @@ -1170,11 +1170,11 @@ movemouse(const Arg *arg) { ny = selmon->wy; else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) ny = selmon->wy + selmon->wh - HEIGHT(c); - if(!c->isfloating && lt[selmon->sellt]->arrange + if(!c->isfloating && selmon->lt[selmon->sellt]->arrange && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) togglefloating(NULL); } - if(!lt[selmon->sellt]->arrange || c->isfloating) + if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) resize(c, nx, ny, c->w, c->h, True); break; } @@ -1289,11 +1289,11 @@ resizemouse(const Arg *arg) { nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); if(snap && nw >= selmon->wx && nw <= selmon->wx + selmon->ww && nh >= selmon->wy && nh <= selmon->wy + selmon->wh) { - if(!c->isfloating && lt[selmon->sellt]->arrange + if(!c->isfloating && selmon->lt[selmon->sellt]->arrange && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) togglefloating(NULL); } - if(!lt[selmon->sellt]->arrange || c->isfloating) + if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) resize(c, c->x, c->y, nw, nh, True); break; } @@ -1318,9 +1318,9 @@ restack(Monitor *m) { drawbars(); if(!m->sel) return; - if(m->sel->isfloating || !lt[m->sellt]->arrange) + if(m->sel->isfloating || !m->lt[m->sellt]->arrange) XRaiseWindow(dpy, m->sel->win); - if(lt[m->sellt]->arrange) { + if(m->lt[m->sellt]->arrange) { wc.stack_mode = Below; wc.sibling = m->barwin; for(c = m->stack; c; c = c->snext) @@ -1396,10 +1396,10 @@ setclientstate(Client *c, long state) { void setlayout(const Arg *arg) { - if(!arg || !arg->v || arg->v != lt[selmon->sellt]) + if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) selmon->sellt ^= 1; if(arg && arg->v) - lt[selmon->sellt] = (Layout *)arg->v; + selmon->lt[selmon->sellt] = (Layout *)arg->v; if(selmon->sel) arrange(); else @@ -1411,7 +1411,7 @@ void setmfact(const Arg *arg) { float f; - if(!arg || !lt[selmon->sellt]->arrange) + if(!arg || !selmon->lt[selmon->sellt]->arrange) return; f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; if(f < 0.1 || f > 0.9) @@ -1433,8 +1433,6 @@ setup(void) { sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); bh = dc.h = dc.font.height + 2; - lt[0] = &layouts[0]; - lt[1] = &layouts[1 % LENGTH(layouts)]; updategeom(); /* init atoms */ wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); @@ -1484,7 +1482,7 @@ showhide(Client *c) { return; if(ISVISIBLE(c)) { /* show clients top down */ XMoveWindow(dpy, c->win, c->x, c->y); - if(!lt[c->mon->sellt]->arrange || c->isfloating) + if(!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) resize(c, c->x, c->y, c->w, c->h, False); showhide(c->snext); } @@ -1730,6 +1728,8 @@ updategeom(void) { m->mfact = mfact; m->showbar = SHOWBAR; m->topbar = TOPBAR; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; updatebarpos(m); } /* reassign left over clients of disappeared monitors */ @@ -1916,8 +1916,8 @@ void zoom(const Arg *arg) { Client *c = selmon->sel; - if(!lt[selmon->sellt]->arrange - || lt[selmon->sellt]->arrange == monocle + if(!selmon->lt[selmon->sellt]->arrange + || selmon->lt[selmon->sellt]->arrange == monocle || (selmon->sel && selmon->sel->isfloating)) return; if(c == nexttiled(selmon->clients)) |