Pārlūkot izejas kodu

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 18 gadi atpakaļ
vecāks
revīzija
2d81b78b85
13 mainītis faili ar 164 papildinājumiem un 134 dzēšanām
  1. 1 1
      Makefile
  2. 3 3
      client.c
  3. 4 3
      config.arg.h
  4. 4 3
      config.default.h
  5. 3 0
      config.mk
  6. 1 4
      dwm.h
  7. 2 2
      event.c
  8. 41 0
      float.c
  9. 5 0
      float.h
  10. 2 114
      layout.c
  11. 4 4
      tag.c
  12. 88 0
      tile.c
  13. 6 0
      tile.h

+ 1 - 1
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

+ 3 - 3
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

+ 4 - 3
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 }, \

+ 4 - 3
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 }, \

+ 3 - 0
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

+ 1 - 4
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 */

+ 2 - 2
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);

+ 41 - 0
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));
+}

+ 5 - 0
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 */

+ 2 - 114
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;
@@ -14,24 +13,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,70 +101,11 @@ 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)
@@ -191,39 +113,5 @@ togglebar(const char *arg) {
 	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();
 }

+ 4 - 4
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();
 }

+ 88 - 0
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();
+}

+ 6 - 0
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 */