[dwm] Fwd: [hackers] 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

From: Anselm R. Garbe <arg_AT_suckless.org>
Date: Sat, 11 Aug 2007 13:38:32 +0200

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" <garbeam_AT_gmail.com> -----

Date: Sat Aug 11 12:11:50 2007 +0200
From: "Anselm R. Garbe" <garbeam_AT_gmail.com>
To: hackers_AT_suckless.org
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 <garbeam_AT_gmail.com>
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
Received on Sat Aug 11 2007 - 13:38:32 UTC

This archive was generated by hypermail 2.2.0 : Sun Jul 13 2008 - 14:48:52 UTC