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

Reply via email to