t* dwm + patches
       
   URI git clone git://git.codevoid.de/dwm-sdk
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit e461e60997f83d69561ad0ca4754c299145c00b8
   DIR parent 28c10330bd2e1830005602efe79db9218dbe9dc9
   URI Author: Anselm R. Garbe <garbeam@gmail.com>
       Date:   Fri,  3 Aug 2007 19:23:30 +0200
       
       implemented ratio tile as described on the mailinglist
       Diffstat:
         M config.arg.h                        |      10 +++++-----
         M config.default.h                    |      10 +++++-----
         M dwm.h                               |       3 ++-
         M layout.c                            |      94 ++++++++++++++++++++-----------
       
       4 files changed, 73 insertions(+), 44 deletions(-)
       ---
   DIR diff --git a/config.arg.h b/config.arg.h
       t@@ -30,9 +30,9 @@ static Layout layout[] = { \
                { "[]=",                tile }, /* first entry is default */ \
                { "><>",                floating }, \
        };
       -#define MASTERWIDTH                600                /* master width per thousand */
       -#define NMASTER                        1                /* clients in master area */
       -#define SNAP                        32                /* snap pixel */
       +#define NMASTER                        1        /* clients in master area */
       +#define RATIO                        .8        /* ratio of tile */
       +#define SNAP                        32        /* snap pixel */
        
        /* key definitions */
        #define MODKEY                        Mod1Mask
       t@@ -46,8 +46,8 @@ static Key key[] = { \
                        "exec urxvtcd -tr -bg '#222' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \
                { MODKEY,                        XK_space,        setlayout,        NULL }, \
                { MODKEY,                        XK_b,                togglebar,        NULL }, \
       -        { MODKEY,                        XK_h,                incmasterw,        "-32" }, \
       -        { MODKEY,                        XK_l,                incmasterw,        "32" }, \
       +        { MODKEY,                        XK_h,                incratio,        ".1" }, \
       +        { MODKEY,                        XK_l,                incratio,        "-.1" }, \
                { MODKEY|ShiftMask,                XK_j,                incnmaster,        "1" }, \
                { MODKEY|ShiftMask,                XK_k,                incnmaster,        "-1" }, \
                { MODKEY,                        XK_j,                focusclient,        "1" }, \
   DIR diff --git a/config.default.h b/config.default.h
       t@@ -31,9 +31,9 @@ static Layout layout[] = { \
                { "[]=",                tile }, /* first entry is default */ \
                { "><>",                floating }, \
        };
       -#define MASTERWIDTH                600                /* master width per thousand */
       -#define NMASTER                        1                /* clients in master area */
       -#define SNAP                        32                /* snap pixel */
       +#define NMASTER                        1        /* clients in master area */
       +#define RATIO                        .8        /* ratio of tile */
       +#define SNAP                        32        /* snap pixel */
        
        /* key definitions */
        #define MODKEY                        Mod1Mask
       t@@ -44,8 +44,8 @@ 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,                incmasterw,        "-32" }, \
       -        { MODKEY,                        XK_l,                incmasterw,        "32" }, \
       +        { MODKEY,                        XK_h,                incratio,        ".1" }, \
       +        { MODKEY,                        XK_l,                incratio,        "-.1" }, \
                { MODKEY|ShiftMask,                XK_j,                incnmaster,        "1" }, \
                { MODKEY|ShiftMask,                XK_k,                incnmaster,        "-1" }, \
                { MODKEY,                        XK_j,                focusclient,        "1" }, \
   DIR diff --git a/dwm.h b/dwm.h
       t@@ -44,6 +44,7 @@ enum { WMProtocols, WMDelete, WMState, WMLast };        /* default atoms */
        typedef struct Client Client;
        struct Client {
                char name[256];
       +        float scale;
                int x, y, w, h;
                int rx, ry, rw, rh; /* revert geometry */
                int basew, baseh, incw, inch, maxw, maxh, minw, minh;
       t@@ -122,7 +123,7 @@ void grabkeys(void);                        /* grab all keys defined in config.h */
        /* layout.c */
        void floating(void);                        /* arranges all windows floating */
        void focusclient(const char *arg);        /* focuses next(1)/previous(-1) visible client */
       -void incmasterw(const char *arg);        /* increments the master width with arg's index value */
       +void incratio(const char *arg);                /* increments the tile ratio with arg's value */
        void incnmaster(const char *arg);        /* increments nmaster with arg's index value */
        void initlayouts(void);                        /* initialize layout array */
        Client *nexttiled(Client *c);                /* returns tiled successor of c */
   DIR diff --git a/layout.c b/layout.c
       t@@ -1,5 +1,6 @@
        /* See LICENSE file for copyright and license details. */
        #include "dwm.h"
       +#include <stdio.h>
        #include <stdlib.h>
        
        unsigned int blw = 0;
       t@@ -7,53 +8,79 @@ Layout *lt = NULL;
        
        /* static */
        
       +static double ratio = RATIO;
        static unsigned int nlayouts = 0;
       -static unsigned int masterw = MASTERWIDTH;
        static unsigned int nmaster = NMASTER;
        
       +static double // simple pow()
       +spow(double x, double y)
       +{
       +        if(y == 0)
       +                return 1;
       +        while(--y)
       +                x *= x;
       +        return x;
       +}
       +
        static void
        tile(void) {
       -        unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
       +        double mscale = 0, tscale = 0, sum = 0;
       +        unsigned int i, n, nx, ny, nw, nh, mw, tw;
                Client *c;
        
                for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
                        n++;
       -        /* window geoms */
       -        mh = (n > nmaster) ? wah / nmaster : wah / (n > 0 ? n : 1);
       -        mw = (n > nmaster) ? (waw * masterw) / 1000 : waw;
       -        th = (n > nmaster) ? wah / (n - nmaster) : 0;
       +
       +        mw = (n <= nmaster) ? waw :  waw / (1 + ratio);
                tw = waw - mw;
        
       +        if(n > 0) {
       +                if(n < nmaster) {
       +                        for(i = 0; i < n; i++)
       +                                sum += spow(ratio, i);
       +                        mscale = wah / sum;
       +                }
       +                else {
       +                        for(i = 0; i < nmaster; i++)
       +                                sum += spow(ratio, i);
       +                        mscale = wah / sum;
       +                        for(sum = 0, i = 0; i < (n - nmaster); i++)
       +                                sum += spow(ratio, i);
       +                        tscale = wah / sum;
       +                }
       +        }
       +        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;
       -                        nx = wax;
       -                        ny = way;
       -                        if(i < nmaster) {
       -                                ny += i * mh;
       +                        if(i < nmaster) { /* master window */
                                        nw = mw - 2 * c->border;
       -                                nh = mh;
       -                                if(i + 1 == (n < nmaster ? n : nmaster)) /* remainder */
       -                                        nh = wah - mh * i;
       -                                nh -= 2 * c->border;
       +                                if(i + 1 == n || i + 1 == nmaster)
       +                                        nh = (way + wah) - ny - (2 * c->border);
       +                                else
       +                                        nh = (mscale * spow(ratio, i)) - (2 * c->border);
                                }
       -                        else {  /* tile window */
       -                                nx += mw;
       -                                nw = tw - 2 * c->border;
       -                                if(th > 2 * c->border) {
       -                                        ny += (i - nmaster) * th;
       -                                        nh = th;
       -                                        if(i + 1 == n) /* remainder */
       -                                                nh = wah - th * (i - nmaster);
       -                                        nh -= 2 * c->border;
       +                        else { /* tile window */
       +                                if(i == nmaster) {
       +                                        ny = way;
       +                                        nx = wax + mw;
                                        }
       -                                else /* fallback if th <= 2 * c->border */
       -                                        nh = wah - 2 * c->border;
       +                                nw = tw - 2 * c->border;
       +                                if(i + 1 == n)
       +                                        nh = (way + wah) - ny - (2 * c->border);
       +                                else
       +                                        nh = (tscale * spow(ratio, i - nmaster)) - (2 * c->border);
       +                        }
       +                        if(nh < bh) {
       +                                nh = bh;
       +                                ny = way + wah - nh;
                                }
                                resize(c, nx, ny, nw, nh, False);
       +                        ny += nh;
                                i++;
                        }
                        else
       t@@ -106,18 +133,19 @@ focusclient(const char *arg) {
        }
        
        void
       -incmasterw(const char *arg) {
       -        int i;
       +incratio(const char *arg) {
       +        double delta;
       +
                if(lt->arrange != tile)
                        return;
                if(!arg)
       -                masterw = MASTERWIDTH;
       +                ratio = RATIO;
                else {
       -                i = atoi(arg);
       -                if(waw * (masterw + i) / 1000 >= waw - 2 * BORDERPX 
       -                || waw * (masterw + i) / 1000 <= 2 * BORDERPX)
       -                        return;
       -                masterw += i;
       +                if(1 == sscanf(arg, "%lf", &delta)) {
       +                        if(delta + ratio < .1 || delta + ratio > 1.9)
       +                                return;
       +                        ratio += delta;
       +                }
                }
                lt->arrange();
        }