t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 8a6679b3b4999559059df3ae9e08951099511036
   DIR parent 7b6d5ff29863e4bc7ba787357133ffb9bc5157e6
   URI Author: Anselm R. Garbe <arg@10kloc.org>
       Date:   Tue, 29 Aug 2006 09:23:44 +0200
       
       added attach/detach functions which don't attach at the begin of list, but at the slot of a first match of the tags of a client
       Diffstat:
         M client.c                            |      16 ++++------------
         M dwm.h                               |       2 ++
         M view.c                              |      63 ++++++++++++++++++++++---------
       
       3 files changed, 52 insertions(+), 29 deletions(-)
       ---
   DIR diff --git a/client.c b/client.c
       t@@ -230,13 +230,7 @@ manage(Window w, XWindowAttributes *wa)
                                DefaultVisual(dpy, screen),
                                CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
        
       -        if(clients)
       -                clients->prev = c;
       -        c->next = clients;
       -        clients = c;
       -
                grabbuttons(c, False);
       -
                if((tc = getclient(trans))) /* inherit tags */
                        for(i = 0; i < ntags; i++)
                                c->tags[i] = tc->tags[i];
       t@@ -246,6 +240,9 @@ manage(Window w, XWindowAttributes *wa)
                        c->isfloat = trans
                                || (c->maxw && c->minw &&
                                        c->maxw == c->minw && c->maxh == c->minh);
       +
       +        attach(c);
       +
                settitle(c);
                if(isvisible(c))
                        sel = c;
       t@@ -407,12 +404,7 @@ unmanage(Client *c)
                XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
                XDestroyWindow(dpy, c->twin);
        
       -        if(c->prev)
       -                c->prev->next = c->next;
       -        if(c->next)
       -                c->next->prev = c->prev;
       -        if(c == clients)
       -                clients = c->next;
       +        detach(c);
                if(sel == c) {
                        if(trans && (tc = getclient(trans)) && isvisible(tc))
                                sel = tc;
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -127,6 +127,8 @@ 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);
        extern void focusnext(Arg *arg);
   DIR diff --git a/view.c b/view.c
       t@@ -9,6 +9,45 @@
        void (*arrange)(Arg *) = DEFMODE;
        
        void
       +attach(Client *c)
       +{
       +        Client *first = getnext(clients);
       +
       +        if(!first) {
       +                if(clients) {
       +                        for(first = clients; first->next; first = first->next);
       +                        first->next = c;
       +                        c->prev = first;
       +                }
       +                else
       +                        clients = c;
       +        }
       +        else if(first == clients) {
       +                c->next = clients;
       +                clients->prev = c;
       +                clients = c;
       +        }
       +        else {
       +                first->prev->next = c;
       +                c->prev = first->prev;
       +                first->prev = c;
       +                c->next = first;
       +        }
       +}
       +
       +void
       +detach(Client *c)
       +{
       +        if(c->prev)
       +                c->prev->next = c->next;
       +        if(c->next)
       +                c->next->prev = c->prev;
       +        if(c == clients)
       +                clients = c->next;
       +        c->next = c->prev = NULL;
       +}
       +
       +void
        dofloat(Arg *arg)
        {
                Client *c;
       t@@ -228,26 +267,16 @@ view(Arg *arg)
        void
        zoom(Arg *arg)
        {
       -        Client *c;
       +        Client *c = sel;
        
       -        if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax)
       +        if(!c || (arrange != dotile) || c->isfloat || c->ismax)
                        return;
        
       -        if(sel == getnext(clients))  {
       -                if((c = getnext(sel->next)))
       -                        sel = c;
       -                else
       +        if(c == getnext(clients))
       +                if(!(c = getnext(c->next)))
                                return;
       -        }
       -
       -        /* pop */
       -        sel->prev->next = sel->next;
       -        if(sel->next)
       -                sel->next->prev = sel->prev;
       -        sel->prev = NULL;
       -        clients->prev = sel;
       -        sel->next = clients;
       -        clients = sel;
       -        focus(sel);
       +        detach(c);
       +        attach(c);
       +        focus(c);
                arrange(NULL);
        }