Hi there,
I forward my change to this list, to show in detail what I have
in mind how to separate layouts. Just checkout hg tip, it's
quite simple to grasp.
config.mk has to be edited to define all .c files which contain
layout specific things, config.h has to be edited to include the
layout-specific header files (I refer to hg tip).
There is incmaster in tile.h again...
Regards,
Anselm
----- Forwarded message from "Anselm R. Garbe" <[EMAIL PROTECTED]> -----
Date: Sat Aug 11 12:11:50 2007 +0200
From: "Anselm R. Garbe" <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Subject: [hackers] [dwm] 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
changeset: 941:8c93b982f22e
tag: tip
user: Anselm R. Garbe <[EMAIL PROTECTED]>
date: Sat Aug 11 12:11:50 2007 +0200
summary: 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
diff -r 8241aba895d8 -r 8c93b982f22e Makefile
--- 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
diff -r 8241aba895d8 -r 8c93b982f22e client.c
--- 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 @@ 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 -r 8241aba895d8 -r 8c93b982f22e config.arg.h
--- 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 @@ 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 -r 8241aba895d8 -r 8c93b982f22e config.default.h
--- 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 @@ 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 -r 8241aba895d8 -r 8c93b982f22e config.mk
--- a/config.mk Fri Aug 10 18:27:25 2007 +0200
+++ b/config.mk Sat Aug 11 12:11:50 2007 +0200
@@ -2,6 +2,9 @@ VERSION = 4.4
VERSION = 4.4
# Customize below to fit your system
+
+# layouts
+SRC = float.c tile.c
# paths
PREFIX = /usr/local
diff -r 8241aba895d8 -r 8c93b982f22e dwm.h
--- 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 {
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
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 -r 8241aba895d8 -r 8c93b982f22e event.c
--- 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 @@ 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 -r 8241aba895d8 -r 8c93b982f22e float.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));
+}
diff -r 8241aba895d8 -r 8c93b982f22e float.h
--- /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 */
diff -r 8241aba895d8 -r 8c93b982f22e layout.c
--- 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;
@@ -13,24 +12,6 @@ LAYOUTS
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,68 +101,9 @@ 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
@@ -191,39 +113,5 @@ togglebar(const char *arg) {
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);
-}
diff -r 8241aba895d8 -r 8c93b982f22e tag.c
--- 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 @@ 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 -r 8241aba895d8 -r 8c93b982f22e tile.c
--- /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();
+}
diff -r 8241aba895d8 -r 8c93b982f22e tile.h
--- /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 */
----- End forwarded message -----
--
Anselm R. Garbe >< http://www.suckless.org/ >< GPG key: 0D73F361