diff --git a/Makefile b/Makefile index 6219d56..24947f1 100644 --- 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 index 08fe1bd..d4dfe6e6 100644 --- 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 index 4d441f8..6fd4218 100644 --- 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 index ec32e9d..1f0fe8c 100644 --- 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 index d439502..a0fad48 100644 --- 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 --- 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 --- 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 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 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 */ diff --git a/layout.c b/layout.c index eb64a33..408a2a3 100644 --- a/layout.c +++ b/layout.c @@ -1,6 +1,5 @@ /* See LICENSE file for copyright and license details. */ #include "dwm.h" -#include #include unsigned int blw = 0; @@ -14,24 +13,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,70 +101,11 @@ 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) @@ -191,39 +113,5 @@ togglebar(const char *arg) { 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 --- 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 index 0000000..40e40e2 --- /dev/null +++ b/tile.c @@ -0,0 +1,88 @@ +/* See LICENSE file for copyright and license details. */ +#include "dwm.h" +#include + +/* 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 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 */