JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
separated layout-specific stuff into separate .h and .c files which are included...
authorAnselm R. Garbe <garbeam@gmail.com>
Sat, 11 Aug 2007 10:11:50 +0000 (12:11 +0200)
committerAnselm R. Garbe <garbeam@gmail.com>
Sat, 11 Aug 2007 10:11:50 +0000 (12:11 +0200)
13 files changed:
Makefile
client.c
config.arg.h
config.default.h
config.mk
dwm.h
event.c
float.c [new file with mode: 0644]
float.h [new file with mode: 0644]
layout.c
tag.c
tile.c [new file with mode: 0644]
tile.h [new file with mode: 0644]

index 6219d56..24947f1 100644 (file)
--- 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
index 08fe1bd..d4dfe6e 100644 (file)
--- 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
index 4d441f8..6fd4218 100644 (file)
@@ -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 }, \
index ec32e9d..1f0fe8c 100644 (file)
@@ -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 }, \
index d439502..a0fad48 100644 (file)
--- 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
index d20cf32..c2f1e7e 100644 (file)
--- 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
index 0fa1081..d0716fa 100644 (file)
--- 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
new file mode 100644 (file)
index 0000000..25bec69
--- /dev/null
+++ 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
new file mode 100644 (file)
index 0000000..6acbe64
--- /dev/null
+++ 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 */
index eb64a33..408a2a3 100644 (file)
--- 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
index e9d6445..c44954b 100644 (file)
--- 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
new file mode 100644 (file)
index 0000000..40e40e2
--- /dev/null
+++ 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
new file mode 100644 (file)
index 0000000..b450352
--- /dev/null
+++ 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 */