JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fixed the layout symbol bug reported by Nibble (but using a different approach as...
authorAnselm R Garbe <anselm@garbe.us>
Sun, 27 Sep 2009 09:31:14 +0000 (10:31 +0100)
committerAnselm R Garbe <anselm@garbe.us>
Sun, 27 Sep 2009 09:31:14 +0000 (10:31 +0100)
- 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

config.mk
dwm.c

index 086424d..bb55cfa 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -1,5 +1,5 @@
 # dwm version
 # dwm version
-VERSION = 5.7
+VERSION = 5.7.1
 
 # Customize below to fit your system
 
 
 # Customize below to fit your system
 
diff --git a/dwm.c b/dwm.c
index 5199e71..b3a389d 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -152,7 +152,8 @@ typedef struct {
 /* function declarations */
 static void applyrules(Client *c);
 static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact);
 /* 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);
 static void attach(Client *c);
 static void attachstack(Client *c);
 static void buttonpress(XEvent *e);
@@ -379,18 +380,24 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) {
 }
 
 void
 }
 
 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);
                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
 }
 
 void
@@ -546,7 +553,7 @@ configurenotify(XEvent *e) {
                        updatebars();
                        for(m = mons; m; m = m->next)
                                XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
                        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 @@ manage(Window w, XWindowAttributes *wa) {
        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);
        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
 }
 
 void
@@ -1265,7 +1272,7 @@ propertynotify(XEvent *e) {
                case XA_WM_TRANSIENT_FOR:
                        XGetTransientForHint(dpy, c->win, &trans);
                        if(!c->isfloating && (c->isfloating = (wintoclient(trans) != NULL)))
                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);
                        break;
                case XA_WM_NORMAL_HINTS:
                        updatesizehints(c);
@@ -1360,7 +1367,7 @@ restack(Monitor *m) {
        XEvent ev;
        XWindowChanges wc;
 
        XEvent ev;
        XWindowChanges wc;
 
-       drawbars();
+       drawbar(m);
        if(!m->sel)
                return;
        if(m->sel->isfloating || !m->lt[m->sellt]->arrange)
        if(!m->sel)
                return;
        if(m->sel->isfloating || !m->lt[m->sellt]->arrange)
@@ -1427,7 +1434,7 @@ sendmon(Client *c, Monitor *m) {
        attach(c);
        attachstack(c);
        focus(NULL);
        attach(c);
        attachstack(c);
        focus(NULL);
-       arrange();
+       arrange(NULL);
 }
 
 void
 }
 
 void
@@ -1442,12 +1449,14 @@ void
 setlayout(const Arg *arg) {
        if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
                selmon->sellt ^= 1;
 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;
                selmon->lt[selmon->sellt] = (Layout *)arg->v;
+               strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
+       }
        if(selmon->sel)
        if(selmon->sel)
-               arrange();
+               arrange(selmon);
        else
        else
-               drawbars();
+               drawbar(selmon);
 }
 
 /* arg > 1.0 will set mfact absolutly */
 }
 
 /* arg > 1.0 will set mfact absolutly */
@@ -1461,7 +1470,7 @@ setmfact(const Arg *arg) {
        if(f < 0.1 || f > 0.9)
                return;
        selmon->mfact = f;
        if(f < 0.1 || f > 0.9)
                return;
        selmon->mfact = f;
-       arrange();
+       arrange(selmon);
 }
 
 void
 }
 
 void
@@ -1558,7 +1567,7 @@ void
 tag(const Arg *arg) {
        if(selmon->sel && arg->ui & TAGMASK) {
                selmon->sel->tags = arg->ui & TAGMASK;
 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);
        selmon->showbar = !selmon->showbar;
        updatebarpos(selmon);
        XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
-       arrange();
+       arrange(selmon);
 }
 
 void
 }
 
 void
@@ -1626,7 +1635,7 @@ togglefloating(const Arg *arg) {
        if(selmon->sel->isfloating)
                resize(selmon->sel, selmon->sel->x, selmon->sel->y,
                       selmon->sel->w, selmon->sel->h, False);
        if(selmon->sel->isfloating)
                resize(selmon->sel, selmon->sel->x, selmon->sel->y,
                       selmon->sel->w, selmon->sel->h, False);
-       arrange();
+       arrange(selmon);
 }
 
 void
 }
 
 void
@@ -1638,7 +1647,7 @@ toggletag(const Arg *arg) {
        newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
        if(newtags) {
                selmon->sel->tags = newtags;
        newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
        if(newtags) {
                selmon->sel->tags = newtags;
-               arrange();
+               arrange(selmon);
        }
 }
 
        }
 }
 
@@ -1648,7 +1657,7 @@ toggleview(const Arg *arg) {
 
        if(newtagset) {
                selmon->tagset[selmon->seltags] = newtagset;
 
        if(newtagset) {
                selmon->tagset[selmon->seltags] = newtagset;
-               arrange();
+               arrange(selmon);
        }
 }
 
        }
 }
 
@@ -1663,6 +1672,7 @@ unfocus(Client *c) {
 
 void
 unmanage(Client *c, Bool destroyed) {
 
 void
 unmanage(Client *c, Bool destroyed) {
+       Monitor *m = c->mon;
        XWindowChanges wc;
 
        /* The server grab construct avoids race conditions. */
        XWindowChanges wc;
 
        /* The server grab construct avoids race conditions. */
@@ -1681,7 +1691,7 @@ unmanage(Client *c, Bool destroyed) {
        }
        free(c);
        focus(NULL);
        }
        free(c);
        focus(NULL);
-       arrange();
+       arrange(m);
 }
 
 void
 }
 
 void
@@ -1908,7 +1918,7 @@ view(const Arg *arg) {
        selmon->seltags ^= 1; /* toggle sel tagset */
        if(arg->ui & TAGMASK)
                selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
        selmon->seltags ^= 1; /* toggle sel tagset */
        if(arg->ui & TAGMASK)
                selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-       arrange();
+       arrange(selmon);
 }
 
 Client *
 }
 
 Client *
@@ -1986,7 +1996,7 @@ zoom(const Arg *arg) {
        detach(c);
        attach(c);
        focus(c);
        detach(c);
        attach(c);
        focus(c);
-       arrange();
+       arrange(c->mon);
 }
 
 int
 }
 
 int