timplemented ratio tile as described on the mailinglist - dwm - [fork] customiz… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit e461e60997f83d69561ad0ca4754c299145c00b8 | |
parent 28c10330bd2e1830005602efe79db9218dbe9dc9 | |
Author: Anselm R. Garbe <[email protected]> | |
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(-) | |
--- | |
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 thou… | |
-#define NMASTER 1 /* clients in master a… | |
-#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 '"F… | |
{ MODKEY, XK_space, setlayout, NU… | |
{ MODKEY, XK_b, togglebar, … | |
- { MODKEY, XK_h, incmasterw, … | |
- { MODKEY, XK_l, incmasterw, … | |
+ { MODKEY, XK_h, incratio, … | |
+ { MODKEY, XK_l, incratio, … | |
{ MODKEY|ShiftMask, XK_j, incnmaster, … | |
{ MODKEY|ShiftMask, XK_k, incnmaster, … | |
{ MODKEY, XK_j, focusclient, … | |
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 thou… | |
-#define NMASTER 1 /* clients in master a… | |
-#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, … | |
{ MODKEY, XK_space, setlayout, NU… | |
{ MODKEY, XK_b, togglebar, … | |
- { MODKEY, XK_h, incmasterw, … | |
- { MODKEY, XK_l, incmasterw, … | |
+ { MODKEY, XK_h, incratio, … | |
+ { MODKEY, XK_l, incratio, … | |
{ MODKEY|ShiftMask, XK_j, incnmaster, … | |
{ MODKEY|ShiftMask, XK_k, incnmaster, … | |
{ MODKEY, XK_j, focusclient, … | |
diff --git a/dwm.h b/dwm.h | |
t@@ -44,6 +44,7 @@ enum { WMProtocols, WMDelete, WMState, WMLast }; /* d… | |
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 ke… | |
/* layout.c */ | |
void floating(void); /* arranges all windows floating */ | |
void focusclient(const char *arg); /* focuses next(1)/previous(-1) visi… | |
-void incmasterw(const char *arg); /* increments the master width with a… | |
+void incratio(const char *arg); /* increments the tile ratio wi… | |
void incnmaster(const char *arg); /* increments nmaster with arg's inde… | |
void initlayouts(void); /* initialize layout array */ | |
Client *nexttiled(Client *c); /* returns tiled successor of c */ | |
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)) /* re… | |
- 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 * … | |
} | |
- 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… | |
+ } | |
+ 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(); | |
} |