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
authorAnselm R. Garbe <garbeam@gmail.com>
Sat, 11 Aug 2007 12:11:50 +0200
changeset 941 8c93b982f22e
parent 940 8241aba895d8
child 942 f8295dc3d5e4
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
Makefile
client.c
config.arg.h
config.default.h
config.mk
dwm.h
event.c
float.c
float.h
layout.c
tag.c
tile.c
tile.h
--- a/Makefile	Fri Aug 10 18:27:25 2007 +0200
+++ b/Makefile	Sat Aug 11 12:11:50 2007 +0200
@@ -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
--- a/client.c	Fri Aug 10 18:27:25 2007 +0200
+++ b/client.c	Sat Aug 11 12:11:50 2007 +0200
@@ -230,7 +230,7 @@
 	setclientstate(c, IconicState);
 	c->isbanned = True;
 	focus(c);
-	lt->arrange(NULL);
+	lt->arrange();
 }
 
 void
@@ -305,7 +305,7 @@
 	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 @@
 	XSync(dpy, False);
 	XSetErrorHandler(xerror);
 	XUngrabServer(dpy);
-	lt->arrange(NULL);
+	lt->arrange();
 }
 
 void
--- a/config.arg.h	Fri Aug 10 18:27:25 2007 +0200
+++ b/config.arg.h	Sat Aug 11 12:11:50 2007 +0200
@@ -24,7 +24,8 @@
 };
 
 /* 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 @@
 		"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 }, \
--- a/config.default.h	Fri Aug 10 18:27:25 2007 +0200
+++ b/config.default.h	Sat Aug 11 12:11:50 2007 +0200
@@ -25,7 +25,8 @@
 };
 
 /* 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,			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 }, \
--- a/config.mk	Fri Aug 10 18:27:25 2007 +0200
+++ b/config.mk	Sat Aug 11 12:11:50 2007 +0200
@@ -3,6 +3,9 @@
 
 # Customize below to fit your system
 
+# layouts
+SRC = float.c tile.c
+
 # paths
 PREFIX = /usr/local
 MANPREFIX = ${PREFIX}/share/man
--- a/dwm.h	Fri Aug 10 18:27:25 2007 +0200
+++ b/dwm.h	Sat Aug 11 12:11:50 2007 +0200
@@ -76,7 +76,7 @@
 
 typedef struct {
 	const char *symbol;
-	void (*arrange)(const char *);
+	void (*arrange)(void);
 } Layout;
 
 extern const char *tags[];			/* all tags */
@@ -120,15 +120,12 @@
 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 */
--- a/event.c	Fri Aug 10 18:27:25 2007 +0200
+++ b/event.c	Sat Aug 11 12:11:50 2007 +0200
@@ -216,7 +216,7 @@
 		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 @@
 			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);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/float.c	Sat Aug 11 12:11:50 2007 +0200
@@ -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));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/float.h	Sat Aug 11 12:11:50 2007 +0200
@@ -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 */
--- a/layout.c	Fri Aug 10 18:27:25 2007 +0200
+++ b/layout.c	Sat Aug 11 12:11:50 2007 +0200
@@ -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;
@@ -15,24 +14,6 @@
 /* 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;
    
@@ -120,110 +101,17 @@
 		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);
+	lt->arrange();
 }
-
-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);
-}
--- a/tag.c	Fri Aug 10 18:27:25 2007 +0200
+++ b/tag.c	Sat Aug 11 12:11:50 2007 +0200
@@ -110,7 +110,7 @@
 	i = arg ? atoi(arg) : 0;
 	if(i >= 0 && i < ntags)
 		sel->tags[i] = True;
-	lt->arrange(NULL);
+	lt->arrange();
 }
 
 void
@@ -124,7 +124,7 @@
 	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 @@
 	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 @@
 	i = arg ? atoi(arg) : 0;
 	if(i >= 0 && i < ntags)
 		seltag[i] = True;
-	lt->arrange(NULL);
+	lt->arrange();
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tile.c	Sat Aug 11 12:11:50 2007 +0200
@@ -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();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tile.h	Sat Aug 11 12:11:50 2007 +0200
@@ -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 */