dwm

dynamic window manager
git clone git://git.suckless.org/dwm
Log | Files | Refs | README | LICENSE

commit fee8df6ccf3ab1494421d422af252f7b3da3a811
parent 8fa47ac679cfd91c022a35f2469bea7396e5f7c7
Author: Anselm R. Garbe <arg@10kloc.org>
Date:   Fri, 29 Sep 2006 16:22:20 +0200

added the new dotile as described on ml
Diffstat:
Mconfig.arg.h | 2++
Mconfig.default.h | 2++
Mdwm.h | 9++++++---
Mevent.c | 5+++--
Mmain.c | 2+-
Mview.c | 128++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
6 files changed, 112 insertions(+), 36 deletions(-)

diff --git a/config.arg.h b/config.arg.h @@ -36,6 +36,8 @@ static Key key[] = { \ { MODKEY, XK_j, focusnext, { 0 } }, \ { MODKEY, XK_k, focusprev, { 0 } }, \ { MODKEY, XK_Return, zoom, { 0 } }, \ + { MODKEY, XK_b, togglestackpos, { 0 } }, \ + { MODKEY, XK_d, togglestackdir, { 0 } }, \ { MODKEY, XK_g, resizecol, { .i = 20 } }, \ { MODKEY, XK_s, resizecol, { .i = -20 } }, \ { MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \ diff --git a/config.default.h b/config.default.h @@ -30,6 +30,8 @@ static Key key[] = { \ { MODKEY, XK_Tab, focusnext, { 0 } }, \ { MODKEY|ShiftMask, XK_Tab, focusprev, { 0 } }, \ { MODKEY, XK_Return, zoom, { 0 } }, \ + { MODKEY, XK_b, togglestackpos, { 0 } }, \ + { MODKEY, XK_d, togglestackdir, { 0 } }, \ { MODKEY, XK_g, resizecol, { .i = 20 } }, \ { MODKEY, XK_s, resizecol, { .i = -20 } }, \ { MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \ diff --git a/dwm.h b/dwm.h @@ -102,7 +102,7 @@ struct Client { extern const char *tags[]; /* all tags */ extern char stext[1024]; /* status text */ extern int bx, by, bw, bh, bmw; /* bar geometry, bar mode label width */ -extern int master, screen, sx, sy, sw, sh; /* screen geometry, master width */ +extern int master, screen, sx, sy, sw, sh; /* screen geometry, master dimension*/ extern unsigned int ntags, numlockmask; /* number of tags, dynamic lock mask */ extern void (*handler[LASTEvent])(XEvent *); /* event handler */ extern void (*arrange)(Arg *); /* arrange function, indicates mode */ @@ -170,10 +170,13 @@ extern void dotile(Arg *arg); /* arranges all windows, arg is ignored */ extern void focusnext(Arg *arg); /* focuses next visible client, arg is ignored */ extern void focusprev(Arg *arg); /* focuses previous visible client, arg is ignored */ extern Bool isvisible(Client *c); /* returns True if client is visible */ -extern void resizecol(Arg *arg); /* resizes the master width with arg's index value */ +extern void resizecol(Arg *arg); /* resizes the master dimension with arg's index value */ extern void restack(void); /* restores z layers of all clients */ +extern void togglestackdir(Arg *arg); /* toggles stack direction */ +extern void togglestackpos(Arg *arg); /* toggles stack position */ extern void togglemode(Arg *arg); /* toggles global arrange function (dotile/dofloat) */ extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */ +extern void updatemaster(void); /* updates master dimension */ extern void view(Arg *arg); /* views the tag with arg's index */ extern void viewall(Arg *arg); /* views all tags, arg is ignored */ -extern void zoom(Arg *arg); /* zooms the focused client to master column, arg is ignored */ +extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is ignored */ diff --git a/event.c b/event.c @@ -177,8 +177,9 @@ configurerequest(XEvent *e) { configure(c); XSync(dpy, False); if(c->isfloat) { - if(isvisible(c)) - resize(c, False, TopLeft); + resize(c, False, TopLeft); + if(!isvisible(c)) + ban(c); } else arrange(NULL); diff --git a/main.c b/main.c @@ -133,7 +133,7 @@ setup(void) { sx = sy = 0; sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); - master = ((stackpos == StackBottom ? sh - bh : sw) * MASTER) / 100; + updatemaster(); bx = by = 0; bw = sw; diff --git a/view.c b/view.c @@ -148,52 +148,93 @@ dotile(Arg *arg) { c->h = sh - 2 * BORDERPX - bh; } else if(i == 0) { /* master window */ - c->x = sx; - if(stackpos == StackLeft) - c->x += master; - c->y = sy + bh; - if(isvertical) { + switch(stackpos) { + case StackLeft: + c->x = sx + stackw; + c->y = sy + bh; c->w = master - 2 * BORDERPX; - c->h = sh - 2 * BORDERPX - bh; - } - else { - c->w = sw; + c->h = sh - bh - 2 * BORDERPX; + break; + case StackBottom: + c->x = sx; + c->y = sy + bh; + c->w = sw - 2 * BORDERPX; c->h = master - 2 * BORDERPX; + break; + case StackRight: + c->x = sx; + c->y = sy + bh; + c->w = master - 2 * BORDERPX; + c->h = sh - bh - 2 * BORDERPX; + break; } } else if((isvertical && th > bh) || (!isvertical && tw > MINW)) { /* tile window */ - c->x = sx; - if(isvertical) - c->y = sy + (i - 1) * th + bh; - else - c->y = sy + bh; - if(stackpos == StackRight) - c->x += master; - else if(stackpos == StackBottom) - c->y += master; c->w = tw - 2 * BORDERPX; c->h = th - 2 * BORDERPX; - if(i + 1 == n) { /* fixes for last tile to take up rest space */ - if(isvertical) - c->h = sh - c->y - 2 * BORDERPX; + switch(stackpos) { + case StackLeft: + if(isvertical) { + c->x = sx; + c->y = sy + (i - 1) * th + bh; + if(i + 1 == n) + c->h = sh - c->y - 2 * BORDERPX; + } else { - if(stackpos == StackLeft) - c->w = master - c->x - 2 * BORDERPX; - else + c->x = sx + (i - 1) * tw; + c->y = sy + bh; + if(i + 1 == n) + c->w = sx + stackw - c->x - 2 * BORDERPX; + } + break; + case StackBottom: + if(isvertical) { + c->x = sx; + c->y = sy + master + (i - 1) * th + bh; + if(i + 1 == n) + c->h = sh - c->y - 2 * BORDERPX; + } + else { + c->x = sx + (i - 1) * tw; + c->y = sy + bh + master; + if(i + 1 == n) c->w = sw - c->x - 2 * BORDERPX; } + break; + case StackRight: + if(isvertical) { + c->x = sx + master; + c->y = sy + (i - 1) * th + bh; + if(i + 1 == n) + c->h = sh - c->y - 2 * BORDERPX; + } + else { + c->x = sx + master + (i - 1) * tw; + c->y = sy + bh; + if(i + 1 == n) + c->w = sx + stackw - c->x - 2 * BORDERPX; + } + break; } } else { /* fallback if th < bh resp. tw < MINW */ - c->x = sx; - c->y = sy + bh; - if(stackpos == StackRight) - c->x += master; - else if(stackpos == StackBottom) - c->y += master; c->w = stackw - 2 * BORDERPX; c->h = stackh - 2 * BORDERPX; + switch(stackpos) { + case StackLeft: + c->x = sx; + c->y = sy + bh; + break; + case StackBottom: + c->x = sx; + c->y = sy + master; + break; + case StackRight: + c->x = sx + master; + c->y = sy + bh; + break; + } } resize(c, False, TopLeft); i++; @@ -319,6 +360,31 @@ toggleview(Arg *arg) { } void +togglestackdir(Arg *arg) { + if(arrange == dofloat) + return; + isvertical = !isvertical; + arrange(NULL); +} + +void +togglestackpos(Arg *arg) { + if(arrange == dofloat) + return; + if(stackpos == StackBottom) + stackpos = STACKPOS; + else + stackpos = StackBottom; + updatemaster(); + arrange(NULL); +} + +void +updatemaster(void) { + master = ((stackpos == StackBottom ? sh - bh : sw) * MASTER) / 100; +} + +void view(Arg *arg) { unsigned int i; @@ -339,6 +405,8 @@ viewall(Arg *arg) { arrange(NULL); } + + void zoom(Arg *arg) { unsigned int n;