fixed the layout symbol bug reported by Nibble (but using a different approach as he suggested) - optimised drawbar() and arrange() handling for multiple monitors, arrange only arranges the relevant monitors when applicable, same with drawbar - need to release 5.7.1
@@ -152,7 +152,8 @@
/* function declarations */ static void applyrules(Client *c); static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact); -static void arrange(void); +static void arrange(Monitor *m); +static void arrangemon(Monitor *m); static void attach(Client *c); static void attachstack(Client *c); static void buttonpress(XEvent *e);@@ -379,18 +380,24 @@ return *x != c->x || *y != c->y || *w != c->w || *h != c->h;
} void -arrange(void) { - Monitor *m; - - for(m = mons; m; m = m->next) +arrange(Monitor *m) { + if(m) + showhide(m->stack); + else for(m = mons; m; m = m->next) showhide(m->stack); focus(NULL); - for(m = mons; m; m = m->next) { - strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); - if(m->lt[m->sellt]->arrange) - m->lt[m->sellt]->arrange(m); - restack(m); - } + if(m) + arrangemon(m); + else for(m = mons; m; m = m->next) + arrangemon(m); +} + +void +arrangemon(Monitor *m) { + strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); + if(m->lt[m->sellt]->arrange) + m->lt[m->sellt]->arrange(m); + restack(m); } void@@ -546,7 +553,7 @@ dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
updatebars(); for(m = mons; m; m = m->next) XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); - arrange(); + arrange(NULL); } } }@@ -1139,7 +1146,7 @@ attachstack(c);
XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ XMapWindow(dpy, c->win); setclientstate(c, NormalState); - arrange(); + arrange(c->mon); } void@@ -1265,7 +1272,7 @@ default: break;
case XA_WM_TRANSIENT_FOR: XGetTransientForHint(dpy, c->win, &trans); if(!c->isfloating && (c->isfloating = (wintoclient(trans) != NULL))) - arrange(); + arrange(c->mon); break; case XA_WM_NORMAL_HINTS: updatesizehints(c);@@ -1360,7 +1367,7 @@ Client *c;
XEvent ev; XWindowChanges wc; - drawbars(); + drawbar(m); if(!m->sel) return; if(m->sel->isfloating || !m->lt[m->sellt]->arrange)@@ -1427,7 +1434,7 @@ c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
attach(c); attachstack(c); focus(NULL); - arrange(); + arrange(NULL); } void@@ -1442,12 +1449,14 @@ void
setlayout(const Arg *arg) { if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) selmon->sellt ^= 1; - if(arg && arg->v) + if(arg && arg->v) { selmon->lt[selmon->sellt] = (Layout *)arg->v; + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + } if(selmon->sel) - arrange(); + arrange(selmon); else - drawbars(); + drawbar(selmon); } /* arg > 1.0 will set mfact absolutly */@@ -1461,7 +1470,7 @@ f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
if(f < 0.1 || f > 0.9) return; selmon->mfact = f; - arrange(); + arrange(selmon); } void@@ -1558,7 +1567,7 @@ void
tag(const Arg *arg) { if(selmon->sel && arg->ui & TAGMASK) { selmon->sel->tags = arg->ui & TAGMASK; - arrange(); + arrange(selmon); } }@@ -1615,7 +1624,7 @@ togglebar(const Arg *arg) {
selmon->showbar = !selmon->showbar; updatebarpos(selmon); XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); - arrange(); + arrange(selmon); } void@@ -1626,7 +1635,7 @@ selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed;
if(selmon->sel->isfloating) resize(selmon->sel, selmon->sel->x, selmon->sel->y, selmon->sel->w, selmon->sel->h, False); - arrange(); + arrange(selmon); } void@@ -1638,7 +1647,7 @@ return;
newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); if(newtags) { selmon->sel->tags = newtags; - arrange(); + arrange(selmon); } }@@ -1648,7 +1657,7 @@ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
if(newtagset) { selmon->tagset[selmon->seltags] = newtagset; - arrange(); + arrange(selmon); } }@@ -1663,6 +1672,7 @@ }
void unmanage(Client *c, Bool destroyed) { + Monitor *m = c->mon; XWindowChanges wc; /* The server grab construct avoids race conditions. */@@ -1681,7 +1691,7 @@ XUngrabServer(dpy);
} free(c); focus(NULL); - arrange(); + arrange(m); } void@@ -1908,7 +1918,7 @@ return;
selmon->seltags ^= 1; /* toggle sel tagset */ if(arg->ui & TAGMASK) selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; - arrange(); + arrange(selmon); } Client *@@ -1986,7 +1996,7 @@ return;
detach(c); attach(c); focus(c); - arrange(); + arrange(c->mon); } int