t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 9e8dd3479da9f484c9aa37adcd327989149e89ef
   DIR parent 0b72be924d3f0daa63e45a09951d6cb6cc9b335e
   URI Author: Anselm R Garbe <anselm@garbe.us>
       Date:   Sun, 27 Sep 2009 10:31:14 +0100
       
       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
       Diffstat:
         M config.mk                           |       2 +-
         M dwm.c                               |      66 ++++++++++++++++++-------------
       
       2 files changed, 39 insertions(+), 29 deletions(-)
       ---
   DIR diff --git a/config.mk b/config.mk
       t@@ -1,5 +1,5 @@
        # dwm version
       -VERSION = 5.7
       +VERSION = 5.7.1
        
        # Customize below to fit your system
        
   DIR diff --git a/dwm.c b/dwm.c
       t@@ -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);
       -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);
       t@@ -379,18 +380,24 @@ applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) {
        }
        
        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
       t@@ -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);
       -                        arrange();
       +                        arrange(NULL);
                        }
                }
        }
       t@@ -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);
       -        arrange();
       +        arrange(c->mon);
        }
        
        void
       t@@ -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)))
       -                                arrange();
       +                                arrange(c->mon);
                                break;
                        case XA_WM_NORMAL_HINTS:
                                updatesizehints(c);
       t@@ -1360,7 +1367,7 @@ restack(Monitor *m) {
                XEvent ev;
                XWindowChanges wc;
        
       -        drawbars();
       +        drawbar(m);
                if(!m->sel)
                        return;
                if(m->sel->isfloating || !m->lt[m->sellt]->arrange)
       t@@ -1427,7 +1434,7 @@ sendmon(Client *c, Monitor *m) {
                attach(c);
                attachstack(c);
                focus(NULL);
       -        arrange();
       +        arrange(NULL);
        }
        
        void
       t@@ -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 */
       t@@ -1461,7 +1470,7 @@ setmfact(const Arg *arg) {
                if(f < 0.1 || f > 0.9)
                        return;
                selmon->mfact = f;
       -        arrange();
       +        arrange(selmon);
        }
        
        void
       t@@ -1558,7 +1567,7 @@ void
        tag(const Arg *arg) {
                if(selmon->sel && arg->ui & TAGMASK) {
                        selmon->sel->tags = arg->ui & TAGMASK;
       -                arrange();
       +                arrange(selmon);
                }
        }
        
       t@@ -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
       t@@ -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);
       -        arrange();
       +        arrange(selmon);
        }
        
        void
       t@@ -1638,7 +1647,7 @@ toggletag(const Arg *arg) {
                newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
                if(newtags) {
                        selmon->sel->tags = newtags;
       -                arrange();
       +                arrange(selmon);
                }
        }
        
       t@@ -1648,7 +1657,7 @@ toggleview(const Arg *arg) {
        
                if(newtagset) {
                        selmon->tagset[selmon->seltags] = newtagset;
       -                arrange();
       +                arrange(selmon);
                }
        }
        
       t@@ -1663,6 +1672,7 @@ unfocus(Client *c) {
        
        void
        unmanage(Client *c, Bool destroyed) {
       +        Monitor *m = c->mon;
                XWindowChanges wc;
        
                /* The server grab construct avoids race conditions. */
       t@@ -1681,7 +1691,7 @@ unmanage(Client *c, Bool destroyed) {
                }
                free(c);
                focus(NULL);
       -        arrange();
       +        arrange(m);
        }
        
        void
       t@@ -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;
       -        arrange();
       +        arrange(selmon);
        }
        
        Client *
       t@@ -1986,7 +1996,7 @@ zoom(const Arg *arg) {
                detach(c);
                attach(c);
                focus(c);
       -        arrange();
       +        arrange(c->mon);
        }
        
        int