about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAnselm R. Garbe <garbeam@gmail.com>2007-08-11 12:11:50 +0200
committerAnselm R. Garbe <garbeam@gmail.com>2007-08-11 12:11:50 +0200
commit2d81b78b853565a3e34a8a9190e2362a6fdde739 (patch)
treed58d24853f77685588e42f73a01d782980a3b95e
parentb5eea45a316a897632578a74c909aa336557b1d6 (diff)
downloaddwm-2d81b78b853565a3e34a8a9190e2362a6fdde739.tar.gz
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
-rw-r--r--Makefile2
-rw-r--r--client.c6
-rw-r--r--config.arg.h7
-rw-r--r--config.default.h7
-rw-r--r--config.mk3
-rw-r--r--dwm.h5
-rw-r--r--event.c4
-rw-r--r--float.c41
-rw-r--r--float.h5
-rw-r--r--layout.c116
-rw-r--r--tag.c8
-rw-r--r--tile.c88
-rw-r--r--tile.h6
13 files changed, 164 insertions, 134 deletions
diff --git a/Makefile b/Makefile
index 6219d56..24947f1 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/client.c b/client.c
index 08fe1bd..d4dfe6e 100644
--- a/client.c
+++ b/client.c
@@ -230,7 +230,7 @@ manage(Window w, XWindowAttributes *wa) {
 	setclientstate(c, IconicState);
 	c->isbanned = True;
 	focus(c);
-	lt->arrange(NULL);
+	lt->arrange();
 }
 
 void
@@ -305,7 +305,7 @@ togglefloating(const char *arg) {
 	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 @@ unmanage(Client *c) {
 	XSync(dpy, False);
 	XSetErrorHandler(xerror);
 	XUngrabServer(dpy);
-	lt->arrange(NULL);
+	lt->arrange();
 }
 
 void
diff --git a/config.arg.h b/config.arg.h
index 4d441f8..6fd4218 100644
--- a/config.arg.h
+++ b/config.arg.h
@@ -24,7 +24,8 @@ static Rule rule[] = { \
 };
 
 /* 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 @@ static Key key[] = { \
 		"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 }, \
diff --git a/config.default.h b/config.default.h
index ec32e9d..1f0fe8c 100644
--- a/config.default.h
+++ b/config.default.h
@@ -25,7 +25,8 @@ static Rule rule[] = { \
 };
 
 /* 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 @@ 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,		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 }, \
diff --git a/config.mk b/config.mk
index d439502..a0fad48 100644
--- a/config.mk
+++ b/config.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
diff --git a/dwm.h b/dwm.h
index d20cf32..c2f1e7e 100644
--- a/dwm.h
+++ b/dwm.h
@@ -76,7 +76,7 @@ typedef struct {
 
 typedef struct {
 	const char *symbol;
-	void (*arrange)(const char *);
+	void (*arrange)(void);
 } Layout;
 
 extern const char *tags[];			/* all tags */
@@ -120,15 +120,12 @@ unsigned int textw(const char *text);	/* return the width of text in px*/
 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 */
diff --git a/event.c b/event.c
index 0fa1081..d0716fa 100644
--- a/event.c
+++ b/event.c
@@ -216,7 +216,7 @@ configurenotify(XEvent *e) {
 		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 @@ propertynotify(XEvent *e) {
 			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);
diff --git a/float.c b/float.c
new file mode 100644
index 0000000..25bec69
--- /dev/null
+++ b/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));
+}
diff --git a/float.h b/float.h
new file mode 100644
index 0000000..6acbe64
--- /dev/null
+++ b/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 */
diff --git a/layout.c b/layout.c
index eb64a33..408a2a3 100644
--- a/layout.c
+++ b/layout.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;
@@ -15,24 +14,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) {
 	Client *c;
    
@@ -120,110 +101,17 @@ setlayout(const char *arg) {
 		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();
 }
diff --git a/tag.c b/tag.c
index e9d6445..c44954b 100644
--- a/tag.c
+++ b/tag.c
@@ -110,7 +110,7 @@ tag(const char *arg) {
 	i = arg ? atoi(arg) : 0;
 	if(i >= 0 && i < ntags)
 		sel->tags[i] = True;
-	lt->arrange(NULL);
+	lt->arrange();
 }
 
 void
@@ -124,7 +124,7 @@ toggletag(const char *arg) {
 	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 @@ toggleview(const char *arg) {
 	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 @@ view(const char *arg) {
 	i = arg ? atoi(arg) : 0;
 	if(i >= 0 && i < ntags)
 		seltag[i] = True;
-	lt->arrange(NULL);
+	lt->arrange();
 }
diff --git a/tile.c b/tile.c
new file mode 100644
index 0000000..40e40e2
--- /dev/null
+++ b/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();
+}
diff --git a/tile.h b/tile.h
new file mode 100644
index 0000000..b450352
--- /dev/null
+++ b/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 */