all repos — dwm @ 2d81b78b853565a3e34a8a9190e2362a6fdde739

my dwm build

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
Anselm R. Garbe garbeam@gmail.com
Sat, 11 Aug 2007 12:11:50 +0200
commit

2d81b78b853565a3e34a8a9190e2362a6fdde739

parent

b5eea45a316a897632578a74c909aa336557b1d6

13 files changed, 164 insertions(+), 134 deletions(-)

jump to
M MakefileMakefile

@@ -3,7 +3,7 @@ # © 2006-2007 Anselm R. Garbe, Sander van Dijk

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
M client.cclient.c

@@ -230,7 +230,7 @@ XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some windows require this */

setclientstate(c, IconicState); c->isbanned = True; focus(c); - lt->arrange(NULL); + lt->arrange(); } void

@@ -305,7 +305,7 @@ return;

sel->isfloating = !sel->isfloating; if(sel->isfloating) resize(sel, sel->x, sel->y, sel->w, sel->h, True); - lt->arrange(NULL); + lt->arrange(); } void

@@ -337,7 +337,7 @@ free(c);

XSync(dpy, False); XSetErrorHandler(xerror); XUngrabServer(dpy); - lt->arrange(NULL); + lt->arrange(); } void
M config.arg.hconfig.arg.h

@@ -24,7 +24,8 @@ { "Acroread", NULL, True }, \

}; /* layout(s) */ -void tile(const char *arg); /* arranges all windows tiled */ +#include "tile.h" +#include "float.h" #define LAYOUTS \ static Layout layout[] = { \ /* symbol function */ \

@@ -46,10 +47,10 @@ { MODKEY|ShiftMask, XK_Return, spawn, \

"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 }, \
M config.default.hconfig.default.h

@@ -25,7 +25,8 @@ { "Acroread", NULL, True }, \

}; /* layout(s) */ -void tile(const char *arg); /* arranges all windows tiled */ +#include "tile.h" +#include "float.h" #define LAYOUTS \ static Layout layout[] = { \ /* symbol function */ \

@@ -44,10 +45,10 @@ { MODKEY|ShiftMask, XK_Return, spawn, "exec xterm" }, \

{ 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 }, \
M config.mkconfig.mk

@@ -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
M dwm.hdwm.h

@@ -76,7 +76,7 @@ } DC; /* draw context */

typedef struct { const char *symbol; - void (*arrange)(const char *); + void (*arrange)(void); } Layout; extern const char *tags[]; /* all tags */

@@ -120,15 +120,12 @@ /* event.c */

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 */
M event.cevent.c

@@ -216,7 +216,7 @@ XFreePixmap(dpy, dc.drawable);

dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); XResizeWindow(dpy, barwin, sw, bh); updatebarpos(); - lt->arrange(NULL); + lt->arrange(); } }

@@ -317,7 +317,7 @@ default: break;

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);
A float.c

@@ -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)); +}
A float.h

@@ -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 */
M layout.clayout.c

@@ -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;

@@ -13,24 +12,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) {

@@ -120,110 +101,17 @@ return;

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(); }
M tag.ctag.c

@@ -110,7 +110,7 @@ sel->tags[i] = arg == NULL;

i = arg ? atoi(arg) : 0; if(i >= 0 && i < ntags) sel->tags[i] = True; - lt->arrange(NULL); + lt->arrange(); } void

@@ -124,7 +124,7 @@ sel->tags[i] = !sel->tags[i];

for(j = 0; j < ntags && !sel->tags[j]; j++); if(j == ntags) sel->tags[i] = True; - lt->arrange(NULL); + lt->arrange(); } void

@@ -136,7 +136,7 @@ seltag[i] = !seltag[i];

for(j = 0; j < ntags && !seltag[j]; j++); if(j == ntags) seltag[i] = True; /* cannot toggle last view */ - lt->arrange(NULL); + lt->arrange(); } void

@@ -148,5 +148,5 @@ seltag[i] = arg == NULL;

i = arg ? atoi(arg) : 0; if(i >= 0 && i < ntags) seltag[i] = True; - lt->arrange(NULL); + lt->arrange(); }
A tile.c

@@ -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(); +}
A tile.h

@@ -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 */