t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit aa13727067af829b94461eb36aa029297ed8e6b9
   DIR parent 595028614bc94c1733b28725dcf9777b0a47ad24
   URI Author: Anselm R. Garbe <arg@10kloc.org>
       Date:   Tue, 22 Aug 2006 16:50:21 +0200
       
       separated several functions into view.c
       Diffstat:
         M Makefile                            |       2 +-
         M client.c                            |      61 -------------------------------
         M dwm.h                               |      22 ++++++++++++----------
         M tag.c                               |     186 -------------------------------
         A view.c                              |     253 +++++++++++++++++++++++++++++++
       
       5 files changed, 266 insertions(+), 258 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       t@@ -3,7 +3,7 @@
        
        include config.mk
        
       -SRC = client.c draw.c event.c main.c tag.c util.c
       +SRC = client.c draw.c event.c main.c tag.c util.c view.c
        OBJ = ${SRC:.c=.o}
        
        all: options dwm
   DIR diff --git a/client.c b/client.c
       t@@ -89,40 +89,6 @@ focus(Client *c)
                XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
        }
        
       -void
       -focusnext(Arg *arg)
       -{
       -        Client *c;
       -   
       -        if(!sel)
       -                return;
       -
       -        if(!(c = getnext(sel->next)))
       -                c = getnext(clients);
       -        if(c) {
       -                focus(c);
       -                restack();
       -        }
       -}
       -
       -void
       -focusprev(Arg *arg)
       -{
       -        Client *c;
       -
       -        if(!sel)
       -                return;
       -
       -        if(!(c = getprev(sel->prev))) {
       -                for(c = clients; c && c->next; c = c->next);
       -                c = getprev(c);
       -        }
       -        if(c) {
       -                focus(c);
       -                restack();
       -        }
       -}
       -
        Client *
        getclient(Window w)
        {
       t@@ -446,30 +412,3 @@ unmanage(Client *c)
                        focus(sel);
                arrange(NULL);
        }
       -
       -void
       -zoom(Arg *arg)
       -{
       -        Client *c;
       -
       -        if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax)
       -                return;
       -
       -        if(sel == getnext(clients))  {
       -                if((c = getnext(sel->next)))
       -                        sel = c;
       -                else
       -                        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);
       -        arrange(NULL);
       -}
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -84,8 +84,6 @@ extern Window root, barwin;
        /* client.c */
        extern void ban(Client *c);
        extern void focus(Client *c);
       -extern void focusnext(Arg *arg);
       -extern void focusprev(Arg *arg);
        extern Client *getclient(Window w);
        extern Client *getctitle(Window w);
        extern void gravitate(Client *c, Bool invert);
       t@@ -96,7 +94,6 @@ extern void setsize(Client *c);
        extern void settitle(Client *c);
        extern void togglemax(Arg *arg);
        extern void unmanage(Client *c);
       -extern void zoom(Arg *arg);
        
        /* draw.c */
        extern void drawall();
       t@@ -117,22 +114,27 @@ extern void sendevent(Window w, Atom a, long value);
        extern int xerror(Display *dsply, XErrorEvent *ee);
        
        /* tag.c */
       -extern void dofloat(Arg *arg);
       -extern void dotile(Arg *arg);
        extern void initrregs();
       -extern Bool isvisible(Client *c);
        extern Client *getnext(Client *c);
        extern Client *getprev(Client *c);
       -extern void restack();
        extern void settags(Client *c);
        extern void tag(Arg *arg);
       -extern void togglemode(Arg *arg);
        extern void toggletag(Arg *arg);
       -extern void toggleview(Arg *arg);
       -extern void view(Arg *arg);
        
        /* util.c */
        extern void *emallocz(unsigned int size);
        extern void eprint(const char *errstr, ...);
        extern void *erealloc(void *ptr, unsigned int size);
        extern void spawn(Arg *arg);
       +
       +/* view.c */
       +extern void dofloat(Arg *arg);
       +extern void dotile(Arg *arg);
       +extern void focusnext(Arg *arg);
       +extern void focusprev(Arg *arg);
       +extern Bool isvisible(Client *c);
       +extern void restack();
       +extern void togglemode(Arg *arg);
       +extern void toggleview(Arg *arg);
       +extern void view(Arg *arg);
       +extern void zoom(Arg *arg);
   DIR diff --git a/tag.c b/tag.c
       t@@ -30,97 +30,8 @@ RULES
        static RReg *rreg = NULL;
        static unsigned int len = 0;
        
       -void (*arrange)(Arg *) = DEFMODE;
       -
        /* extern */
        
       -void
       -dofloat(Arg *arg)
       -{
       -        Client *c;
       -
       -        for(c = clients; c; c = c->next) {
       -                c->ismax = False;
       -                if(isvisible(c)) {
       -                        resize(c, True, TopLeft);
       -                }
       -                else
       -                        ban(c);
       -        }
       -        if(!sel || !isvisible(sel))
       -                sel = getnext(clients);
       -        if(sel)
       -                focus(sel);
       -        else
       -                XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
       -        restack();
       -}
       -
       -void
       -dotile(Arg *arg)
       -{
       -        int h, i, n, w;
       -        Client *c;
       -
       -        w = sw - mw;
       -        for(n = 0, c = clients; c; c = c->next)
       -                if(isvisible(c) && !c->isfloat)
       -                        n++;
       -
       -        if(n > 1)
       -                h = (sh - bh) / (n - 1);
       -        else
       -                h = sh - bh;
       -
       -        for(i = 0, c = clients; c; c = c->next) {
       -                c->ismax = False;
       -                if(isvisible(c)) {
       -                        if(c->isfloat) {
       -                                resize(c, True, TopLeft);
       -                                continue;
       -                        }
       -                        if(n == 1) {
       -                                c->x = sx;
       -                                c->y = sy + bh;
       -                                c->w = sw - 2;
       -                                c->h = sh - 2 - bh;
       -                        }
       -                        else if(i == 0) {
       -                                c->x = sx;
       -                                c->y = sy + bh;
       -                                c->w = mw - 2;
       -                                c->h = sh - 2 - bh;
       -                        }
       -                        else if(h > bh) {
       -                                c->x = sx + mw;
       -                                c->y = sy + (i - 1) * h + bh;
       -                                c->w = w - 2;
       -                                if(i + 1 == n)
       -                                        c->h = sh - c->y - 2;
       -                                else
       -                                        c->h = h - 2;
       -                        }
       -                        else { /* fallback if h < bh */
       -                                c->x = sx + mw;
       -                                c->y = sy + bh;
       -                                c->w = w - 2;
       -                                c->h = sh - 2 - bh;
       -                        }
       -                        resize(c, False, TopLeft);
       -                        i++;
       -                }
       -                else
       -                        ban(c);
       -        }
       -        if(!sel || !isvisible(sel))
       -                sel = getnext(clients);
       -        if(sel)
       -                focus(sel);
       -        else
       -                XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
       -        restack();
       -}
       -
        Client *
        getnext(Client *c)
        {
       t@@ -164,69 +75,6 @@ initrregs()
                }
        }
        
       -Bool
       -isvisible(Client *c)
       -{
       -        unsigned int i;
       -
       -        for(i = 0; i < ntags; i++)
       -                if(c->tags[i] && seltag[i])
       -                        return True;
       -        return False;
       -}
       -
       -void
       -restack()
       -{
       -        static unsigned int nwins = 0;
       -        static Window *wins = NULL;
       -        unsigned int f, fi, m, mi, n;
       -        Client *c;
       -        XEvent ev;
       -
       -        for(f = 0, m = 0, c = clients; c; c = c->next)
       -                if(isvisible(c)) {
       -                        if(c->isfloat || arrange == dofloat)
       -                                f++;
       -                        else
       -                                m++;
       -                }
       -        if(!(n = 2 * (f + m))) {
       -                drawstatus();
       -                return;
       -        }
       -        if(nwins < n) {
       -                nwins = n;
       -                wins = erealloc(wins, nwins * sizeof(Window));
       -        }
       -
       -        fi = 0;
       -        mi = 2 * f;
       -        if(sel->isfloat || arrange == dofloat) {
       -                wins[fi++] = sel->title;
       -                wins[fi++] = sel->win;
       -        }
       -        else {
       -                wins[mi++] = sel->title;
       -                wins[mi++] = sel->win;
       -        }
       -        for(c = clients; c; c = c->next)
       -                if(isvisible(c) && c != sel) {
       -                        if(c->isfloat || arrange == dofloat) {
       -                                wins[fi++] = c->title;
       -                                wins[fi++] = c->win;
       -                        }
       -                        else {
       -                                wins[mi++] = c->title;
       -                                wins[mi++] = c->win;
       -                        }
       -                }
       -        XRestackWindows(dpy, wins, n);
       -        drawall();
       -        XSync(dpy, False);
       -        while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
       -}
       -
        void
        settags(Client *c)
        {
       t@@ -277,16 +125,6 @@ tag(Arg *arg)
        }
        
        void
       -togglemode(Arg *arg)
       -{
       -        arrange = arrange == dofloat ? dotile : dofloat;
       -        if(sel)
       -                arrange(NULL);
       -        else
       -                drawstatus();
       -}
       -
       -void
        toggletag(Arg *arg)
        {
                unsigned int i;
       t@@ -302,27 +140,3 @@ toggletag(Arg *arg)
                if(!isvisible(sel))
                        arrange(NULL);
        }
       -
       -
       -void
       -toggleview(Arg *arg)
       -{
       -        unsigned int i;
       -
       -        seltag[arg->i] = !seltag[arg->i];
       -        for(i = 0; i < ntags && !seltag[i]; i++);
       -        if(i == ntags)
       -                seltag[arg->i] = True; /* cannot toggle last view */
       -        arrange(NULL);
       -}
       -
       -void
       -view(Arg *arg)
       -{
       -        unsigned int i;
       -
       -        for(i = 0; i < ntags; i++)
       -                seltag[i] = False;
       -        seltag[arg->i] = True;
       -        arrange(NULL);
       -}
   DIR diff --git a/view.c b/view.c
       t@@ -0,0 +1,253 @@
       +/*
       + * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
       + * See LICENSE file for license details.
       + */
       +#include "dwm.h"
       +
       +/* extern */
       +
       +void (*arrange)(Arg *) = DEFMODE;
       +
       +void
       +dofloat(Arg *arg)
       +{
       +        Client *c;
       +
       +        for(c = clients; c; c = c->next) {
       +                c->ismax = False;
       +                if(isvisible(c)) {
       +                        resize(c, True, TopLeft);
       +                }
       +                else
       +                        ban(c);
       +        }
       +        if(!sel || !isvisible(sel))
       +                sel = getnext(clients);
       +        if(sel)
       +                focus(sel);
       +        else
       +                XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
       +        restack();
       +}
       +
       +void
       +dotile(Arg *arg)
       +{
       +        int h, i, n, w;
       +        Client *c;
       +
       +        w = sw - mw;
       +        for(n = 0, c = clients; c; c = c->next)
       +                if(isvisible(c) && !c->isfloat)
       +                        n++;
       +
       +        if(n > 1)
       +                h = (sh - bh) / (n - 1);
       +        else
       +                h = sh - bh;
       +
       +        for(i = 0, c = clients; c; c = c->next) {
       +                c->ismax = False;
       +                if(isvisible(c)) {
       +                        if(c->isfloat) {
       +                                resize(c, True, TopLeft);
       +                                continue;
       +                        }
       +                        if(n == 1) {
       +                                c->x = sx;
       +                                c->y = sy + bh;
       +                                c->w = sw - 2;
       +                                c->h = sh - 2 - bh;
       +                        }
       +                        else if(i == 0) {
       +                                c->x = sx;
       +                                c->y = sy + bh;
       +                                c->w = mw - 2;
       +                                c->h = sh - 2 - bh;
       +                        }
       +                        else if(h > bh) {
       +                                c->x = sx + mw;
       +                                c->y = sy + (i - 1) * h + bh;
       +                                c->w = w - 2;
       +                                if(i + 1 == n)
       +                                        c->h = sh - c->y - 2;
       +                                else
       +                                        c->h = h - 2;
       +                        }
       +                        else { /* fallback if h < bh */
       +                                c->x = sx + mw;
       +                                c->y = sy + bh;
       +                                c->w = w - 2;
       +                                c->h = sh - 2 - bh;
       +                        }
       +                        resize(c, False, TopLeft);
       +                        i++;
       +                }
       +                else
       +                        ban(c);
       +        }
       +        if(!sel || !isvisible(sel))
       +                sel = getnext(clients);
       +        if(sel)
       +                focus(sel);
       +        else
       +                XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
       +        restack();
       +}
       +
       +void
       +focusnext(Arg *arg)
       +{
       +        Client *c;
       +   
       +        if(!sel)
       +                return;
       +
       +        if(!(c = getnext(sel->next)))
       +                c = getnext(clients);
       +        if(c) {
       +                focus(c);
       +                restack();
       +        }
       +}
       +
       +void
       +focusprev(Arg *arg)
       +{
       +        Client *c;
       +
       +        if(!sel)
       +                return;
       +
       +        if(!(c = getprev(sel->prev))) {
       +                for(c = clients; c && c->next; c = c->next);
       +                c = getprev(c);
       +        }
       +        if(c) {
       +                focus(c);
       +                restack();
       +        }
       +}
       +
       +Bool
       +isvisible(Client *c)
       +{
       +        unsigned int i;
       +
       +        for(i = 0; i < ntags; i++)
       +                if(c->tags[i] && seltag[i])
       +                        return True;
       +        return False;
       +}
       +
       +void
       +restack()
       +{
       +        static unsigned int nwins = 0;
       +        static Window *wins = NULL;
       +        unsigned int f, fi, m, mi, n;
       +        Client *c;
       +        XEvent ev;
       +
       +        for(f = 0, m = 0, c = clients; c; c = c->next)
       +                if(isvisible(c)) {
       +                        if(c->isfloat || arrange == dofloat)
       +                                f++;
       +                        else
       +                                m++;
       +                }
       +        if(!(n = 2 * (f + m))) {
       +                drawstatus();
       +                return;
       +        }
       +        if(nwins < n) {
       +                nwins = n;
       +                wins = erealloc(wins, nwins * sizeof(Window));
       +        }
       +
       +        fi = 0;
       +        mi = 2 * f;
       +        if(sel->isfloat || arrange == dofloat) {
       +                wins[fi++] = sel->title;
       +                wins[fi++] = sel->win;
       +        }
       +        else {
       +                wins[mi++] = sel->title;
       +                wins[mi++] = sel->win;
       +        }
       +        for(c = clients; c; c = c->next)
       +                if(isvisible(c) && c != sel) {
       +                        if(c->isfloat || arrange == dofloat) {
       +                                wins[fi++] = c->title;
       +                                wins[fi++] = c->win;
       +                        }
       +                        else {
       +                                wins[mi++] = c->title;
       +                                wins[mi++] = c->win;
       +                        }
       +                }
       +        XRestackWindows(dpy, wins, n);
       +        drawall();
       +        XSync(dpy, False);
       +        while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
       +}
       +
       +void
       +togglemode(Arg *arg)
       +{
       +        arrange = arrange == dofloat ? dotile : dofloat;
       +        if(sel)
       +                arrange(NULL);
       +        else
       +                drawstatus();
       +}
       +
       +void
       +toggleview(Arg *arg)
       +{
       +        unsigned int i;
       +
       +        seltag[arg->i] = !seltag[arg->i];
       +        for(i = 0; i < ntags && !seltag[i]; i++);
       +        if(i == ntags)
       +                seltag[arg->i] = True; /* cannot toggle last view */
       +        arrange(NULL);
       +}
       +
       +void
       +view(Arg *arg)
       +{
       +        unsigned int i;
       +
       +        for(i = 0; i < ntags; i++)
       +                seltag[i] = False;
       +        seltag[arg->i] = True;
       +        arrange(NULL);
       +}
       +
       +void
       +zoom(Arg *arg)
       +{
       +        Client *c;
       +
       +        if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax)
       +                return;
       +
       +        if(sel == getnext(clients))  {
       +                if((c = getnext(sel->next)))
       +                        sel = c;
       +                else
       +                        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);
       +        arrange(NULL);
       +}