summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--colors.h9
-rw-r--r--config.def.h57
-rw-r--r--config.h203
-rw-r--r--config.mk2
-rw-r--r--drw.c1
-rw-r--r--dwm.122
-rw-r--r--dwm.c437
-rw-r--r--vanitygaps.c809
8 files changed, 58 insertions, 1482 deletions
diff --git a/colors.h b/colors.h
deleted file mode 100644
index 0a4fdf0..0000000
--- a/colors.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* Norm Colors */
-static const char norm_fg[] = "#bbbbbb";
-static const char norm_bg[] = "#222222";
-static const char norm_border[] = "#444444";
-
-/* Sel Colors */
-static const char sel_fg[] = "#eeeeee";
-static const char sel_bg[] = "#005577";
-static const char sel_border[] = "#005577";
diff --git a/config.def.h b/config.def.h
index 4e929ee..1c0b587 100644
--- a/config.def.h
+++ b/config.def.h
@@ -3,16 +3,8 @@
/* appearance */
static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int snap = 32; /* snap pixel */
-static const int swallowfloating = 0; /* 1 means swallow floating windows by default */
-static const unsigned int gappih = 20; /* horiz inner gap between windows */
-static const unsigned int gappiv = 10; /* vert inner gap between windows */
-static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */
-static const unsigned int gappov = 30; /* vert outer gap between windows and screen edge */
-static int smartgaps = 0; /* 1 means no outer gap when there is only one window */
static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
-static const int vertpad = 10; /* vertical padding of bar */
-static const int sidepad = 10; /* horizontal padding of bar */
static const char *fonts[] = { "monospace:size=10" };
static const char dmenufont[] = "monospace:size=10";
static const char col_gray1[] = "#222222";
@@ -34,11 +26,9 @@ static const Rule rules[] = {
* WM_CLASS(STRING) = instance, class
* WM_NAME(STRING) = title
*/
- /* class instance title tags mask isfloating isterminal noswallow monitor */
- { "Gimp", NULL, NULL, 0, 1, 0, 0, -1 },
- { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1 },
- { "st", NULL, NULL, 0, 0, 1, -1, -1 },
- { NULL, NULL, "Event Tester", 0, 1, 0, 1, -1 }, /* xev */
+ /* class instance title tags mask isfloating monitor */
+ { "Gimp", NULL, NULL, 0, 1, -1 },
+ { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
};
/* layout(s) */
@@ -46,26 +36,11 @@ static const float mfact = 0.55; /* factor of master area size [0.05..0.95]
static const int nmaster = 1; /* number of clients in master area */
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
-#define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */
-#include "vanitygaps.c"
-
static const Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile }, /* first entry is default */
- { "[M]", monocle },
- { "[@]", spiral },
- { "[\\]", dwindle },
- { "H[]", deck },
- { "TTT", bstack },
- { "===", bstackhoriz },
- { "HHH", grid },
- { "###", nrowgrid },
- { "---", horizgrid },
- { ":::", gaplessgrid },
- { "|M|", centeredmaster },
- { ">M>", centeredfloatingmaster },
{ "><>", NULL }, /* no layout function means floating behavior */
- { NULL, NULL },
+ { "[M]", monocle },
};
/* key definitions */
@@ -89,8 +64,6 @@ static Key keys[] = {
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY, XK_b, togglebar, {0} },
- { MODKEY|ShiftMask, XK_j, rotatestack, {.i = +1 } },
- { MODKEY|ShiftMask, XK_k, rotatestack, {.i = -1 } },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
@@ -98,22 +71,6 @@ static Key keys[] = {
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
- { MODKEY|Mod4Mask, XK_u, incrgaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_u, incrgaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_i, incrigaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_i, incrigaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_o, incrogaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_o, incrogaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_6, incrihgaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_6, incrihgaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_7, incrivgaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_7, incrivgaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_8, incrohgaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_8, incrohgaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_9, incrovgaps, {.i = +1 } },
- { MODKEY|Mod4Mask|ShiftMask, XK_9, incrovgaps, {.i = -1 } },
- { MODKEY|Mod4Mask, XK_0, togglegaps, {0} },
- { MODKEY|Mod4Mask|ShiftMask, XK_0, defaultgaps, {0} },
{ MODKEY, XK_Tab, view, {0} },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
@@ -121,7 +78,6 @@ static Key keys[] = {
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
- { MODKEY|ShiftMask, XK_f, togglefullscr, {0} },
{ MODKEY, XK_0, view, {.ui = ~0 } },
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
@@ -138,11 +94,6 @@ static Key keys[] = {
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
- { MODKEY, XK_Left, viewtoleft, {0} },
- { MODKEY, XK_Right, viewtoright, {0} },
- { MODKEY|ShiftMask, XK_Left, tagtoleft, {0} },
- { MODKEY|ShiftMask, XK_Right, tagtoright, {0} },
- { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} },
};
/* button definitions */
diff --git a/config.h b/config.h
deleted file mode 100644
index 4c828b9..0000000
--- a/config.h
+++ /dev/null
@@ -1,203 +0,0 @@
-#include "colors.h"
-/* See LICENSE file for copyright and license details. */
-
-/* appearance */
-static const unsigned int borderpx = 2; /* border pixel of windows */
-static const unsigned int snap = 32; /* snap pixel */
-static const int swallowfloating = 0; /* 1 means swallow floating windows by default */
-static const unsigned int gappih = 12; /* horiz inner gap between windows */
-static const unsigned int gappiv = 12; /* vert inner gap between windows */
-static const unsigned int gappoh = 12; /* horiz outer gap between windows and screen edge */
-static const unsigned int gappov = 12; /* vert outer gap between windows and screen edge */
-static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */
-static const int showbar = 1; /* 0 means no bar */
-static const int topbar = 1; /* 0 means bottom bar */
-static const int vertpad = 12; /* vertical padding of bar */
-static const int sidepad = 12; /* horizontal padding of bar */
-static const char *fonts[] = { "JetBrains Mono Nerd Font:size=12" };
-static const char *colors[][3] = {
- /* fg bg border */
- [SchemeNorm] = { norm_fg, norm_bg, norm_border }, // Unfocused Windows
- [SchemeSel] = { sel_fg, sel_bg, sel_border }, // Focused Windows
-};
-
-/* tagging */
-static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
-
-static const Rule rules[] = {
- /* xprop(1):
- * WM_CLASS(STRING) = instance, class
- * WM_NAME(STRING) = title
- */
- /* class instance title tags mask isfloating isterminal noswallow monitor */
- { NULL, NULL, NULL, 0, False, 0, 0, -1 },
- { "st", NULL, NULL, 0, False, 1, -1, -1 },
-};
-
-/* layout(s) */
-static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
-static const int nmaster = 1; /* number of clients in master area */
-static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
-
-#define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */
-#include "vanitygaps.c"
-
-
-static const Layout layouts[] = {
- /* symbol arrange function */
- { "[]=", tile }, /* first entry is default */
- { "><>", NULL }, /* no layout function means floating behavior */
- { ">M>", centeredfloatingmaster },
- { "[@]", spiral },
- { "---", horizgrid },
- { "H[]", deck },
- { "HHH", grid },
- { "TTT", bstack },
- { "===", bstackhoriz },
- { "###", nrowgrid },
- /*
- * { "[\\]", dwindle },
- * { ":::", gaplessgrid },
- * { "|M|", centeredmaster },
- * { "[M]", monocle },
- * { NULL, NULL },
- */
-};
-
-/* key definitions */
-#define ALTKEY Mod1Mask
-#define CTRLKEY ControlMask
-#define SHIFTKEY ShiftMask
-#define MODKEY Mod4Mask
-#define TAGKEYS(KEY,TAG) \
-{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
-{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
-{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
-{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
-
-/* helper for spawning shell commands in the pre dwm-5.0 fashion */
-#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
-
-/* commands */
-static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
-static const char *dmenucmd[] = { "dmenu_run","-i", NULL };
-
-static Key keys[] = {
- /* modifier key function argument */
- /* Managing Windows */
- { MODKEY|SHIFTKEY, XK_j, rotatestack, {.i = +1 } },
- { MODKEY|SHIFTKEY, XK_k, rotatestack, {.i = -1 } },
- { MODKEY, XK_j, focusstack, {.i = +1 } },
- { MODKEY, XK_k, focusstack, {.i = -1 } },
- { MODKEY|ALTKEY, XK_p, incnmaster, {.i = +1 } },
- { MODKEY|ALTKEY, XK_d, incnmaster, {.i = -1 } },
- { MODKEY|CTRLKEY, XK_h, setmfact, {.f = -0.05} },
- { MODKEY|CTRLKEY, XK_l, setmfact, {.f = +0.05} },
- { MODKEY|SHIFTKEY, XK_Return, zoom, {0} },
- { MODKEY, XK_Tab, view, {0} },
- { MODKEY|SHIFTKEY, XK_q, killclient, {0} },
- { MODKEY|ALTKEY, XK_f, togglefullscr, {0} },
- { MODKEY|ALTKEY, XK_1, setlayout, {.v = &layouts[0]} },
- { MODKEY|ALTKEY, XK_2, setlayout, {.v = &layouts[1]} },
- { MODKEY|ALTKEY, XK_3, setlayout, {.v = &layouts[2]} },
- { MODKEY|ALTKEY, XK_4, setlayout, {.v = &layouts[3]} },
- { MODKEY|ALTKEY, XK_5, setlayout, {.v = &layouts[4]} },
- { MODKEY|ALTKEY, XK_6, setlayout, {.v = &layouts[5]} },
- { MODKEY|ALTKEY, XK_7, setlayout, {.v = &layouts[6]} },
- { MODKEY|ALTKEY, XK_8, setlayout, {.v = &layouts[7]} },
- { MODKEY|ALTKEY, XK_9, setlayout, {.v = &layouts[8]} },
- { MODKEY|ALTKEY, XK_0, setlayout, {.v = &layouts[9]} },
- { MODKEY|SHIFTKEY, XK_space, setlayout, {0} },
- { MODKEY, XK_space, togglefloating, {0} },
- { MODKEY, XK_comma, focusmon, {.i = -1 } },
- { MODKEY, XK_period, focusmon, {.i = +1 } },
- { MODKEY|SHIFTKEY, XK_comma, tagmon, {.i = -1 } },
- { MODKEY|SHIFTKEY, XK_period, tagmon, {.i = +1 } },
- { MODKEY, XK_h, viewtoleft, {0} },
- { MODKEY, XK_l, viewtoright, {0} },
- { MODKEY|SHIFTKEY, XK_h, tagtoleft, {0} },
- { MODKEY|SHIFTKEY, XK_l, tagtoright, {0} },
- { MODKEY|SHIFTKEY, XK_t, togglegaps, {0} },
- { MODKEY|SHIFTKEY, XK_plus, incrgaps, {.i = +1 } },
- { MODKEY|SHIFTKEY, XK_minus, incrgaps, {.i = -1 } },
- { MODKEY, XK_t, defaultgaps, {0} },
- { MODKEY|SHIFTKEY, XK_x, quit, {0} },
- { MODKEY|SHIFTKEY, XK_r, quit, {1} },
-
- /* Managing Tags and Status Bar */
- { MODKEY, XK_b, togglebar, {0} },
- { MODKEY, XK_0, view, {.ui = ~0 } },
- { MODKEY|SHIFTKEY, XK_0, tag, {.ui = ~0 } },
- TAGKEYS( XK_1, 0)
- TAGKEYS( XK_2, 1)
- TAGKEYS( XK_3, 2)
- TAGKEYS( XK_4, 3)
- TAGKEYS( XK_5, 4)
- TAGKEYS( XK_6, 5)
- TAGKEYS( XK_7, 6)
- TAGKEYS( XK_8, 7)
- TAGKEYS( XK_9, 8)
-
- /* Regular Apps */
- { MODKEY, XK_d, spawn, {.v = dmenucmd } },
- { MODKEY, XK_Return, spawn, SHCMD("$TERMINAL") },//Terminal
- { MODKEY, XK_w, spawn, SHCMD("$BROWSER") },//Web-Browser
- { MODKEY, XK_f, spawn, SHCMD("$TERMINAL -e vifm") },//File Manager
-
- /* Scripts */
- { MODKEY, XK_e, spawn, SHCMD("glypher") },//Glyph Selector
- { MODKEY|SHIFTKEY, XK_o, spawn, SHCMD("monitor") },//Set Screen Output
- { MODKEY, XK_m, spawn, SHCMD("musicselect") },//Music Selector
- { MODKEY|SHIFTKEY, XK_c, spawn, SHCMD("powermenu") },//Power Menu
- { MODKEY, XK_r, spawn, SHCMD("run") },//Favorites Run Prompt
- { 0, XK_Print, spawn, SHCMD("screenshot") },//Screenshot Tool Script
- { MODKEY, XK_Print, spawn, SHCMD("screenshot quick") },//Quick Screenshot
-
- /* Quick Actions */
- { MODKEY, XK_F1, spawn, SHCMD("mixer t") },//Toggle Mute
- { MODKEY, XK_F2, spawn, SHCMD("mixer -") },//Decrease Volume by 5%
- { MODKEY, XK_F3, spawn, SHCMD("mixer +") },//Increase Volume by 5%
- { MODKEY, XK_F4, spawn, SHCMD("bluelight") },//Enable Bluelight Filter //Script
- { MODKEY, XK_F5, spawn, SHCMD("xbacklight -dec 5") },//Decrease Brightness by 5%
- { MODKEY, XK_F6, spawn, SHCMD("xbacklight -inc 5") },//Increase Brightness by 5%
- { MODKEY, XK_F7, spawn, SHCMD("screenrecord") },//Start Screen Recording //Script
- { MODKEY, XK_F8, spawn, SHCMD("killall ffmpeg") },//Stop Recording
- { MODKEY, XK_F9, spawn, SHCMD("mpc toggle") },//Music Pause/Play
- { MODKEY, XK_F10, spawn, SHCMD("killall mpd") },//Music Quit/Stop
- { MODKEY, XK_F11, spawn, SHCMD("mpc prev") },//Music Previous
- { MODKEY, XK_F12, spawn, SHCMD("mpc next") },//Music Next
-};
-
-/*
- * Unused Keybinds
- *
- * { MODKEY|Mod4Mask|ShiftMask, XK_h, incrogaps, {.i = +1 } },
- * { MODKEY|Mod4Mask|ShiftMask, XK_l, incrogaps, {.i = -1 } },
- * { MODKEY|Mod4Mask|ControlMask, XK_h, incrigaps, {.i = +1 } },
- * { MODKEY|Mod4Mask|ControlMask, XK_l, incrigaps, {.i = -1 } },
- * { MODKEY, XK_y, incrihgaps, {.i = +1 } },
- * { MODKEY, XK_o, incrihgaps, {.i = -1 } },
- * { MODKEY|ControlMask, XK_y, incrivgaps, {.i = +1 } },
- * { MODKEY|ControlMask, XK_o, incrivgaps, {.i = -1 } },
- * { MODKEY|Mod4Mask, XK_y, incrohgaps, {.i = +1 } },
- * { MODKEY|Mod4Mask, XK_o, incrohgaps, {.i = -1 } },
- * { MODKEY|ShiftMask, XK_y, incrovgaps, {.i = +1 } },
- * { MODKEY|ShiftMask, XK_o, incrovgaps, {.i = -1 } },
- */
-
-/* button definitions */
-/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
-static Button buttons[] = {
- /* click event mask button function argument */
- { ClkLtSymbol, 0, Button1, setlayout, {0} },
- { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
- { ClkWinTitle, 0, Button2, zoom, {0} },
- { ClkStatusText, 0, Button2, spawn, SHCMD("$TERM") },
- { ClkClientWin, MODKEY, Button1, movemouse, {0} },
- { ClkClientWin, MODKEY, Button2, togglefloating, {0} },
- { ClkClientWin, MODKEY, Button3, resizemouse, {0} },
- { ClkTagBar, 0, Button1, view, {0} },
- { ClkTagBar, 0, Button3, toggleview, {0} },
- { ClkTagBar, MODKEY, Button1, tag, {0} },
- { ClkTagBar, MODKEY, Button3, toggletag, {0} },
-};
diff --git a/config.mk b/config.mk
index b77641d..7084c33 100644
--- a/config.mk
+++ b/config.mk
@@ -22,7 +22,7 @@ FREETYPEINC = /usr/include/freetype2
# includes and libs
INCS = -I${X11INC} -I${FREETYPEINC}
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res
+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
# flags
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
diff --git a/drw.c b/drw.c
index 8fd1ca4..4cdbcbe 100644
--- a/drw.c
+++ b/drw.c
@@ -95,6 +95,7 @@ drw_free(Drw *drw)
{
XFreePixmap(drw->dpy, drw->drawable);
XFreeGC(drw->dpy, drw->gc);
+ drw_fontset_free(drw->fonts);
free(drw);
}
diff --git a/dwm.1 b/dwm.1
index 8e7e921..13b3729 100644
--- a/dwm.1
+++ b/dwm.1
@@ -77,18 +77,6 @@ Send focused window to previous screen, if any.
.B Mod1\-Shift\-.
Send focused window to next screen, if any.
.TP
-.B Mod1\-Right
-Focus tag on the right, if any.
-.TP
-.B Mod1\-Left
-Focus tag on the left, if any.
-.TP
-.B Mod1\-Shift\-Right
-Send focused window to tag on the right, if any.
-.TP
-.B Mod1\-Shift\-Left
-Send focused window to tag on the left, if any.
-.TP
.B Mod1\-b
Toggles bar on and off.
.TP
@@ -154,9 +142,6 @@ Add/remove all windows with nth tag to/from the view.
.TP
.B Mod1\-Shift\-q
Quit dwm.
-.TP
-.B Mod1\-Control\-Shift\-q
-Restart dwm.
.SS Mouse commands
.TP
.B Mod1\-Button1
@@ -170,13 +155,6 @@ Resize focused window while dragging. Tiled windows will be toggled to the float
.SH CUSTOMIZATION
dwm is customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple.
-.SH SIGNALS
-.TP
-.B SIGHUP - 1
-Restart the dwm process.
-.TP
-.B SIGTERM - 15
-Cleanly terminate the dwm process.
.SH SEE ALSO
.BR dmenu (1),
.BR st (1)
diff --git a/dwm.c b/dwm.c
index cfe4dc8..9fd0286 100644
--- a/dwm.c
+++ b/dwm.c
@@ -40,8 +40,6 @@
#include <X11/extensions/Xinerama.h>
#endif /* XINERAMA */
#include <X11/Xft/Xft.h>
-#include <X11/Xlib-xcb.h>
-#include <xcb/res.h>
#include "drw.h"
#include "util.h"
@@ -94,11 +92,9 @@ struct Client {
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int bw, oldbw;
unsigned int tags;
- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow;
- pid_t pid;
+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
Client *next;
Client *snext;
- Client *swallowing;
Monitor *mon;
Window win;
};
@@ -123,10 +119,6 @@ struct Monitor {
int by; /* bar geometry */
int mx, my, mw, mh; /* screen size */
int wx, wy, ww, wh; /* window area */
- int gappih; /* horizontal gap between windows */
- int gappiv; /* vertical gap between windows */
- int gappoh; /* horizontal outer gaps */
- int gappov; /* vertical outer gaps */
unsigned int seltags;
unsigned int sellt;
unsigned int tagset[2];
@@ -146,8 +138,6 @@ typedef struct {
const char *title;
unsigned int tags;
int isfloating;
- int isterminal;
- int noswallow;
int monitor;
} Rule;
@@ -173,8 +163,6 @@ static void detachstack(Client *c);
static Monitor *dirtomon(int dir);
static void drawbar(Monitor *m);
static void drawbars(void);
-static void enqueue(Client *c);
-static void enqueuestack(Client *c);
static void enternotify(XEvent *e);
static void expose(XEvent *e);
static void focus(Client *c);
@@ -205,7 +193,6 @@ static void resize(Client *c, int x, int y, int w, int h, int interact);
static void resizeclient(Client *c, int x, int y, int w, int h);
static void resizemouse(const Arg *arg);
static void restack(Monitor *m);
-static void rotatestack(const Arg *arg);
static void run(void);
static void scan(void);
static int sendevent(Client *c, Atom proto);
@@ -219,16 +206,12 @@ static void setup(void);
static void seturgent(Client *c, int urg);
static void showhide(Client *c);
static void sigchld(int unused);
-static void sighup(int unused);
-static void sigterm(int unused);
static void spawn(const Arg *arg);
static void tag(const Arg *arg);
static void tagmon(const Arg *arg);
-static void tagtoleft(const Arg *arg);
-static void tagtoright(const Arg *arg);
+static void tile(Monitor *);
static void togglebar(const Arg *arg);
static void togglefloating(const Arg *arg);
-static void togglefullscr(const Arg *arg);
static void toggletag(const Arg *arg);
static void toggleview(const Arg *arg);
static void unfocus(Client *c, int setfocus);
@@ -245,8 +228,6 @@ static void updatetitle(Client *c);
static void updatewindowtype(Client *c);
static void updatewmhints(Client *c);
static void view(const Arg *arg);
-static void viewtoleft(const Arg *arg);
-static void viewtoright(const Arg *arg);
static Client *wintoclient(Window w);
static Monitor *wintomon(Window w);
static int xerror(Display *dpy, XErrorEvent *ee);
@@ -254,22 +235,13 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee);
static int xerrorstart(Display *dpy, XErrorEvent *ee);
static void zoom(const Arg *arg);
-static pid_t getparentprocess(pid_t p);
-static int isdescprocess(pid_t p, pid_t c);
-static Client *swallowingclient(Window w);
-static Client *termforwin(const Client *c);
-static pid_t winpid(Window w);
-
/* variables */
static const char broken[] = "broken";
static char stext[256];
-static int scanner;
static int screen;
static int sw, sh; /* X display screen geometry width, height */
static int bh, blw = 0; /* bar geometry */
static int lrpad; /* sum of left and right padding for text */
-static int vp; /* vertical padding for bar */
-static int sp; /* side padding for bar */
static int (*xerrorxlib)(Display *, XErrorEvent *);
static unsigned int numlockmask = 0;
static void (*handler[LASTEvent]) (XEvent *) = {
@@ -289,7 +261,6 @@ static void (*handler[LASTEvent]) (XEvent *) = {
[UnmapNotify] = unmapnotify
};
static Atom wmatom[WMLast], netatom[NetLast];
-static int restart = 0;
static int running = 1;
static Cur *cursor[CurLast];
static Clr **scheme;
@@ -298,8 +269,6 @@ static Drw *drw;
static Monitor *mons, *selmon;
static Window root, wmcheckwin;
-static xcb_connection_t *xcon;
-
/* configuration, allows nested code to access above variables */
#include "config.h"
@@ -317,7 +286,6 @@ applyrules(Client *c)
XClassHint ch = { NULL, NULL };
/* rule matching */
- c->noswallow = -1;
c->isfloating = 0;
c->tags = 0;
XGetClassHint(dpy, c->win, &ch);
@@ -330,8 +298,6 @@ applyrules(Client *c)
&& (!r->class || strstr(class, r->class))
&& (!r->instance || strstr(instance, r->instance)))
{
- c->isterminal = r->isterminal;
- c->noswallow = r->noswallow;
c->isfloating = r->isfloating;
c->tags |= r->tags;
for (m = mons; m && m->num != r->monitor; m = m->next);
@@ -449,64 +415,9 @@ attachstack(Client *c)
}
void
-swallow(Client *p, Client *c)
-{
- Client *s;
-
- if (c->noswallow > 0 || c->isterminal)
- return;
- if (c->noswallow < 0 && !swallowfloating && c->isfloating)
- return;
-
- detach(c);
- detachstack(c);
-
- setclientstate(c, WithdrawnState);
- XUnmapWindow(dpy, p->win);
-
- p->swallowing = c;
- c->mon = p->mon;
-
- Window w = p->win;
- p->win = c->win;
- c->win = w;
-
- XChangeProperty(dpy, c->win, netatom[NetClientList], XA_WINDOW, 32, PropModeReplace,
- (unsigned char *) &(p->win), 1);
-
- updatetitle(p);
- s = scanner ? c : p;
- XMoveResizeWindow(dpy, p->win, s->x, s->y, s->w, s->h);
- arrange(p->mon);
- configure(p);
- updateclientlist();
-}
-
-void
-unswallow(Client *c)
-{
- c->win = c->swallowing->win;
-
- free(c->swallowing);
- c->swallowing = NULL;
-
- XDeleteProperty(dpy, c->win, netatom[NetClientList]);
-
- /* unfullscreen the client */
- setfullscreen(c, 0);
- updatetitle(c);
- arrange(c->mon);
- XMapWindow(dpy, c->win);
- XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
- setclientstate(c, NormalState);
- focus(NULL);
- arrange(c->mon);
-}
-
-void
buttonpress(XEvent *e)
{
- unsigned int i, x, click, occ = 0;
+ unsigned int i, x, click;
Arg arg = {0};
Client *c;
Monitor *m;
@@ -521,14 +432,9 @@ buttonpress(XEvent *e)
}
if (ev->window == selmon->barwin) {
i = x = 0;
- for (c = m->clients; c; c = c->next)
- occ |= c->tags == 255 ? 0 : c->tags;
- do {
- /* do not reserve space for vacant tags */
- if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
- continue;
+ do
x += TEXTW(tags[i]);
- } while (ev->x >= x && ++i < LENGTH(tags));
+ while (ev->x >= x && ++i < LENGTH(tags));
if (i < LENGTH(tags)) {
click = ClkTagBar;
arg.ui = 1 << i;
@@ -662,7 +568,7 @@ configurenotify(XEvent *e)
for (c = m->clients; c; c = c->next)
if (c->isfullscreen)
resizeclient(c, m->mx, m->my, m->mw, m->mh);
- XMoveResizeWindow(dpy, m->barwin, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh);
+ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
}
focus(NULL);
arrange(NULL);
@@ -733,10 +639,6 @@ createmon(void)
m->nmaster = nmaster;
m->showbar = showbar;
m->topbar = topbar;
- m->gappih = gappih;
- m->gappiv = gappiv;
- m->gappoh = gappoh;
- m->gappov = gappov;
m->lt[0] = &layouts[0];
m->lt[1] = &layouts[1 % LENGTH(layouts)];
strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
@@ -751,9 +653,6 @@ destroynotify(XEvent *e)
if ((c = wintoclient(ev->window)))
unmanage(c, 1);
-
- else if ((c = swallowingclient(ev->window)))
- unmanage(c->swallowing, 1);
}
void
@@ -807,23 +706,23 @@ drawbar(Monitor *m)
if (m == selmon) { /* status is only drawn on selected monitor */
drw_setscheme(drw, scheme[SchemeNorm]);
tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
- drw_text(drw, m->ww - tw - 2 * sp, 0, tw, bh, 0, stext, 0);
+ drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
}
for (c = m->clients; c; c = c->next) {
- occ |= c->tags == 255 ? 0 : c->tags;
+ occ |= c->tags;
if (c->isurgent)
urg |= c->tags;
}
x = 0;
for (i = 0; i < LENGTH(tags); i++) {
- /* do not draw vacant tags */
- if (!(occ & 1 << i || m->tagset[m->seltags] & 1 << i))
- continue;
-
w = TEXTW(tags[i]);
drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
+ if (occ & 1 << i)
+ drw_rect(drw, x + boxs, boxs, boxw, boxw,
+ m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
+ urg & 1 << i);
x += w;
}
w = blw = TEXTW(m->ltsymbol);
@@ -833,12 +732,12 @@ drawbar(Monitor *m)
if ((w = m->ww - tw - x) > bh) {
if (m->sel) {
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
- drw_text(drw, x, 0, w - 2 * sp, bh, lrpad / 2, m->sel->name, 0);
+ drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
if (m->sel->isfloating)
drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
} else {
drw_setscheme(drw, scheme[SchemeNorm]);
- drw_rect(drw, x, 0, w - 2 * sp, bh, 1, 1);
+ drw_rect(drw, x, 0, w, bh, 1, 1);
}
}
drw_map(drw, m->barwin, 0, 0, m->ww, bh);
@@ -854,28 +753,6 @@ drawbars(void)
}
void
-enqueue(Client *c)
-{
- Client *l;
- for (l = c->mon->clients; l && l->next; l = l->next);
- if (l) {
- l->next = c;
- c->next = NULL;
- }
-}
-
-void
-enqueuestack(Client *c)
-{
- Client *l;
- for (l = c->mon->stack; l && l->snext; l = l->snext);
- if (l) {
- l->snext = c;
- c->snext = NULL;
- }
-}
-
-void
enternotify(XEvent *e)
{
Client *c;
@@ -1141,13 +1018,12 @@ killclient(const Arg *arg)
void
manage(Window w, XWindowAttributes *wa)
{
- Client *c, *t = NULL, *term = NULL;
+ Client *c, *t = NULL;
Window trans = None;
XWindowChanges wc;
c = ecalloc(1, sizeof(Client));
c->win = w;
- c->pid = winpid(w);
/* geometry */
c->x = c->oldx = wa->x;
c->y = c->oldy = wa->y;
@@ -1162,7 +1038,6 @@ manage(Window w, XWindowAttributes *wa)
} else {
c->mon = selmon;
applyrules(c);
- term = termforwin(c);
}
if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
@@ -1199,8 +1074,6 @@ manage(Window w, XWindowAttributes *wa)
c->mon->sel = c;
arrange(c->mon);
XMapWindow(dpy, c->win);
- if (term)
- swallow(term, c);
focus(NULL);
}
@@ -1376,7 +1249,6 @@ propertynotify(XEvent *e)
void
quit(const Arg *arg)
{
- if(arg->i) restart = 1;
running = 0;
}
@@ -1499,38 +1371,6 @@ restack(Monitor *m)
}
void
-rotatestack(const Arg *arg)
-{
- Client *c = NULL, *f;
-
- if (!selmon->sel)
- return;
- f = selmon->sel;
- if (arg->i > 0) {
- for (c = nexttiled(selmon->clients); c && nexttiled(c->next); c = nexttiled(c->next));
- if (c){
- detach(c);
- attach(c);
- detachstack(c);
- attachstack(c);
- }
- } else {
- if ((c = nexttiled(selmon->clients))){
- detach(c);
- enqueue(c);
- detachstack(c);
- enqueuestack(c);
- }
- }
- if (c){
- arrange(selmon);
- //unfocus(f, 1);
- focus(f);
- restack(selmon);
- }
-}
-
-void
run(void)
{
XEvent ev;
@@ -1544,9 +1384,7 @@ run(void)
void
scan(void)
{
- scanner = 1;
unsigned int i, num;
- char swin[256];
Window d1, d2, *wins = NULL;
XWindowAttributes wa;
@@ -1557,8 +1395,6 @@ scan(void)
continue;
if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
manage(wins[i], &wa);
- else if (gettextprop(wins[i], netatom[NetClientList], swin, sizeof swin))
- manage(wins[i], &wa);
}
for (i = 0; i < num; i++) { /* now the transients */
if (!XGetWindowAttributes(dpy, wins[i], &wa))
@@ -1570,7 +1406,6 @@ scan(void)
if (wins)
XFree(wins);
}
- scanner = 0;
}
void
@@ -1598,28 +1433,6 @@ setclientstate(Client *c, long state)
PropModeReplace, (unsigned char *)data, 2);
}
-void
-tagtoleft(const Arg *arg) {
- if(selmon->sel != NULL
- && __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1
- && selmon->tagset[selmon->seltags] > 1) {
- selmon->sel->tags >>= 1;
- focus(NULL);
- arrange(selmon);
- }
-}
-
-void
-tagtoright(const Arg *arg) {
- if(selmon->sel != NULL
- && __builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1
- && selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) {
- selmon->sel->tags <<= 1;
- focus(NULL);
- arrange(selmon);
- }
-}
-
int
sendevent(Client *c, Atom proto)
{
@@ -1724,9 +1537,6 @@ setup(void)
/* clean up any zombies immediately */
sigchld(0);
- signal(SIGHUP, sighup);
- signal(SIGTERM, sigterm);
-
/* init screen */
screen = DefaultScreen(dpy);
sw = DisplayWidth(dpy, screen);
@@ -1738,9 +1548,6 @@ setup(void)
lrpad = drw->fonts->h;
bh = drw->fonts->h + 2;
updategeom();
- sp = sidepad;
- vp = (topbar == 1) ? vertpad : - vertpad;
-
/* init atoms */
utf8string = XInternAtom(dpy, "UTF8_STRING", False);
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
@@ -1767,7 +1574,6 @@ setup(void)
/* init bars */
updatebars();
updatestatus();
- updatebarpos(selmon);
/* supporting window for NetWMCheck */
wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0);
XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32,
@@ -1832,20 +1638,6 @@ sigchld(int unused)
}
void
-sighup(int unused)
-{
- Arg a = {.i = 1};
- quit(&a);
-}
-
-void
-sigterm(int unused)
-{
- Arg a = {.i = 0};
- quit(&a);
-}
-
-void
spawn(const Arg *arg)
{
if (arg->v == dmenucmd)
@@ -1880,11 +1672,39 @@ tagmon(const Arg *arg)
}
void
+tile(Monitor *m)
+{
+ unsigned int i, n, h, mw, my, ty;
+ Client *c;
+
+ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+ if (n == 0)
+ return;
+
+ if (n > m->nmaster)
+ mw = m->nmaster ? m->ww * m->mfact : 0;
+ else
+ mw = m->ww;
+ for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
+ if (i < m->nmaster) {
+ h = (m->wh - my) / (MIN(n, m->nmaster) - i);
+ resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
+ if (my + HEIGHT(c) < m->wh)
+ my += HEIGHT(c);
+ } else {
+ h = (m->wh - ty) / (n - i);
+ resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
+ if (ty + HEIGHT(c) < m->wh)
+ ty += HEIGHT(c);
+ }
+}
+
+void
togglebar(const Arg *arg)
{
selmon->showbar = !selmon->showbar;
updatebarpos(selmon);
- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx + sp, selmon->by + vp, selmon->ww - 2 * sp, bh);
+ XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
arrange(selmon);
}
@@ -1903,13 +1723,6 @@ togglefloating(const Arg *arg)
}
void
-togglefullscr(const Arg *arg)
-{
- if(selmon->sel)
- setfullscreen(selmon->sel, !selmon->sel->isfullscreen);
-}
-
-void
toggletag(const Arg *arg)
{
unsigned int newtags;
@@ -1955,20 +1768,6 @@ unmanage(Client *c, int destroyed)
Monitor *m = c->mon;
XWindowChanges wc;
- if (c->swallowing) {
- unswallow(c);
- return;
- }
-
- Client *s = swallowingclient(c->win);
- if (s) {
- free(s->swallowing);
- s->swallowing = NULL;
- arrange(m);
- focus(NULL);
- return;
- }
-
detach(c);
detachstack(c);
if (!destroyed) {
@@ -1983,12 +1782,9 @@ unmanage(Client *c, int destroyed)
XUngrabServer(dpy);
}
free(c);
-
- if (!s) {
- arrange(m);
- focus(NULL);
- updateclientlist();
- }
+ focus(NULL);
+ updateclientlist();
+ arrange(m);
}
void
@@ -2018,7 +1814,7 @@ updatebars(void)
for (m = mons; m; m = m->next) {
if (m->barwin)
continue;
- m->barwin = XCreateWindow(dpy, root, m->wx + sp, m->by + vp, m->ww - 2 * sp, bh, 0, DefaultDepth(dpy, screen),
+ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
@@ -2033,11 +1829,11 @@ updatebarpos(Monitor *m)
m->wy = m->my;
m->wh = m->mh;
if (m->showbar) {
- m->wh = m->wh - vertpad - bh;
- m->by = m->topbar ? m->wy : m->wy + m->wh + vertpad;
- m->wy = m->topbar ? m->wy + bh + vp : m->wy;
+ m->wh -= bh;
+ m->by = m->topbar ? m->wy : m->wy + m->wh;
+ m->wy = m->topbar ? m->wy + bh : m->wy;
} else
- m->by = -bh - vp;
+ m->by = -bh;
}
void
@@ -2251,132 +2047,6 @@ view(const Arg *arg)
arrange(selmon);
}
-void
-viewtoleft(const Arg *arg) {
- if(__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1
- && selmon->tagset[selmon->seltags] > 1) {
- selmon->seltags ^= 1; /* toggle sel tagset */
- selmon->tagset[selmon->seltags] = selmon->tagset[selmon->seltags ^ 1] >> 1;
- focus(NULL);
- arrange(selmon);
- }
-}
-
-void
-viewtoright(const Arg *arg) {
- if(__builtin_popcount(selmon->tagset[selmon->seltags] & TAGMASK) == 1
- && selmon->tagset[selmon->seltags] & (TAGMASK >> 1)) {
- selmon->seltags ^= 1; /* toggle sel tagset */
- selmon->tagset[selmon->seltags] = selmon->tagset[selmon->seltags ^ 1] << 1;
- focus(NULL);
- arrange(selmon);
- }
-}
-
-pid_t
-winpid(Window w)
-{
- pid_t result = 0;
-
- xcb_res_client_id_spec_t spec = {0};
- spec.client = w;
- spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID;
-
- xcb_generic_error_t *e = NULL;
- xcb_res_query_client_ids_cookie_t c = xcb_res_query_client_ids(xcon, 1, &spec);
- xcb_res_query_client_ids_reply_t *r = xcb_res_query_client_ids_reply(xcon, c, &e);
-
- if (!r)
- return (pid_t)0;
-
- xcb_res_client_id_value_iterator_t i = xcb_res_query_client_ids_ids_iterator(r);
- for (; i.rem; xcb_res_client_id_value_next(&i)) {
- spec = i.data->spec;
- if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) {
- uint32_t *t = xcb_res_client_id_value_value(i.data);
- result = *t;
- break;
- }
- }
-
- free(r);
-
- if (result == (pid_t)-1)
- result = 0;
- return result;
-}
-
-pid_t
-getparentprocess(pid_t p)
-{
- unsigned int v = 0;
-
-#if defined(__linux__)
- FILE *f;
- char buf[256];
- snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p);
-
- if (!(f = fopen(buf, "r")))
- return (pid_t)0;
-
- if (fscanf(f, "%*u %*s %*c %u", (unsigned *)&v) != 1)
- v = (pid_t)0;
- fclose(f);
-#elif defined(__FreeBSD__)
- struct kinfo_proc *proc = kinfo_getproc(p);
- if (!proc)
- return (pid_t)0;
-
- v = proc->ki_ppid;
- free(proc);
-#endif
- return (pid_t)v;
-}
-
-int
-isdescprocess(pid_t p, pid_t c)
-{
- while (p != c && c != 0)
- c = getparentprocess(c);
-
- return (int)c;
-}
-
-Client *
-termforwin(const Client *w)
-{
- Client *c;
- Monitor *m;
-
- if (!w->pid || w->isterminal)
- return NULL;
-
- for (m = mons; m; m = m->next) {
- for (c = m->clients; c; c = c->next) {
- if (c->isterminal && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid))
- return c;
- }
- }
-
- return NULL;
-}
-
-Client *
-swallowingclient(Window w)
-{
- Client *c;
- Monitor *m;
-
- for (m = mons; m; m = m->next) {
- for (c = m->clients; c; c = c->next) {
- if (c->swallowing && c->swallowing->win == w)
- return c;
- }
- }
-
- return NULL;
-}
-
Client *
wintoclient(Window w)
{
@@ -2468,8 +2138,6 @@ main(int argc, char *argv[])
fputs("warning: no locale support\n", stderr);
if (!(dpy = XOpenDisplay(NULL)))
die("dwm: cannot open display");
- if (!(xcon = XGetXCBConnection(dpy)))
- die("dwm: cannot get xcb connection\n");
checkotherwm();
setup();
#ifdef __OpenBSD__
@@ -2478,7 +2146,6 @@ main(int argc, char *argv[])
#endif /* __OpenBSD__ */
scan();
run();
- if(restart) execvp(argv[0], argv);
cleanup();
XCloseDisplay(dpy);
return EXIT_SUCCESS;
diff --git a/vanitygaps.c b/vanitygaps.c
deleted file mode 100644
index 3f31593..0000000
--- a/vanitygaps.c
+++ /dev/null
@@ -1,809 +0,0 @@
-/* Key binding functions */
-static void defaultgaps(const Arg *arg);
-static void incrgaps(const Arg *arg);
-static void incrigaps(const Arg *arg);
-static void incrogaps(const Arg *arg);
-static void incrohgaps(const Arg *arg);
-static void incrovgaps(const Arg *arg);
-static void incrihgaps(const Arg *arg);
-static void incrivgaps(const Arg *arg);
-static void togglegaps(const Arg *arg);
-/* Layouts (delete the ones you do not need) */
-static void bstack(Monitor *m);
-static void bstackhoriz(Monitor *m);
-static void centeredmaster(Monitor *m);
-static void centeredfloatingmaster(Monitor *m);
-static void deck(Monitor *m);
-static void dwindle(Monitor *m);
-static void fibonacci(Monitor *m, int s);
-static void grid(Monitor *m);
-static void nrowgrid(Monitor *m);
-static void spiral(Monitor *m);
-static void tile(Monitor *m);
-/* Internals */
-static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc);
-static void getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr);
-static void setgaps(int oh, int ov, int ih, int iv);
-
-/* Settings */
-#if !PERTAG_PATCH
-static int enablegaps = 1;
-#endif // PERTAG_PATCH
-
-void
-setgaps(int oh, int ov, int ih, int iv)
-{
- if (oh < 0) oh = 0;
- if (ov < 0) ov = 0;
- if (ih < 0) ih = 0;
- if (iv < 0) iv = 0;
-
- selmon->gappoh = oh;
- selmon->gappov = ov;
- selmon->gappih = ih;
- selmon->gappiv = iv;
- arrange(selmon);
-}
-
-void
-togglegaps(const Arg *arg)
-{
- #if PERTAG_PATCH
- selmon->pertag->enablegaps[selmon->pertag->curtag] = !selmon->pertag->enablegaps[selmon->pertag->curtag];
- #else
- enablegaps = !enablegaps;
- #endif // PERTAG_PATCH
- arrange(NULL);
-}
-
-void
-defaultgaps(const Arg *arg)
-{
- setgaps(gappoh, gappov, gappih, gappiv);
-}
-
-void
-incrgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh + arg->i,
- selmon->gappov + arg->i,
- selmon->gappih + arg->i,
- selmon->gappiv + arg->i
- );
-}
-
-void
-incrigaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh,
- selmon->gappov,
- selmon->gappih + arg->i,
- selmon->gappiv + arg->i
- );
-}
-
-void
-incrogaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh + arg->i,
- selmon->gappov + arg->i,
- selmon->gappih,
- selmon->gappiv
- );
-}
-
-void
-incrohgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh + arg->i,
- selmon->gappov,
- selmon->gappih,
- selmon->gappiv
- );
-}
-
-void
-incrovgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh,
- selmon->gappov + arg->i,
- selmon->gappih,
- selmon->gappiv
- );
-}
-
-void
-incrihgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh,
- selmon->gappov,
- selmon->gappih + arg->i,
- selmon->gappiv
- );
-}
-
-void
-incrivgaps(const Arg *arg)
-{
- setgaps(
- selmon->gappoh,
- selmon->gappov,
- selmon->gappih,
- selmon->gappiv + arg->i
- );
-}
-
-void
-getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc)
-{
- unsigned int n, oe, ie;
- #if PERTAG_PATCH
- oe = ie = selmon->pertag->enablegaps[selmon->pertag->curtag];
- #else
- oe = ie = enablegaps;
- #endif // PERTAG_PATCH
- Client *c;
-
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
- if (smartgaps && n == 1) {
- oe = 0; // outer gaps disabled when only one client
- }
-
- *oh = m->gappoh*oe; // outer horizontal gap
- *ov = m->gappov*oe; // outer vertical gap
- *ih = m->gappih*ie; // inner horizontal gap
- *iv = m->gappiv*ie; // inner vertical gap
- *nc = n; // number of clients
-}
-
-void
-getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr)
-{
- unsigned int n;
- float mfacts, sfacts;
- int mtotal = 0, stotal = 0;
- Client *c;
-
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
- mfacts = MIN(n, m->nmaster);
- sfacts = n - m->nmaster;
-
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
- if (n < m->nmaster)
- mtotal += msize / mfacts;
- else
- stotal += ssize / sfacts;
-
- *mf = mfacts; // total factor of master area
- *sf = sfacts; // total factor of stack area
- *mr = msize - mtotal; // the remainder (rest) of pixels after an even master split
- *sr = ssize - stotal; // the remainder (rest) of pixels after an even stack split
-}
-
-/***
- * Layouts
- */
-
-/*
- * Bottomstack layout + gaps
- * https://dwm.suckless.org/patches/bottomstack/
- */
-static void
-bstack(Monitor *m)
-{
- unsigned int i, n;
- int oh, ov, ih, iv;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int sx = 0, sy = 0, sh = 0, sw = 0;
- float mfacts, sfacts;
- int mrest, srest;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- sx = mx = m->wx + ov;
- sy = my = m->wy + oh;
- sh = mh = m->wh - 2*oh;
- mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
- sw = m->ww - 2*ov - iv * (n - m->nmaster - 1);
-
- if (m->nmaster && n > m->nmaster) {
- sh = (mh - ih) * (1 - m->mfact);
- mh = mh - ih - sh;
- sx = mx;
- sy = my + mh + ih;
- }
-
- getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- if (i < m->nmaster) {
- resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
- mx += WIDTH(c) + iv;
- } else {
- resize(c, sx, sy, (sw / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
- sx += WIDTH(c) + iv;
- }
- }
-}
-
-static void
-bstackhoriz(Monitor *m)
-{
- unsigned int i, n;
- int oh, ov, ih, iv;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int sx = 0, sy = 0, sh = 0, sw = 0;
- float mfacts, sfacts;
- int mrest, srest;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- sx = mx = m->wx + ov;
- sy = my = m->wy + oh;
- mh = m->wh - 2*oh;
- sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
- mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
- sw = m->ww - 2*ov;
-
- if (m->nmaster && n > m->nmaster) {
- sh = (mh - ih) * (1 - m->mfact);
- mh = mh - ih - sh;
- sy = my + mh + ih;
- sh = m->wh - mh - 2*oh - ih * (n - m->nmaster);
- }
-
- getfacts(m, mw, sh, &mfacts, &sfacts, &mrest, &srest);
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- if (i < m->nmaster) {
- resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
- mx += WIDTH(c) + iv;
- } else {
- resize(c, sx, sy, sw - (2*c->bw), (sh / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0);
- sy += HEIGHT(c) + ih;
- }
- }
-}
-
-/*
- * Centred master layout + gaps
- * https://dwm.suckless.org/patches/centeredmaster/
- */
-void
-centeredmaster(Monitor *m)
-{
- unsigned int i, n;
- int oh, ov, ih, iv;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int lx = 0, ly = 0, lw = 0, lh = 0;
- int rx = 0, ry = 0, rw = 0, rh = 0;
- float mfacts = 0, lfacts = 0, rfacts = 0;
- int mtotal = 0, ltotal = 0, rtotal = 0;
- int mrest = 0, lrest = 0, rrest = 0;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- /* initialize areas */
- mx = m->wx + ov;
- my = m->wy + oh;
- mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1);
- mw = m->ww - 2*ov;
- lh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - 1);
- rh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1));
-
- if (m->nmaster && n > m->nmaster) {
- /* go mfact box in the center if more than nmaster clients */
- if (n - m->nmaster > 1) {
- /* ||<-S->|<---M--->|<-S->|| */
- mw = (m->ww - 2*ov - 2*iv) * m->mfact;
- lw = (m->ww - mw - 2*ov - 2*iv) / 2;
- rw = (m->ww - mw - 2*ov - 2*iv) - lw;
- mx += lw + iv;
- } else {
- /* ||<---M--->|<-S->|| */
- mw = (mw - iv) * m->mfact;
- lw = 0;
- rw = m->ww - mw - iv - 2*ov;
- }
- lx = m->wx + ov;
- ly = m->wy + oh;
- rx = mx + mw + iv;
- ry = m->wy + oh;
- }
-
- /* calculate facts */
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
- if (!m->nmaster || n < m->nmaster)
- mfacts += 1;
- else if ((n - m->nmaster) % 2)
- lfacts += 1; // total factor of left hand stack area
- else
- rfacts += 1; // total factor of right hand stack area
- }
-
- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
- if (!m->nmaster || n < m->nmaster)
- mtotal += mh / mfacts;
- else if ((n - m->nmaster) % 2)
- ltotal += lh / lfacts;
- else
- rtotal += rh / rfacts;
-
- mrest = mh - mtotal;
- lrest = lh - ltotal;
- rrest = rh - rtotal;
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- if (!m->nmaster || i < m->nmaster) {
- /* nmaster clients are stacked vertically, in the center of the screen */
- resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
- my += HEIGHT(c) + ih;
- } else {
- /* stack clients are stacked vertically */
- if ((i - m->nmaster) % 2 ) {
- resize(c, lx, ly, lw - (2*c->bw), (lh / lfacts) + ((i - 2*m->nmaster) < 2*lrest ? 1 : 0) - (2*c->bw), 0);
- ly += HEIGHT(c) + ih;
- } else {
- resize(c, rx, ry, rw - (2*c->bw), (rh / rfacts) + ((i - 2*m->nmaster) < 2*rrest ? 1 : 0) - (2*c->bw), 0);
- ry += HEIGHT(c) + ih;
- }
- }
- }
-}
-
-void
-centeredfloatingmaster(Monitor *m)
-{
- unsigned int i, n;
- float mfacts, sfacts;
- float mivf = 1.0; // master inner vertical gap factor
- int oh, ov, ih, iv, mrest, srest;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int sx = 0, sy = 0, sh = 0, sw = 0;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- sx = mx = m->wx + ov;
- sy = my = m->wy + oh;
- sh = mh = m->wh - 2*oh;
- mw = m->ww - 2*ov - iv*(n - 1);
- sw = m->ww - 2*ov - iv*(n - m->nmaster - 1);
-
- if (m->nmaster && n > m->nmaster) {
- mivf = 0.8;
- /* go mfact box in the center if more than nmaster clients */
- if (m->ww > m->wh) {
- mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmaster) - 1);
- mh = m->wh * 0.9;
- } else {
- mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) - 1);
- mh = m->wh * m->mfact;
- }
- mx = m->wx + (m->ww - mw) / 2;
- my = m->wy + (m->wh - mh - 2*oh) / 2;
-
- sx = m->wx + ov;
- sy = m->wy + oh;
- sh = m->wh - 2*oh;
- }
-
- getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
- if (i < m->nmaster) {
- /* nmaster clients are stacked horizontally, in the center of the screen */
- resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
- mx += WIDTH(c) + iv*mivf;
- } else {
- /* stack clients are stacked horizontally */
- resize(c, sx, sy, (sw / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
- sx += WIDTH(c) + iv;
- }
-}
-
-/*
- * Deck layout + gaps
- * https://dwm.suckless.org/patches/deck/
- */
-void
-deck(Monitor *m)
-{
- unsigned int i, n;
- int oh, ov, ih, iv;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int sx = 0, sy = 0, sh = 0, sw = 0;
- float mfacts, sfacts;
- int mrest, srest;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- sx = mx = m->wx + ov;
- sy = my = m->wy + oh;
- sh = mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
- sw = mw = m->ww - 2*ov;
-
- if (m->nmaster && n > m->nmaster) {
- sw = (mw - iv) * (1 - m->mfact);
- mw = mw - iv - sw;
- sx = mx + mw + iv;
- sh = m->wh - 2*oh;
- }
-
- getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
-
- if (n - m->nmaster > 0) /* override layout symbol */
- snprintf(m->ltsymbol, sizeof m->ltsymbol, "D %d", n - m->nmaster);
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
- if (i < m->nmaster) {
- resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
- my += HEIGHT(c) + ih;
- } else {
- resize(c, sx, sy, sw - (2*c->bw), sh - (2*c->bw), 0);
- }
-}
-
-/*
- * Fibonacci layout + gaps
- * https://dwm.suckless.org/patches/fibonacci/
- */
-void
-fibonacci(Monitor *m, int s)
-{
- unsigned int i, n;
- int nx, ny, nw, nh;
- int oh, ov, ih, iv;
- int nv, hrest = 0, wrest = 0, r = 1;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- nx = m->wx + ov;
- ny = m->wy + oh;
- nw = m->ww - 2*ov;
- nh = m->wh - 2*oh;
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
- if (r) {
- if ((i % 2 && (nh - ih) / 2 <= (bh + 2*c->bw))
- || (!(i % 2) && (nw - iv) / 2 <= (bh + 2*c->bw))) {
- r = 0;
- }
- if (r && i < n - 1) {
- if (i % 2) {
- nv = (nh - ih) / 2;
- hrest = nh - 2*nv - ih;
- nh = nv;
- } else {
- nv = (nw - iv) / 2;
- wrest = nw - 2*nv - iv;
- nw = nv;
- }
-
- if ((i % 4) == 2 && !s)
- nx += nw + iv;
- else if ((i % 4) == 3 && !s)
- ny += nh + ih;
- }
-
- if ((i % 4) == 0) {
- if (s) {
- ny += nh + ih;
- nh += hrest;
- }
- else {
- nh -= hrest;
- ny -= nh + ih;
- }
- }
- else if ((i % 4) == 1) {
- nx += nw + iv;
- nw += wrest;
- }
- else if ((i % 4) == 2) {
- ny += nh + ih;
- nh += hrest;
- if (i < n - 1)
- nw += wrest;
- }
- else if ((i % 4) == 3) {
- if (s) {
- nx += nw + iv;
- nw -= wrest;
- } else {
- nw -= wrest;
- nx -= nw + iv;
- nh += hrest;
- }
- }
- if (i == 0) {
- if (n != 1) {
- nw = (m->ww - iv - 2*ov) - (m->ww - iv - 2*ov) * (1 - m->mfact);
- wrest = 0;
- }
- ny = m->wy + oh;
- }
- else if (i == 1)
- nw = m->ww - nw - iv - 2*ov;
- i++;
- }
-
- resize(c, nx, ny, nw - (2*c->bw), nh - (2*c->bw), False);
- }
-}
-
-void
-dwindle(Monitor *m)
-{
- fibonacci(m, 1);
-}
-
-void
-spiral(Monitor *m)
-{
- fibonacci(m, 0);
-}
-
-/*
- * Gappless grid layout + gaps (ironically)
- * https://dwm.suckless.org/patches/gaplessgrid/
- */
-void
-gaplessgrid(Monitor *m)
-{
- unsigned int i, n;
- int x, y, cols, rows, ch, cw, cn, rn, rrest, crest; // counters
- int oh, ov, ih, iv;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- /* grid dimensions */
- for (cols = 0; cols <= n/2; cols++)
- if (cols*cols >= n)
- break;
- if (n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
- cols = 2;
- rows = n/cols;
- cn = rn = 0; // reset column no, row no, client count
-
- ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
- cw = (m->ww - 2*ov - iv * (cols - 1)) / cols;
- rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
- crest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
- x = m->wx + ov;
- y = m->wy + oh;
-
- for (i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
- if (i/rows + 1 > cols - n%cols) {
- rows = n/cols + 1;
- ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
- rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
- }
- resize(c,
- x,
- y + rn*(ch + ih) + MIN(rn, rrest),
- cw + (cn < crest ? 1 : 0) - 2*c->bw,
- ch + (rn < rrest ? 1 : 0) - 2*c->bw,
- 0);
- rn++;
- if (rn >= rows) {
- rn = 0;
- x += cw + ih + (cn < crest ? 1 : 0);
- cn++;
- }
- }
-}
-
-/*
- * Gridmode layout + gaps
- * https://dwm.suckless.org/patches/gridmode/
- */
-void
-grid(Monitor *m)
-{
- unsigned int i, n;
- int cx, cy, cw, ch, cc, cr, chrest, cwrest, cols, rows;
- int oh, ov, ih, iv;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
-
- /* grid dimensions */
- for (rows = 0; rows <= n/2; rows++)
- if (rows*rows >= n)
- break;
- cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
-
- /* window geoms (cell height/width) */
- ch = (m->wh - 2*oh - ih * (rows - 1)) / (rows ? rows : 1);
- cw = (m->ww - 2*ov - iv * (cols - 1)) / (cols ? cols : 1);
- chrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
- cwrest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
- cc = i / rows;
- cr = i % rows;
- cx = m->wx + ov + cc * (cw + iv) + MIN(cc, cwrest);
- cy = m->wy + oh + cr * (ch + ih) + MIN(cr, chrest);
- resize(c, cx, cy, cw + (cc < cwrest ? 1 : 0) - 2*c->bw, ch + (cr < chrest ? 1 : 0) - 2*c->bw, False);
- }
-}
-
-/*
- * Horizontal grid layout + gaps
- * https://dwm.suckless.org/patches/horizgrid/
- */
-void
-horizgrid(Monitor *m) {
- Client *c;
- unsigned int n, i;
- int oh, ov, ih, iv;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int sx = 0, sy = 0, sh = 0, sw = 0;
- int ntop, nbottom = 1;
- float mfacts, sfacts;
- int mrest, srest;
-
- /* Count windows */
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- if (n <= 2)
- ntop = n;
- else {
- ntop = n / 2;
- nbottom = n - ntop;
- }
- sx = mx = m->wx + ov;
- sy = my = m->wy + oh;
- sh = mh = m->wh - 2*oh;
- sw = mw = m->ww - 2*ov;
-
- if (n > ntop) {
- sh = (mh - ih) / 2;
- mh = mh - ih - sh;
- sy = my + mh + ih;
- mw = m->ww - 2*ov - iv * (ntop - 1);
- sw = m->ww - 2*ov - iv * (nbottom - 1);
- }
-
- mfacts = ntop;
- sfacts = nbottom;
- mrest = mw - (mw / ntop) * ntop;
- srest = sw - (sw / nbottom) * nbottom;
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
- if (i < ntop) {
- resize(c, mx, my, (mw / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
- mx += WIDTH(c) + iv;
- } else {
- resize(c, sx, sy, (sw / sfacts) + ((i - ntop) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
- sx += WIDTH(c) + iv;
- }
-}
-
-/*
- * nrowgrid layout + gaps
- * https://dwm.suckless.org/patches/nrowgrid/
- */
-void
-nrowgrid(Monitor *m)
-{
- unsigned int n;
- int ri = 0, ci = 0; /* counters */
- int oh, ov, ih, iv; /* vanitygap settings */
- unsigned int cx, cy, cw, ch; /* client geometry */
- unsigned int uw = 0, uh = 0, uc = 0; /* utilization trackers */
- unsigned int cols, rows = m->nmaster + 1;
- Client *c;
-
- /* count clients */
- getgaps(m, &oh, &ov, &ih, &iv, &n);
-
- /* nothing to do here */
- if (n == 0)
- return;
-
- /* force 2 clients to always split vertically */
- if (FORCE_VSPLIT && n == 2)
- rows = 1;
-
- /* never allow empty rows */
- if (n < rows)
- rows = n;
-
- /* define first row */
- cols = n / rows;
- uc = cols;
- cy = m->wy + oh;
- ch = (m->wh - 2*oh - ih*(rows - 1)) / rows;
- uh = ch;
-
- for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++) {
- if (ci == cols) {
- uw = 0;
- ci = 0;
- ri++;
-
- /* next row */
- cols = (n - uc) / (rows - ri);
- uc += cols;
- cy = m->wy + oh + uh + ih;
- uh += ch + ih;
- }
-
- cx = m->wx + ov + uw;
- cw = (m->ww - 2*ov - uw) / (cols - ci);
- uw += cw + iv;
-
- resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0);
- }
-}
-
-/*
- * Default tile layout + gaps
- */
-static void
-tile(Monitor *m)
-{
- unsigned int i, n;
- int oh, ov, ih, iv;
- int mx = 0, my = 0, mh = 0, mw = 0;
- int sx = 0, sy = 0, sh = 0, sw = 0;
- float mfacts, sfacts;
- int mrest, srest;
- Client *c;
-
- getgaps(m, &oh, &ov, &ih, &iv, &n);
- if (n == 0)
- return;
-
- sx = mx = m->wx + ov;
- sy = my = m->wy + oh;
- mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
- sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
- sw = mw = m->ww - 2*ov;
-
- if (m->nmaster && n > m->nmaster) {
- sw = (mw - iv) * (1 - m->mfact);
- mw = mw - iv - sw;
- sx = mx + mw + iv;
- }
-
- getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
-
- for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
- if (i < m->nmaster) {
- resize(c, mx, my, mw - (2*c->bw), (mh / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
- my += HEIGHT(c) + ih;
- } else {
- resize(c, sx, sy, sw - (2*c->bw), (sh / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0);
- sy += HEIGHT(c) + ih;
- }
-} \ No newline at end of file