dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit 2d81b78b853565a3e34a8a9190e2362a6fdde739
parent b5eea45a316a897632578a74c909aa336557b1d6
Author: Anselm R. Garbe <garbeam@gmail.com>
Date:   Sat, 11 Aug 2007 12:11:50 +0200

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
Diffstat:
MMakefile | 2+-
Mclient.c | 6+++---
Mconfig.arg.h | 7++++---
Mconfig.default.h | 7++++---
Mconfig.mk | 3+++
Mdwm.h | 5+----
Mevent.c | 4++--
Afloat.c | 41+++++++++++++++++++++++++++++++++++++++++
Afloat.h | 5+++++
Mlayout.c | 116++-----------------------------------------------------------------------------
Mtag.c | 8++++----
Atile.c | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atile.h | 6++++++
13 files changed, 164 insertions(+), 134 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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 */