t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 2d81b78b853565a3e34a8a9190e2362a6fdde739
   DIR parent b5eea45a316a897632578a74c909aa336557b1d6
   URI Author: Anselm R. Garbe <garbeam@gmail.com>
       Date:   Sat, 11 Aug 2007 12:11:50 +0200
       
       separated layout-specific stuff into separate .h and .c files which are included in config.h resp. config.mk - this allows writing layouts for dwm without any need to patch existing code
       Diffstat:
         M Makefile                            |       2 +-
         M client.c                            |       6 +++---
         M config.arg.h                        |       7 ++++---
         M config.default.h                    |       7 ++++---
         M config.mk                           |       3 +++
         M dwm.h                               |       5 +----
         M event.c                             |       4 ++--
         A float.c                             |      41 +++++++++++++++++++++++++++++++
         A float.h                             |       5 +++++
         M layout.c                            |     116 +------------------------------
         M tag.c                               |       8 ++++----
         A tile.c                              |      88 +++++++++++++++++++++++++++++++
         A tile.h                              |       6 ++++++
       
       13 files changed, 164 insertions(+), 134 deletions(-)
       ---
   DIR diff --git a/Makefile b/Makefile
       t@@ -3,7 +3,7 @@
        
        include config.mk
        
       -SRC = client.c draw.c event.c layout.c main.c tag.c util.c
       +SRC += client.c draw.c event.c layout.c main.c tag.c util.c
        OBJ = ${SRC:.c=.o}
        
        all: options dwm
   DIR diff --git a/client.c b/client.c
       t@@ -230,7 +230,7 @@ manage(Window w, XWindowAttributes *wa) {
                setclientstate(c, IconicState);
                c->isbanned = True;
                focus(c);
       -        lt->arrange(NULL);
       +        lt->arrange();
        }
        
        void
       t@@ -305,7 +305,7 @@ togglefloating(const char *arg) {
                sel->isfloating = !sel->isfloating;
                if(sel->isfloating)
                        resize(sel, sel->x, sel->y, sel->w, sel->h, True);
       -        lt->arrange(NULL);
       +        lt->arrange();
        }
        
        void
       t@@ -337,7 +337,7 @@ unmanage(Client *c) {
                XSync(dpy, False);
                XSetErrorHandler(xerror);
                XUngrabServer(dpy);
       -        lt->arrange(NULL);
       +        lt->arrange();
        }
        
        void
   DIR diff --git a/config.arg.h b/config.arg.h
       t@@ -24,7 +24,8 @@ static Rule rule[] = { \
        };
        
        /* layout(s) */
       -void tile(const char *arg);                /* arranges all windows tiled */
       +#include "tile.h"
       +#include "float.h"
        #define LAYOUTS \
        static Layout layout[] = { \
                /* symbol                function */ \
       t@@ -46,10 +47,10 @@ static Key key[] = { \
                        "exec urxvtcd -tr -bg '#111' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \
                { MODKEY,                        XK_space,        setlayout,        NULL }, \
                { MODKEY,                        XK_b,                togglebar,        NULL }, \
       -        { MODKEY,                        XK_h,                tile,                "-0.05" }, \
                { MODKEY,                        XK_j,                focusclient,        "1" }, \
                { MODKEY,                        XK_k,                focusclient,        "-1" }, \
       -        { MODKEY,                        XK_l,                tile,                "0.05" }, \
       +        { MODKEY,                        XK_h,                incmaster,        "-0.05" }, \
       +        { MODKEY,                        XK_l,                incmaster,        "0.05" }, \
                { MODKEY,                        XK_m,                togglemax,        NULL }, \
                { MODKEY,                        XK_Return,        zoom,                NULL }, \
                { MODKEY|ShiftMask,                XK_space,        togglefloating,        NULL }, \
   DIR diff --git a/config.default.h b/config.default.h
       t@@ -25,7 +25,8 @@ static Rule rule[] = { \
        };
        
        /* layout(s) */
       -void tile(const char *arg);                /* arranges all windows tiled */
       +#include "tile.h"
       +#include "float.h"
        #define LAYOUTS \
        static Layout layout[] = { \
                /* symbol                function */ \
       t@@ -44,10 +45,10 @@ static Key key[] = { \
                { MODKEY,                        XK_p,                spawn,                 "exe=`dmenu_path | dmenu` && exec $exe" }, \
                { MODKEY,                        XK_space,        setlayout,        NULL }, \
                { MODKEY,                        XK_b,                togglebar,        NULL }, \
       -        { MODKEY,                        XK_h,                tile,                "-0.05" }, \
                { MODKEY,                        XK_j,                focusclient,        "1" }, \
                { MODKEY,                        XK_k,                focusclient,        "-1" }, \
       -        { MODKEY,                        XK_l,                tile,                "0.05" }, \
       +        { MODKEY,                        XK_h,                incmaster,        "-0.05" }, \
       +        { MODKEY,                        XK_l,                incmaster,        "0.05" }, \
                { MODKEY,                        XK_m,                togglemax,        NULL }, \
                { MODKEY,                        XK_Return,        zoom,                NULL }, \
                { MODKEY|ShiftMask,                XK_space,        togglefloating,        NULL }, \
   DIR diff --git a/config.mk b/config.mk
       t@@ -3,6 +3,9 @@ VERSION = 4.4
        
        # Customize below to fit your system
        
       +# layouts
       +SRC = float.c tile.c
       +
        # paths
        PREFIX = /usr/local
        MANPREFIX = ${PREFIX}/share/man
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -76,7 +76,7 @@ typedef struct {
        
        typedef struct {
                const char *symbol;
       -        void (*arrange)(const char *);
       +        void (*arrange)(void);
        } Layout;
        
        extern const char *tags[];                        /* all tags */
       t@@ -120,15 +120,12 @@ unsigned int textw(const char *text);        /* return the width of text in px*/
        void grabkeys(void);                        /* grab all keys defined in config.h */
        
        /* layout.c */
       -void floating(const char *arg);                /* arranges all windows floating */
        void focusclient(const char *arg);        /* focuses next(1)/previous(-1) visible client */
        void initlayouts(void);                        /* initialize layout array */
        Client *nexttiled(Client *c);                /* returns tiled successor of c */
        void restack(void);                        /* restores z layers of all clients */
        void setlayout(const char *arg);        /* sets layout, NULL means next layout */
        void togglebar(const char *arg);        /* shows/hides the bar */
       -void togglemax(const char *arg);        /* toggles maximization of floating client */
       -void zoom(const char *arg);                /* zooms the focused client to master area, arg is ignored */
        
        /* main.c */
        void updatebarpos(void);                /* updates the bar position */
   DIR diff --git a/event.c b/event.c
       t@@ -216,7 +216,7 @@ configurenotify(XEvent *e) {
                        dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
                        XResizeWindow(dpy, barwin, sw, bh);
                        updatebarpos();
       -                lt->arrange(NULL);
       +                lt->arrange();
                }
        }
        
       t@@ -317,7 +317,7 @@ propertynotify(XEvent *e) {
                                case XA_WM_TRANSIENT_FOR:
                                        XGetTransientForHint(dpy, c->win, &trans);
                                        if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL)))
       -                                        lt->arrange(NULL);
       +                                        lt->arrange();
                                        break;
                                case XA_WM_NORMAL_HINTS:
                                        updatesizehints(c);
   DIR diff --git a/float.c b/float.c
       t@@ -0,0 +1,41 @@
       +/* See LICENSE file for copyright and license details. */
       +#include "dwm.h"
       +
       +/* extern */
       +
       +void
       +floating(void) {
       +        Client *c;
       +
       +        if(lt->arrange != floating)
       +                return;
       +
       +        for(c = clients; c; c = c->next)
       +                if(isvisible(c)) {
       +                        unban(c);
       +                        resize(c, c->x, c->y, c->w, c->h, True);
       +                }
       +                else
       +                        ban(c);
       +        focus(NULL);
       +        restack();
       +}
       +
       +void
       +togglemax(const char *arg) {
       +        XEvent ev;
       +
       +        if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
       +                return;
       +        if((sel->ismax = !sel->ismax)) {
       +                sel->rx = sel->x;
       +                sel->ry = sel->y;
       +                sel->rw = sel->w;
       +                sel->rh = sel->h;
       +                resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->border, True);
       +        }
       +        else
       +                resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
       +        drawstatus();
       +        while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
       +}
   DIR diff --git a/float.h b/float.h
       t@@ -0,0 +1,5 @@
       +/* See LICENSE file for copyright and license details. */
       +
       +/* float.c */
       +void floating(void);                        /* arranges all windows floating */
       +void togglemax(const char *arg);        /* toggles maximization of floating client */
   DIR diff --git a/layout.c b/layout.c
       t@@ -1,6 +1,5 @@
        /* See LICENSE file for copyright and license details. */
        #include "dwm.h"
       -#include <stdio.h>
        #include <stdlib.h>
        
        unsigned int blw = 0;
       t@@ -15,24 +14,6 @@ LAYOUTS
        /* extern */
        
        void
       -floating(const char *arg) {
       -        Client *c;
       -
       -        if(lt->arrange != floating)
       -                return;
       -
       -        for(c = clients; c; c = c->next)
       -                if(isvisible(c)) {
       -                        unban(c);
       -                        resize(c, c->x, c->y, c->w, c->h, True);
       -                }
       -                else
       -                        ban(c);
       -        focus(NULL);
       -        restack();
       -}
       -
       -void
        focusclient(const char *arg) {
                Client *c;
           
       t@@ -120,110 +101,17 @@ setlayout(const char *arg) {
                        lt = &layout[i];
                }
                if(sel)
       -                lt->arrange(NULL);
       +                lt->arrange();
                else
                        drawstatus();
        }
        
        void
       -tile(const char *arg) {
       -        static double master = MASTER;
       -        double delta;
       -        unsigned int i, n, nx, ny, nw, nh, mw, th;
       -        Client *c;
       -
       -        if(lt->arrange != tile)
       -                return;
       -
       -        /* arg handling, manipulate master */
       -        if(arg && (1 == sscanf(arg, "%lf", &delta))) {
       -                if(delta + master > 0.1 && delta + master < 0.9)
       -                        master += delta;
       -        }
       -
       -        for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
       -                n++;
       -
       -        /* window geoms */
       -        mw = (n == 1) ? waw : master * waw;
       -        th = (n > 1) ? wah / (n - 1) : 0;
       -        if(n > 1 && th < bh)
       -                th = wah;
       -
       -        nx = wax;
       -        ny = way;
       -        for(i = 0, c = clients; c; c = c->next)
       -                if(isvisible(c)) {
       -                        unban(c);
       -                        if(c->isfloating)
       -                                continue;
       -                        c->ismax = False;
       -                        if(i == 0) { /* master */
       -                                nw = mw - 2 * c->border;
       -                                nh = wah - 2 * c->border;
       -                        }
       -                        else {  /* tile window */
       -                                if(i == 1) {
       -                                        ny = way;
       -                                        nx += mw;
       -                                }
       -                                nw = waw - mw - 2 * c->border;
       -                                if(i + 1 == n) /* remainder */
       -                                        nh = (way + wah) - ny - 2 * c->border;
       -                                else
       -                                        nh = th - 2 * c->border;
       -                        }
       -                        resize(c, nx, ny, nw, nh, False);
       -                        if(n > 1 && th != wah)
       -                                ny += nh + 2 * c->border;
       -                        i++;
       -                }
       -                else
       -                        ban(c);
       -        focus(NULL);
       -        restack();
       -}
       -
       -void
        togglebar(const char *arg) {
                if(bpos == BarOff)
                        bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
                else
                        bpos = BarOff;
                updatebarpos();
       -        lt->arrange(NULL);
       -}
       -
       -void
       -togglemax(const char *arg) {
       -        XEvent ev;
       -
       -        if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
       -                return;
       -        if((sel->ismax = !sel->ismax)) {
       -                sel->rx = sel->x;
       -                sel->ry = sel->y;
       -                sel->rw = sel->w;
       -                sel->rh = sel->h;
       -                resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->border, True);
       -        }
       -        else
       -                resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
       -        drawstatus();
       -        while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
       -}
       -
       -void
       -zoom(const char *arg) {
       -        Client *c;
       -
       -        if(!sel || lt->arrange == floating || sel->isfloating)
       -                return;
       -        if((c = sel) == nexttiled(clients))
       -                if(!(c = nexttiled(c->next)))
       -                        return;
       -        detach(c);
       -        attach(c);
       -        focus(c);
       -        lt->arrange(NULL);
       +        lt->arrange();
        }
   DIR diff --git a/tag.c b/tag.c
       t@@ -110,7 +110,7 @@ tag(const char *arg) {
                i = arg ? atoi(arg) : 0;
                if(i >= 0 && i < ntags)
                        sel->tags[i] = True;
       -        lt->arrange(NULL);
       +        lt->arrange();
        }
        
        void
       t@@ -124,7 +124,7 @@ toggletag(const char *arg) {
                for(j = 0; j < ntags && !sel->tags[j]; j++);
                if(j == ntags)
                        sel->tags[i] = True;
       -        lt->arrange(NULL);
       +        lt->arrange();
        }
        
        void
       t@@ -136,7 +136,7 @@ toggleview(const char *arg) {
                for(j = 0; j < ntags && !seltag[j]; j++);
                if(j == ntags)
                        seltag[i] = True; /* cannot toggle last view */
       -        lt->arrange(NULL);
       +        lt->arrange();
        }
        
        void
       t@@ -148,5 +148,5 @@ view(const char *arg) {
                i = arg ? atoi(arg) : 0;
                if(i >= 0 && i < ntags)
                        seltag[i] = True;
       -        lt->arrange(NULL);
       +        lt->arrange();
        }
   DIR diff --git a/tile.c b/tile.c
       t@@ -0,0 +1,88 @@
       +/* See LICENSE file for copyright and license details. */
       +#include "dwm.h"
       +#include <stdio.h>
       +
       +/* static */
       +
       +static double master = MASTER;
       +
       +/* extern */
       +
       +void
       +incmaster(const char *arg) {
       +        double delta;
       +
       +        if(lt->arrange != tile)
       +                return;
       +
       +        /* arg handling, manipulate master */
       +        if(arg && (1 == sscanf(arg, "%lf", &delta))) {
       +                if(delta + master > 0.1 && delta + master < 0.9)
       +                        master += delta;
       +        }
       +
       +        lt->arrange();
       +}
       +
       +void
       +tile(void) {
       +        unsigned int i, n, nx, ny, nw, nh, mw, th;
       +        Client *c;
       +
       +        for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
       +                n++;
       +
       +        /* window geoms */
       +        mw = (n == 1) ? waw : master * waw;
       +        th = (n > 1) ? wah / (n - 1) : 0;
       +        if(n > 1 && th < bh)
       +                th = wah;
       +
       +        nx = wax;
       +        ny = way;
       +        for(i = 0, c = clients; c; c = c->next)
       +                if(isvisible(c)) {
       +                        unban(c);
       +                        if(c->isfloating)
       +                                continue;
       +                        c->ismax = False;
       +                        if(i == 0) { /* master */
       +                                nw = mw - 2 * c->border;
       +                                nh = wah - 2 * c->border;
       +                        }
       +                        else {  /* tile window */
       +                                if(i == 1) {
       +                                        ny = way;
       +                                        nx += mw;
       +                                }
       +                                nw = waw - mw - 2 * c->border;
       +                                if(i + 1 == n) /* remainder */
       +                                        nh = (way + wah) - ny - 2 * c->border;
       +                                else
       +                                        nh = th - 2 * c->border;
       +                        }
       +                        resize(c, nx, ny, nw, nh, False);
       +                        if(n > 1 && th != wah)
       +                                ny += nh + 2 * c->border;
       +                        i++;
       +                }
       +                else
       +                        ban(c);
       +        focus(NULL);
       +        restack();
       +}
       +
       +void
       +zoom(const char *arg) {
       +        Client *c;
       +
       +        if(!sel || lt->arrange == floating || sel->isfloating)
       +                return;
       +        if((c = sel) == nexttiled(clients))
       +                if(!(c = nexttiled(c->next)))
       +                        return;
       +        detach(c);
       +        attach(c);
       +        focus(c);
       +        lt->arrange();
       +}
   DIR diff --git a/tile.h b/tile.h
       t@@ -0,0 +1,6 @@
       +/* See LICENSE file for copyright and license details. */
       +
       +/* tile.c */
       +void incmaster(const char *arg);        /* arranges all windows tiled */
       +void tile(void);                        /* arranges all windows tiled */
       +void zoom(const char *arg);                /* zooms the focused client to master area, arg is ignored */