t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 9d739090750ffb3b3a64e86e2331215b8901c360
   DIR parent 016c54196e682ae8658854febb746b0437a010dc
   URI Author: Anselm R. Garbe <arg@10kloc.org>
       Date:   Tue, 29 Aug 2006 13:40:09 +0200
       
       still something wrong with reorder()
       Diffstat:
         M client.c                            |       5 ++++-
         M dwm.h                               |       3 +--
         M tag.c                               |       6 ++----
         M view.c                              |      75 +++++++++++--------------------
       
       4 files changed, 33 insertions(+), 56 deletions(-)
       ---
   DIR diff --git a/client.c b/client.c
       t@@ -241,7 +241,10 @@ manage(Window w, XWindowAttributes *wa)
                                || (c->maxw && c->minw &&
                                        c->maxw == c->minw && c->maxh == c->minh);
        
       -        attach(c);
       +        if(clients)
       +                clients->prev = c;
       +        c->next = clients;
       +        clients = c;
        
                settitle(c);
                if(isvisible(c))
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -56,7 +56,7 @@ struct Client {
                int basew, baseh, incw, inch, maxw, maxh, minw, minh;
                int grav;
                long flags; 
       -        unsigned int border;
       +        unsigned int border, weight;
                Bool isfloat;
                Bool ismax;
                Bool *tags;
       t@@ -127,7 +127,6 @@ extern void *erealloc(void *ptr, unsigned int size);
        extern void spawn(Arg *arg);
        
        /* view.c */
       -extern void attach(Client *c);
        extern void detach(Client *c);
        extern void dofloat(Arg *arg);
        extern void dotile(Arg *arg);
   DIR diff --git a/tag.c b/tag.c
       t@@ -106,6 +106,8 @@ settags(Client *c)
                if(!matched)
                        for(i = 0; i < ntags; i++)
                                c->tags[i] = seltag[i];
       +        for(i = 0; i < ntags && !c->tags[i]; i++);
       +        c->weight = i;
        }
        
        void
       t@@ -120,8 +122,6 @@ tag(Arg *arg)
                        sel->tags[i] = False;
                sel->tags[arg->i] = True;
                settitle(sel);
       -        detach(sel);
       -        attach(sel);
                if(!isvisible(sel))
                        arrange(NULL);
                else
       t@@ -141,8 +141,6 @@ toggletag(Arg *arg)
                if(i == ntags)
                        sel->tags[arg->i] = True;
                settitle(sel);
       -        detach(sel);
       -        attach(sel);
                if(!isvisible(sel))
                        arrange(NULL);
                else
   DIR diff --git a/view.c b/view.c
       t@@ -6,62 +6,34 @@
        
        /* static */
        
       -static Client *
       -getslot(Client *c)
       +static void
       +reorder()
        {
       -        unsigned int i, tic;
       -        Client *p;
       -
       -        for(tic = 0; tic < ntags && !c->tags[tic]; tic++);
       -        for(p = clients; p; p = p->next) {
       -                for(i = 0; i < ntags && !p->tags[i]; i++);
       -                if(tic < i)
       -                        return p;
       -        }
       -        return p;
       -}
       +        Client *c, *orig, *p;
        
       -static Client *
       -tail()
       -{
       -        Client *c;
       -        for(c = clients; c && c->next; c = c->next);
       -        return c;
       -}
       +        orig = clients;
       +        clients = NULL;
        
       -/* extern */
       +        while((c = orig)) {
       +                orig = orig->next;
       +                detach(c);
        
       -void (*arrange)(Arg *) = DEFMODE;
       -
       -void
       -attach(Client *c)
       -{
       -        Client *p;
       -
       -        if(!clients) {
       -                clients = c;
       -                return;
       -        }
       -        if(!(p = getnext(clients)) && !(p = getslot(c))) {
       -                p = tail();
       +                for(p = clients; p && p->next && p->weight <= c->weight; p = p->next);
                        c->prev = p;
       -                p->next = c;
       -                return;
       -        }
       -
       -        if(p == clients) {
       -                c->next = clients;
       -                clients->prev = c;
       -                clients = c;
       -        }
       -        else {
       -                p->prev->next = c;
       -                c->prev = p->prev;
       -                p->prev = c;
       -                c->next = p;
       +                if(p) {
       +                        if((c->next = p->next))
       +                                c->next->prev = c;
       +                        p->next = c;
       +                }
       +                else
       +                        clients = c;
                }
        }
        
       +/* extern */
       +
       +void (*arrange)(Arg *) = DEFMODE;
       +
        void
        detach(Client *c)
        {
       t@@ -277,6 +249,7 @@ toggleview(Arg *arg)
                for(i = 0; i < ntags && !seltag[i]; i++);
                if(i == ntags)
                        seltag[arg->i] = True; /* cannot toggle last view */
       +        reorder();
                arrange(NULL);
        }
        
       t@@ -284,10 +257,12 @@ void
        view(Arg *arg)
        {
                unsigned int i;
       +        Client *c;
        
                for(i = 0; i < ntags; i++)
                        seltag[i] = False;
                seltag[arg->i] = True;
       +        reorder();
                arrange(NULL);
        }
        
       t@@ -303,7 +278,9 @@ zoom(Arg *arg)
                        if(!(c = getnext(c->next)))
                                return;
                detach(c);
       -        attach(c);
       +        c->next = clients;
       +        clients->prev = c;
       +        clients = c;
                focus(c);
                arrange(NULL);
        }