diff options
Diffstat (limited to 'patch.diff')
-rw-r--r-- | patch.diff | 3972 |
1 files changed, 656 insertions, 3316 deletions
@@ -1,8 +1,17 @@ +diff --git a/.gitignore b/.gitignore +new file mode 100644 +index 0000000..8a283f2 +--- /dev/null ++++ b/.gitignore +@@ -0,0 +1,3 @@ ++config.h ++*.o ++dwm diff --git a/Makefile b/Makefile -index 77bcbc0..6a65b9d 100644 +index ffa69b4..fbc7483 100644 --- a/Makefile +++ b/Makefile -@@ -37,8 +37,9 @@ dist: clean +@@ -31,8 +31,9 @@ dist: clean rm -rf dwm-${VERSION} install: all @@ -14,564 +23,457 @@ index 77bcbc0..6a65b9d 100644 chmod 755 ${DESTDIR}${PREFIX}/bin/dwm mkdir -p ${DESTDIR}${MANPREFIX}/man1 sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 -@@ -46,6 +47,7 @@ install: all +@@ -40,6 +41,7 @@ install: all uninstall: rm -f ${DESTDIR}${PREFIX}/bin/dwm\ + ${DESTDIR}${PREFIX}/bin/dwmc\ ${DESTDIR}${MANPREFIX}/man1/dwm.1 - .PHONY: all options clean dist install uninstall + .PHONY: all clean dist install uninstall diff --git a/config.def.h b/config.def.h -index a2ac963..4901408 100644 +index 9efa774..bc83444 100644 --- a/config.def.h +++ b/config.def.h -@@ -2,7 +2,13 @@ +@@ -1,116 +1,351 @@ + /* See LICENSE file for copyright and license details. */ ++#include <X11/XF86keysym.h> ++ /* appearance */ - static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int gappx = 6; /* gaps between windows */ - static const unsigned int snap = 32; /* snap pixel */ -+static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ +-static const unsigned int borderpx = 1; /* border pixel of windows */ +-static const unsigned int snap = 32; /* snap pixel */ +-static const int showbar = 1; /* 0 means no bar */ +-static const int topbar = 1; /* 0 means bottom bar */ +-static const char *fonts[] = { "monospace:size=10" }; +-static const char dmenufont[] = "monospace:size=10"; +-static const char col_gray1[] = "#222222"; +-static const char col_gray2[] = "#444444"; +-static const char col_gray3[] = "#bbbbbb"; +-static const char col_gray4[] = "#eeeeee"; +-static const char col_cyan[] = "#005577"; +-static const char *colors[][3] = { +- /* fg bg border */ +- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, +- [SchemeSel] = { col_gray4, col_cyan, col_cyan }, ++static unsigned int borderpx = 1; /* border pixel of windows */ ++static unsigned int gappx = 6; /* gaps between windows */ ++static unsigned int snap = 32; /* snap pixel */ ++static const int swallowfloating = 0; ++static const unsigned int systraypinning = 1; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ +static const unsigned int systrayspacing = 2; /* systray spacing */ -+static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor */ -+static const int showsystray = 1; /* 0 means no systray */ -+static const int swallowfloating = 0; /* 1 means swallow floating windows by default */ - static const int showbar = 1; /* 0 means no bar */ - static const int topbar = 1; /* 0 means bottom bar */ - static const char *fonts[] = { "monospace:size=10" }; -@@ -12,10 +18,25 @@ static const char col_gray2[] = "#444444"; - static const char col_gray3[] = "#bbbbbb"; - static const char col_gray4[] = "#eeeeee"; - static const char col_cyan[] = "#005577"; -+static const char col_urgborder[] = "#ff0000"; - static const char *colors[][3] = { - /* fg bg border */ - [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, - [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -+ [SchemeUrg] = { col_gray4, col_cyan, col_urgborder }, ++static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ ++static const int showsystray = 1; /* 0 means no systray */ ++static int showbar = 1; /* 0 means no bar */ ++static int topbar = 1; /* 0 means bottom bar */ ++static const char *fonts[] = { "JetBrainsMono Nerd Font Mono:size=15", "symbola:size=10" }; ++static const char dmenufont[] = "JetBrainsMono Nerd Font Mono:size=15"; ++static char normbgcolor[] = "#000000"; ++static char normbordercolor[] = "#6e6f6c"; ++static char normfgcolor[] = "#898883"; ++static char selfgcolor[] = "#c5c3bc"; ++static char selbordercolor[] = "#2783a1"; ++static char selbgcolor[] = "#675f58"; ++static char urgfgcolor[] = "#c5c3bc"; ++static char urgbordercolor[] = "#2783a1"; ++static char urgbgcolor[] = "#675f58"; ++ ++static char *colors[][3] = { ++ /* fg bg border */ ++ [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor }, /* unfocused wins */ ++ [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor }, /* the focused win */ ++ [SchemeUrg] = { urgfgcolor, urgbgcolor, urgbordercolor }, +}; + +typedef struct { + const char *name; + const void *cmd; +} Sp; -+const char *spcmd1[] = {"st", "-n", "sphtop", "-g", "120x34", NULL }; -+const char *spcmd2[] = {"st", "-n", "spst", "-g", "120x34", NULL }; -+const char *spcmd3[] = {"st", "-n", "sppm", "-g", "120x34", NULL }; ++const char *spcmd0[] = { "st", "-g", "100x33", "-c", "sphtop", "-e", "htop", NULL }; ++const char *spcmd1[] = { "st", "-g", "100x33", "-c", "spterm", NULL }; ++const char *spcmd2[] = { "st", "-g", "100x33", "-c", "sppmxr", "-e", "pulsemixer", NULL }; ++const char *spcmd3[] = { "st", "-g", "100x33", "-c", "spblue", "-e", "bluetoothctl", NULL }; ++const char *spcmd4[] = { "st", "-g", "100x33", "-c", "spncmp", "-e", "ncmpcpp", NULL }; ++const char *spcmd5[] = { "st", "-g", "100x33", "-c", "spmutt", "-e", "zsh", "-c", "neomutt", NULL }; ++const char *spcmd6[] = { "st", "-g", "100x33", "-c", "spxmpp", "-e", "profanity", NULL }; ++const char *spcmd7[] = { "st", "-g", "100x33", "-c", "spircc", "-e", "irssi", NULL }; ++const char *spcmd8[] = { "st", "-g", "100x33", "-c", "sptodo", "-e", "todo", NULL }; ++const char *spcmd9[] = { "st", "-g", "100x33", "-c", "sptrmc", "-e", "tremc", NULL }; +static Sp scratchpads[] = { -+ {"sphtop", spcmd1}, -+ {"spst", spcmd2}, -+ {"sppm", spcmd3}, ++ { "sphtop", spcmd0 }, ++ { "spterm", spcmd1 }, ++ { "sppmxr", spcmd2 }, ++ { "spblue", spcmd3 }, ++ { "spncmp", spcmd4 }, ++ { "spmutt", spcmd5 }, ++ { "spxmpp", spcmd6 }, ++ { "spircc", spcmd7 }, ++ { "sptodo", spcmd8 }, ++ { "sptrmc", spcmd9 }, }; /* tagging */ -@@ -26,9 +47,14 @@ static const Rule rules[] = { - * WM_CLASS(STRING) = instance, class - * WM_NAME(STRING) = title - */ +-static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; ++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 monitor */ - { "Gimp", NULL, NULL, 0, 1, -1 }, - { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -+ /* 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 */ -+ { NULL, "sphtop", NULL, SPTAG(0), 1, 1, 1, -1 }, -+ { NULL, "spst", NULL, SPTAG(1), 1, 1, 1, -1 }, -+ { NULL, "sppm", NULL, SPTAG(2), 1, 1, 1, -1 }, ++ /* xprop(1): ++ * WM_CLASS(STRING) = instance, class ++ * WM_NAME(STRING) = title ++ */ ++ /*class instance title tags mask isfloating isterminal noswallow monitor */ ++ { NULL, NULL, "Picture in picture", 511, 1, 0, 0, -1 }, ++ { "ardour-6.2.0", NULL, NULL, 0, 1, 0, 0, -1 }, ++ { "urxvt", NULL, NULL, 0, 0, 1, 0, -1 }, ++ { "URxvt", NULL, NULL, 0, 0, 1, 0, -1 }, ++ { "Ardour-6.2.0", NULL, NULL, 0, 1, 0, 0, -1 }, ++ { "Gimp", NULL, NULL, 0, 1, 0, 0, -1 }, ++ { "st-256color", NULL, NULL, 0, 0, 1, 1, -1 }, ++ { "st", NULL, NULL, 0, 0, 1, 1, -1 }, ++ { "St", NULL, NULL, 0, 0, 1, 1, -1 }, ++ { "tabbed", NULL, NULL, 0, 0, 1, 0, -1 }, ++ { NULL, NULL, "abduco", 0, 0, 1, 0, -1 }, ++ { "Alacritty", NULL, NULL, 0, 0, 1, 0, -1 }, ++ { "Blueman", NULL, NULL, 0, 1, 0, 0, -1 }, ++ { "QjackCtl", NULL, NULL, 0, 1, 0, 0, -1 }, ++ { "qjackctl", NULL, NULL, 0, 1, 0, 0, -1 }, ++ { "catia.py", NULL, NULL, 0, 1, 0, 0, -1 }, ++ { "Catia", NULL, NULL, 0, 1, 0, 0, -1 }, ++ { NULL, "carla", NULL, 1 << 7, 1, 0, 0, -1 }, ++ { NULL, NULL, "Event Tester", 0, 1, 0, 1, -1 }, ++ { "Steam", NULL, NULL, 4, 0, 0, 0, -1 }, ++ { "steam", NULL, NULL, 4, 0, 0, 0, -1 }, ++ { NULL, NULL, "steam", 4, 0, 0, 0, -1 }, ++ { "Lutris", NULL, NULL, 2, 0, 0, 0, -1 }, ++ { "lutris", NULL, NULL, 2, 0, 0, 0, -1 }, ++ { "sphtop", NULL, NULL, SPTAG(0), 1, 1, 1, -1 }, ++ { "spterm", NULL, NULL, SPTAG(1), 1, 1, 1, -1 }, ++ { "sppmxr", NULL, NULL, SPTAG(2), 1, 1, 1, -1 }, ++ { "spblue", NULL, NULL, SPTAG(3), 1, 1, 1, -1 }, ++ { "spncmp", NULL, NULL, SPTAG(4), 1, 1, 1, -1 }, ++ { "spmutt", NULL, NULL, SPTAG(5), 1, 1, 1, -1 }, ++ { "spxmpp", NULL, NULL, SPTAG(6), 1, 1, 1, -1 }, ++ { "spircc", NULL, NULL, SPTAG(7), 1, 1, 1, -1 }, ++ { "sptodo", NULL, NULL, SPTAG(8), 1, 1, 1, -1 }, ++ { "sptrmc", NULL, NULL, SPTAG(9), 1, 1, 1, -1 }, ++ { NULL, "monero-wallet-gui", NULL, 256, 1, 0, 0, -1 }, ++ { "The Crown EX", NULL, NULL, 0, 1, 0, 0, -1 }, }; /* layout(s) */ -@@ -37,11 +63,15 @@ static const int nmaster = 1; /* number of clients in master area */ - static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +-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 */ ++static float mfact = 0.50; /* factor of master area size [0.05..0.95] */ ++static int nmaster = 1; /* number of clients in master area */ ++static int resizehints = 1; /* 1 means respect size hints in tiled resizals */ static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ +static int attachbelow = 1; /* 1 means attach after the currently active window */ + +#include "tcl.c" static const Layout layouts[] = { - /* symbol arrange function */ - { "[]=", tile }, /* first entry is default */ - { "><>", NULL }, /* no layout function means floating behavior */ - { "[M]", monocle }, +- /* symbol arrange function */ +- { "[]=", tile }, /* first entry is default */ +- { "><>", NULL }, /* no layout function means floating behavior */ +- { "[M]", monocle }, ++ /* symbol arrange function */ ++ { "[]=", tile }, /* first entry is default */ ++ { "><>", NULL }, /* no layout function means floating behavior */ ++ { "[M]", monocle }, + { "|||", tcl }, }; /* key definitions */ -@@ -60,6 +90,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() - static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; - static const char *termcmd[] = { "st", NULL }; - -+ - static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, -@@ -71,20 +102,28 @@ static Key keys[] = { - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, -+ { MODKEY|ShiftMask, XK_h, setcfact, {.f = +0.25} }, -+ { MODKEY|ShiftMask, XK_l, setcfact, {.f = -0.25} }, -+ { MODKEY|ShiftMask, XK_o, setcfact, {.f = 0.00} }, - { MODKEY, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY|ShiftMask, XK_t, setlayout, {.v = &layouts[3]} }, - { 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 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, -+ { MODKEY, XK_y, togglescratch, {.ui = 0 } }, -+ { MODKEY, XK_u, togglescratch, {.ui = 1 } }, -+ { MODKEY, XK_x, togglescratch, {.ui = 2 } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) -@@ -95,6 +134,7 @@ static Key keys[] = { - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, -+ { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} }, - }; - - /* button definitions */ -@@ -104,13 +144,85 @@ static Button buttons[] = { - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, -- { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, -+ { ClkStatusText, 0, Button1, sigdwmblocks, {.i = 1} }, -+ { ClkStatusText, 0, Button2, sigdwmblocks, {.i = 2} }, -+ { ClkStatusText, 0, Button3, sigdwmblocks, {.i = 3} }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, -- { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, -+ { ClkClientWin, MODKEY, Button1, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, - }; - -+void -+setlayoutex(const Arg *arg) -+{ -+ setlayout(&((Arg) { .v = &layouts[arg->i] })); -+} -+ -+void -+viewex(const Arg *arg) -+{ -+ view(&((Arg) { .ui = 1 << arg->ui })); -+} -+ -+void -+viewall(const Arg *arg) -+{ -+ view(&((Arg){.ui = ~0})); -+} -+ -+void -+toggleviewex(const Arg *arg) -+{ -+ toggleview(&((Arg) { .ui = 1 << arg->ui })); -+} -+ -+void -+tagex(const Arg *arg) -+{ -+ tag(&((Arg) { .ui = 1 << arg->ui })); -+} -+ -+void -+toggletagex(const Arg *arg) -+{ -+ toggletag(&((Arg) { .ui = 1 << arg->ui })); -+} -+ -+void -+tagall(const Arg *arg) -+{ -+ tag(&((Arg){.ui = ~0})); -+} -+ -+/* signal definitions */ -+/* signum must be greater than 0 */ -+/* trigger signals using `xsetroot -name "fsignal:<signame> [<type> <value>]"` */ -+static Signal signals[] = { -+ /* signum function */ -+ { "focusstack", focusstack }, -+ { "setmfact", setmfact }, -+ { "togglebar", togglebar }, -+ { "incnmaster", incnmaster }, -+ { "togglefloating", togglefloating }, -+ { "focusmon", focusmon }, -+ { "tagmon", tagmon }, -+ { "zoom", zoom }, -+ { "view", view }, -+ { "viewall", viewall }, -+ { "viewex", viewex }, -+ { "toggleview", view }, -+ { "toggleviewex", toggleviewex }, -+ { "tag", tag }, -+ { "tagall", tagall }, -+ { "tagex", tagex }, -+ { "toggletag", tag }, -+ { "toggletagex", toggletagex }, -+ { "killclient", killclient }, -+ { "quit", quit }, -+ { "setlayout", setlayout }, -+ { "setlayoutex", setlayoutex }, -+}; -diff --git a/config.h b/config.h -new file mode 100644 -index 0000000..a2f923d ---- /dev/null -+++ b/config.h -@@ -0,0 +1,328 @@ -+/* See LICENSE file for copyright and license details. */ -+ -+#include <X11/XF86keysym.h> -+ -+static const char normfgcolor[] = "#bbbbbb"; -+static const char selbordercolor[] = "#005577"; -+static const char selbgcolor[] = "#005577"; -+static const char urgbordercolor[] = "#ff0000"; -+/* appearance */ -+static const unsigned int borderpx = 1; /* border pixel of windows */ -+static const unsigned int gappx = 6; /* gaps between windows */ -+static const unsigned int snap = 32; /* snap pixel */ -+static const int swallowfloating = 0; -+static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ -+static const unsigned int systrayspacing = 2; /* systray spacing */ -+static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ -+static const int showsystray = 1; /* 0 means no systray */ -+static const int showbar = 1; /* 0 means no bar */ -+static const int topbar = 1; /* 0 means bottom bar */ -+static const char *fonts[] = { "mononoki Nerd Font Mono:size=12", "symbola:size=10" }; -+static const char dmenufont[] = "mononoki Nerd Font Mono:size=12"; -+static const char col_gray1[] = "#151219"; -+static const char col_gray2[] = "#6e6f6c"; -+static const char col_gray3[] = "#898883"; -+static const char col_gray4[] = "#c5c3bc"; -+static const char col_cyan[] = "#2783a1"; -+static const char col_other[] = "#675f58"; -+ -+static const char *colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { col_gray4, col_gray1, col_gray3 }, // unfocused wins -+ [SchemeSel] = { col_gray4, col_gray2, col_gray4 }, // the focused win -+ [SchemeUrg] = { col_gray4, col_gray1, col_other }, -+}; -+ -+typedef struct { -+ const char *name; -+ const void *cmd; -+} Sp; -+const char *spcmd01[] = { "st", "-g", "100x33", "-c", "sphtop", "-e", "htop", NULL }; -+const char *spcmd02[] = { "st", "-g", "100x33", "-c", "spterm", NULL }; -+const char *spcmd03[] = { "st", "-g", "100x33", "-c", "sppmxr", "-e", "pulsemixer", NULL }; -+const char *spcmd04[] = { "st", "-g", "100x33", "-c", "spxmrw", "-e", "xmrzachir", NULL }; -+const char *spcmd05[] = { "st", "-g", "100x33", "-c", "spncmp", "-e", "ncmpcpp", NULL }; -+const char *spcmd06[] = { "st", "-g", "100x33", "-c", "spmutt", "-e", "zsh", "-c", "neomutt", NULL }; -+const char *spcmd07[] = { "st", "-g", "100x33", "-c", "spxmpp", "-e", "profanity", NULL }; -+const char *spcmd08[] = { "st", "-g", "100x33", "-c", "spircc", "-e", "irssi", NULL }; -+const char *spcmd09[] = { "st", "-g", "100x33", "-c", "spmatr", "-e", "weechat", NULL }; -+const char *spcmd10[] = { "st", "-g", "100x33", "-c", "sptrem", "-e", "tremc", NULL }; -+static Sp scratchpads[] = { -+ { "sphtop", spcmd01 }, -+ { "spterm", spcmd02 }, -+ { "sppmxr", spcmd03 }, -+ { "spxmrw", spcmd04 }, -+ { "spncmp", spcmd05 }, -+ { "spmutt", spcmd06 }, -+ { "spxmpp", spcmd07 }, -+ { "spircc", spcmd08 }, -+ { "spmatr", spcmd09 }, -+ { "sptrem", spcmd10 }, -+}; -+ -+/* 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,"Picture in picture", 511, 1, 0, 0, -1 }, -+ { "ardour-6.2.0",NULL, NULL, 0, 1, 0, 0, -1 }, -+ { "urxvt", NULL, NULL, 0, 0, 1, 0, -1 }, -+ { "URxvt", NULL, NULL, 0, 0, 1, 0, -1 }, -+ { "Ardour-6.2.0",NULL, NULL, 0, 1, 0, 0, -1 }, -+ { "Gimp", NULL, NULL, 0, 1, 0, 0, -1 }, -+ { "st-256color",NULL, NULL, 0, 0, 1, 1, -1 }, -+ { "st", NULL, NULL, 0, 0, 1, 1, -1 }, -+ { "St", NULL, NULL, 0, 0, 1, 1, -1 }, -+ { "tabbed", NULL, NULL, 0, 0, 1, 0, -1 }, -+ { NULL, NULL, "abduco", 0, 0, 1, 0, -1 }, -+ { "Alacritty", NULL, NULL, 0, 0, 1, 0, -1 }, -+ { "Blueman", NULL, NULL, 0, 1, 0, 0, -1 }, -+ { "QjackCtl", NULL, NULL, 0, 1, 0, 0, -1 }, -+ { "qjackctl", NULL, NULL, 0, 1, 0, 0, -1 }, -+ { "catia.py", NULL, NULL, 0, 1, 0, 0, -1 }, -+ { "Catia", NULL, NULL, 0, 1, 0, 0, -1 }, -+ { NULL, "carla",NULL, 1 << 7, 1, 0, 0, -1 }, -+ { NULL, NULL, "Event Tester", 0, 1, 0, 1, -1 }, -+ { "Steam", NULL, NULL, 4, 0, 0, 0, -1 }, -+ { "steam", NULL, NULL, 4, 0, 0, 0, -1 }, -+ { NULL, NULL, "steam", 4, 0, 0, 0, -1 }, -+ { "Lutris", NULL, NULL, 2, 0, 0, 0, -1 }, -+ { "lutris", NULL, NULL, 2, 0, 0, 0, -1 }, -+ { "sphtop", NULL, NULL, SPTAG(0), 1, 1, 1, -1 }, -+ { "spterm", NULL, NULL, SPTAG(1), 1, 1, 1, -1 }, -+ { "sppmxr", NULL, NULL, SPTAG(2), 1, 1, 1, -1 }, -+ { "spxmrw", NULL, NULL, SPTAG(3), 1, 1, 1, -1 }, -+ { "spncmp", NULL, NULL, SPTAG(4), 1, 1, 1, -1 }, -+ { "spmutt", NULL, NULL, SPTAG(5), 1, 1, 1, -1 }, -+ { "spxmpp", NULL, NULL, SPTAG(6), 1, 1, 1, -1 }, -+ { "spircc", NULL, NULL, SPTAG(7), 1, 1, 1, -1 }, -+ { "spmatr", NULL, NULL, SPTAG(8), 1, 1, 1, -1 }, -+ { "sptrem", NULL, NULL, SPTAG(9), 1, 1, 1, -1 }, -+ { NULL, "monero-wallet-gui",NULL, 256, 1, 0, 0, -1 }, -+}; -+ -+/* layout(s) */ -+static const float mfact = 0.50; /* 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 */ -+static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ -+ -+static int attachbelow = 1; /* 1 means attach after the currently active window */ -+ -+#include "tcl.c" -+static const Layout layouts[] = { -+ /* symbol arrange function */ -+ { "[]=", tile }, /* first entry is default */ -+ { "><>", NULL }, /* no layout function means floating behavior */ -+ { "[M]", monocle }, -+ { "|||", tcl }, -+}; -+ -+/* key definitions */ -+#define MODKEY Mod1Mask -+#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", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +-#define MODKEY Mod1Mask ++#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} }, ++ { 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", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; ++static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; +/* static const char *rmenucmd[] = { "/usr/sbin/j4-dmenu-desktop", NULL }; */ +/* static const char *passmenu[] = { "passmenu", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; */ -+static const char *termcmd[] = { "st", NULL }; + static const char *termcmd[] = { "st", NULL }; +/* static const char *termcmd[] = { "alacritty", NULL }; */ -+static const char *sxhkdsig[] = { "pkill", "-USR1", "sxhkd", NULL }; ++static const char *sxhkdsig[] = { "pkill", "-x", "-USR1", "sxhkd", NULL }; +/* static const char *mpdtoggle[] = { "playerctl", "--player=mpd,mpv,%any", "play-pause", NULL }; */ +/* static const char *mpdnext[] = { "playerctl", "--player=mpd,mpv,%any", "next", NULL }; */ +/* static const char *mpdprev[] = { "playerctl", "--player=mpd,mpv,%any", "previous", NULL }; */ +/* static const char *plytoggle[] = { "playerctl", "--player=%any,mpd", "play-pause", NULL }; */ +/* static const char *plyfwd[] = { "playerctl", "--player=%any,mpd", "position 5+", NULL }; */ +/* static const char *plybck[] = { "playerctl", "--player=%any,mpd", "position 5-", NULL }; */ -+/* static const char *blightup[] = { "light", "-A", "1", NULL }; */ -+/* static const char *blightdown[] = { "light", "-U", "1", NULL }; */ ++/* static const char *blightup[] = { "bl", "-i", NULL }; */ ++/* static const char *blightdown[] = { "bl", "-d", NULL }; */ +/* static const char *audioup[] = { "volsv", "-i", NULL }; */ +/* static const char *audiodown[] = { "volsv", "-d", NULL }; */ +/* static const char *audiomute[] = { "volsv", "-t", NULL }; */ +/* static const char *micmute[] = { "pamixer", "--source", "1", "-t", NULL }; */ -+/* static const char *lockscr[] = { "xscreensaver-command", "-lock", NULL }; */ ++/* static const char *lockscr[] = { "loginctl", "lock-session", NULL }; */ +/* static const char *xidletog[] = { "xidletog", NULL }; */ +/* static const char *xkillcmd[] = { "xkill", NULL }; */ + -+static Key keys[] = { -+ /* modifier key function argument */ -+ /* { MODKEY, XK_d, spawn, {.v = dmenucmd } }, */ -+ /* { MODKEY, XK_r, spawn, {.v = rmenucmd } }, */ -+ /* { MODKEY, XK_p, spawn, {.v = passmenu } }, */ -+ /* { MODKEY, XK_c, spawn, {.v = xidletog } }, */ -+ /* { MODKEY, XK_x, spawn, {.v = xkillcmd } }, */ -+ { MODKEY, XK_Return, spawn, {.v = termcmd } }, -+ { MODKEY|ControlMask, XK_z, togglescratch, {.ui = 0 } }, -+ { MODKEY|ControlMask, XK_x, togglescratch, {.ui = 1 } }, -+ { MODKEY|ControlMask, XK_c, togglescratch, {.ui = 2 } }, -+ { MODKEY|ControlMask, XK_v, togglescratch, {.ui = 3 } }, -+ { MODKEY|ControlMask, XK_b, togglescratch, {.ui = 4 } }, -+ { MODKEY|ControlMask, XK_a, togglescratch, {.ui = 5 } }, -+ { MODKEY|ControlMask, XK_s, togglescratch, {.ui = 6 } }, -+ { MODKEY|ControlMask, XK_d, togglescratch, {.ui = 7 } }, -+ { MODKEY|ControlMask, XK_f, togglescratch, {.ui = 8 } }, -+ { MODKEY|ControlMask, XK_g, togglescratch, {.ui = 9 } }, -+ { MODKEY, XK_Escape, spawn, {.v = sxhkdsig } }, -+ // { 0, XF86XK_AudioPlay, spawn, {.v = mpdtoggle } }, -+ // { 0, XF86XK_AudioNext, spawn, {.v = mpdnext } }, -+ // { 0, XF86XK_AudioPrev, spawn, {.v = mpdprev } }, -+ // { ShiftMask, XF86XK_AudioPlay, spawn, {.v = plytoggle } }, -+ // { ShiftMask, XF86XK_AudioNext, spawn, {.v = plyfwd } }, -+ // { ShiftMask, XF86XK_AudioPrev, spawn, {.v = plybck } }, -+ // { 0, XF86XK_MonBrightnessUp, spawn, {.v = blightup } }, -+ // { 0, XF86XK_MonBrightnessDown, spawn, {.v = blightdown } }, -+ // { 0, XF86XK_AudioLowerVolume, spawn, {.v = audiodown } }, -+ // { 0, XF86XK_AudioRaiseVolume, spawn, {.v = audioup } }, -+ // { 0, XF86XK_AudioMute, spawn, {.v = audiomute } }, -+ // { 0, XF86XK_AudioMicMute, spawn, {.v = micmute } }, -+ // { Mod4Mask, XK_l, spawn, {.v = lockscr } }, -+ { MODKEY, XK_b, togglebar, {0} }, -+ { MODKEY, XK_j, focusstack, {.i = +1 } }, -+ { MODKEY, XK_k, focusstack, {.i = -1 } }, -+ { MODKEY|ShiftMask, XK_j, pushdown, {.i = +1 } }, -+ { MODKEY|ShiftMask, XK_k, pushup, {.i = -1 } }, -+ { MODKEY|Mod4Mask, XK_j, pushmdown, {.i = +1 } }, -+ { MODKEY|Mod4Mask, XK_k, pushmup, {.i = -1 } }, -+ { MODKEY|ControlMask, XK_k, setcfact, {.f = +0.25} }, -+ { MODKEY|ControlMask, XK_j, setcfact, {.f = -0.25} }, -+ { MODKEY|ControlMask, XK_o, setcfact, {.f = 0.00} }, -+ { MODKEY|ShiftMask, XK_h, incnmaster, {.i = +1 } }, -+ { MODKEY|ShiftMask, XK_l, incnmaster, {.i = -1 } }, -+ { MODKEY, XK_h, setmfact, {.f = -0.05} }, -+ { MODKEY, XK_l, setmfact, {.f = +0.05} }, -+ { MODKEY|ShiftMask, XK_Return, zoom, {0} }, -+ { MODKEY, XK_Tab, view, {0} }, -+ { MODKEY|ShiftMask, XK_q, killclient, {0} }, -+ { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, -+ { MODKEY, XK_s, setlayout, {.v = &layouts[1]} }, -+ { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, -+ { MODKEY, XK_e, setlayout, {.v = &layouts[3]} }, -+ /* { MODKEY|ShiftMask, XK_space, setlayout, {-1} }, */ -+ { MODKEY, XK_space, togglefloating, {0} }, -+ { MODKEY, XK_f, togglefullscr, {0} }, -+ { MODKEY, XK_0, view, {.ui = ~0 } }, -+ { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, -+ { MODKEY|ControlMask, XK_comma, focusmon, {.i = -1 } }, -+ { MODKEY|ControlMask, XK_period, focusmon, {.i = +1 } }, -+ { MODKEY|ControlMask|ShiftMask, XK_comma, tagmon, {.i = -1 } }, -+ { MODKEY|ControlMask|ShiftMask, XK_period, tagmon, {.i = +1 } }, -+ 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) -+ { MODKEY|ShiftMask, XK_e, quit, {0} }, -+ { MODKEY|ShiftMask, XK_r, quit, {1} }, -+ { MODKEY|ShiftMask, XK_Tab, toggleAttachBelow, {0} }, ++/* ++ * Xresources preferences to load at startup ++ */ ++ResourcePref resources[] = { ++ { "normbgcolor", STRING, &normbgcolor }, ++ { "normbordercolor", STRING, &normbordercolor }, ++ { "normfgcolor", STRING, &normfgcolor }, ++ { "selbgcolor", STRING, &selbgcolor }, ++ { "selbordercolor", STRING, &selbordercolor }, ++ { "selfgcolor", STRING, &selfgcolor }, ++ { "urgbgcolor", STRING, &urgbgcolor }, ++ { "urgbordercolor", STRING, &urgbordercolor }, ++ { "urgfgcolor", STRING, &urgfgcolor }, ++ { "borderpx", INTEGER, &borderpx }, ++ { "gappx", INTEGER, &gappx }, ++ { "snap", INTEGER, &snap }, ++ { "showbar", INTEGER, &showbar }, ++ { "topbar", INTEGER, &topbar }, ++ { "nmaster", INTEGER, &nmaster }, ++ { "resizehints", INTEGER, &resizehints }, ++ { "mfact", FLOAT, &mfact }, +}; -+ -+/* 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, Button1, sigdwmblocks, {.i = 1} }, -+ { ClkStatusText, 0, Button2, sigdwmblocks, {.i = 2} }, -+ { ClkStatusText, 0, Button3, sigdwmblocks, {.i = 3} }, -+ { 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} }, + + static const Key keys[] = { +- /* modifier key function argument */ +- { MODKEY, XK_p, spawn, {.v = dmenucmd } }, +- { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, +- { MODKEY, XK_b, togglebar, {0} }, +- { MODKEY, XK_j, focusstack, {.i = +1 } }, +- { MODKEY, XK_k, focusstack, {.i = -1 } }, +- { MODKEY, XK_i, incnmaster, {.i = +1 } }, +- { MODKEY, XK_d, incnmaster, {.i = -1 } }, +- { MODKEY, XK_h, setmfact, {.f = -0.05} }, +- { MODKEY, XK_l, setmfact, {.f = +0.05} }, +- { MODKEY, XK_Return, zoom, {0} }, +- { MODKEY, XK_Tab, view, {0} }, +- { MODKEY|ShiftMask, XK_c, killclient, {0} }, +- { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, +- { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, +- { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, +- { MODKEY, XK_space, setlayout, {0} }, +- { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, +- { MODKEY, XK_0, view, {.ui = ~0 } }, +- { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, +- { MODKEY, XK_comma, focusmon, {.i = -1 } }, +- { MODKEY, XK_period, focusmon, {.i = +1 } }, +- { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, +- { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, +- 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) +- { MODKEY|ShiftMask, XK_q, quit, {0} }, ++ /* modifier key function argument */ ++ /* { MODKEY, XK_d, spawn, {.v = dmenucmd } }, */ ++ /* { MODKEY, XK_r, spawn, {.v = rmenucmd } }, */ ++ /* { MODKEY, XK_p, spawn, {.v = passmenu } }, */ ++ /* { MODKEY, XK_c, spawn, {.v = xidletog } }, */ ++ /* { MODKEY, XK_x, spawn, {.v = xkillcmd } }, */ ++ { MODKEY, XK_Return, spawn, {.v = termcmd } }, ++ { MODKEY|ControlMask, XK_z, togglescratch, {.ui = 0 } }, ++ { MODKEY|ControlMask, XK_x, togglescratch, {.ui = 1 } }, ++ { MODKEY|ControlMask, XK_c, togglescratch, {.ui = 2 } }, ++ { MODKEY|ControlMask, XK_v, togglescratch, {.ui = 3 } }, ++ { MODKEY|ControlMask, XK_b, togglescratch, {.ui = 4 } }, ++ { MODKEY|ControlMask, XK_a, togglescratch, {.ui = 5 } }, ++ { MODKEY|ControlMask, XK_s, togglescratch, {.ui = 6 } }, ++ { MODKEY|ControlMask, XK_d, togglescratch, {.ui = 7 } }, ++ { MODKEY|ControlMask, XK_f, togglescratch, {.ui = 8 } }, ++ { MODKEY|ControlMask, XK_g, togglescratch, {.ui = 9 } }, ++ { MODKEY, XK_Escape, spawn, {.v = sxhkdsig } }, ++ /* { 0, XF86XK_AudioPlay, spawn, {.v = mpdtoggle } }, */ ++ /* { 0, XF86XK_AudioNext, spawn, {.v = mpdnext } }, */ ++ /* { 0, XF86XK_AudioPrev, spawn, {.v = mpdprev } }, */ ++ /* { ShiftMask, XF86XK_AudioPlay, spawn, {.v = plytoggle } }, */ ++ /* { ShiftMask, XF86XK_AudioNext, spawn, {.v = plyfwd } }, */ ++ /* { ShiftMask, XF86XK_AudioPrev, spawn, {.v = plybck } }, */ ++ /* { 0, XF86XK_MonBrightnessUp, spawn, {.v = blightup } }, */ ++ /* { 0, XF86XK_MonBrightnessDown, spawn, {.v = blightdown } }, */ ++ /* { 0, XF86XK_AudioLowerVolume, spawn, {.v = audiodown } }, */ ++ /* { 0, XF86XK_AudioRaiseVolume, spawn, {.v = audioup } }, */ ++ /* { 0, XF86XK_AudioMute, spawn, {.v = audiomute } }, */ ++ /* { 0, XF86XK_AudioMicMute, spawn, {.v = micmute } }, */ ++ /* { MODKEY, XK_q, spawn, {.v = lockscr } }, */ ++ { MODKEY, XK_b, togglebar, {0} }, ++ { MODKEY, XK_j, focusstack, {.i = +1 } }, ++ { MODKEY, XK_k, focusstack, {.i = -1 } }, ++ { MODKEY|ShiftMask, XK_j, pushdown, {.i = +1 } }, ++ { MODKEY|ShiftMask, XK_k, pushup, {.i = -1 } }, ++ { MODKEY|Mod1Mask, XK_j, pushmdown, {.i = +1 } }, ++ { MODKEY|Mod1Mask, XK_k, pushmup, {.i = -1 } }, ++ { MODKEY|ControlMask, XK_k, setcfact, {.f = +0.25} }, ++ { MODKEY|ControlMask, XK_j, setcfact, {.f = -0.25} }, ++ { MODKEY|ControlMask, XK_o, setcfact, {.f = 0.00} }, ++ { MODKEY|ShiftMask, XK_h, incnmaster, {.i = +1 } }, ++ { MODKEY|ShiftMask, XK_l, incnmaster, {.i = -1 } }, ++ { MODKEY, XK_h, setmfact, {.f = -0.05} }, ++ { MODKEY, XK_l, setmfact, {.f = +0.05} }, ++ { MODKEY|ShiftMask, XK_Return, zoom, {0} }, ++ { MODKEY, XK_Tab, view, {0} }, ++ { MODKEY|ShiftMask, XK_q, killclient, {0} }, ++ { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, ++ { MODKEY, XK_s, setlayout, {.v = &layouts[1]} }, ++ { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, ++ /* { MODKEY, XK_e, setlayout, {.v = &layouts[3]} }, */ ++ /* { MODKEY, XK_space, setlayout, {-1} }, */ ++ { MODKEY, XK_space, togglefloating, {0} }, ++ { MODKEY, XK_f, togglefullscr, {0} }, ++ { MODKEY, XK_0, view, {.ui = ~0 } }, ++ { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, ++ { MODKEY, XK_comma, focusmon, {.i = -1 } }, ++ { MODKEY, XK_period, focusmon, {.i = +1 } }, ++ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, ++ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, ++ 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) ++ { MODKEY|ShiftMask, XK_e, quit, {0} }, ++ { MODKEY|ShiftMask, XK_r, quit, {1} }, ++ { MODKEY|ShiftMask, XK_Tab, toggleAttachBelow, {0} }, + }; + + /* button definitions */ + /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ + static const 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, {.v = termcmd } }, +- { 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} }, ++ /* 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, Button1, sigdwmblocks, {.i = 1} }, ++ { ClkStatusText, 0, Button2, sigdwmblocks, {.i = 2} }, ++ { ClkStatusText, 0, Button3, sigdwmblocks, {.i = 3} }, ++ { 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} }, +}; + +void +setlayoutex(const Arg *arg) +{ -+ setlayout(&((Arg) { .v = &layouts[arg->i] })); ++ setlayout(&((Arg) { .v = &layouts[arg->i] })); +} + +void +viewex(const Arg *arg) +{ -+ view(&((Arg) { .ui = 1 << arg->ui })); ++ view(&((Arg) { .ui = 1 << arg->ui })); +} + +void +viewall(const Arg *arg) +{ -+ view(&((Arg){.ui = ~0})); ++ view(&((Arg){.ui = ~0})); +} + +void +toggleviewex(const Arg *arg) +{ -+ toggleview(&((Arg) { .ui = 1 << arg->ui })); ++ toggleview(&((Arg) { .ui = 1 << arg->ui })); +} + +void +tagex(const Arg *arg) +{ -+ tag(&((Arg) { .ui = 1 << arg->ui })); ++ tag(&((Arg) { .ui = 1 << arg->ui })); +} + +void +toggletagex(const Arg *arg) +{ -+ toggletag(&((Arg) { .ui = 1 << arg->ui })); ++ toggletag(&((Arg) { .ui = 1 << arg->ui })); +} + +void +tagall(const Arg *arg) +{ -+ tag(&((Arg){.ui = ~0})); ++ tag(&((Arg){.ui = ~0})); +} + +/* signal definitions */ +/* signum must be greater than 0 */ +/* trigger signals using `xsetroot -name "fsignal:<signame> [<type> <value>]"` */ +static Signal signals[] = { -+ /* signum function */ -+ { "togglescratch", togglescratch }, -+ { "focusstack", focusstack }, -+ { "setmfact", setmfact }, -+ { "togglebar", togglebar }, -+ { "incnmaster", incnmaster }, -+ { "togglefloating", togglefloating }, -+ { "togglefullscr", togglefullscr }, -+ { "focusmon", focusmon }, -+ { "tagmon", tagmon }, -+ { "zoom", zoom }, -+ { "view", view }, -+ { "viewall", viewall }, -+ { "viewex", viewex }, -+ { "toggleview", view }, -+ { "toggleviewex", toggleviewex }, -+ { "tag", tag }, -+ { "tagall", tagall }, -+ { "tagex", tagex }, -+ { "toggletag", tag }, -+ { "toggletagex", toggletagex }, -+ { "killclient", killclient }, -+ { "quit", quit }, -+ { "setlayout", setlayout }, -+ { "setlayoutex", setlayoutex }, -+}; -+ ++ /* signum function */ ++ { "togglescratch", togglescratch }, ++ { "focusstack", focusstack }, ++ { "setmfact", setmfact }, ++ { "togglebar", togglebar }, ++ { "incnmaster", incnmaster }, ++ { "togglefloating", togglefloating }, ++ { "togglefullscr", togglefullscr }, ++ { "focusmon", focusmon }, ++ { "tagmon", tagmon }, ++ { "zoom", zoom }, ++ { "view", view }, ++ { "viewall", viewall }, ++ { "viewex", viewex }, ++ { "toggleview", view }, ++ { "toggleviewex", toggleviewex }, ++ { "tag", tag }, ++ { "tagall", tagall }, ++ { "tagex", tagex }, ++ { "toggletag", tag }, ++ { "toggletagex", toggletagex }, ++ { "killclient", killclient }, ++ { "quit", quit }, ++ { "setlayout", setlayout }, ++ { "setlayoutex", setlayoutex }, + }; + diff --git a/config.mk b/config.mk -index b6eb7e0..770b4e8 100644 +index 8efca9a..9f2070b 100644 --- a/config.mk +++ b/config.mk -@@ -6,6 +6,7 @@ VERSION = 6.3 +@@ -6,6 +6,7 @@ VERSION = 6.5 # paths PREFIX = /usr/local MANPREFIX = ${PREFIX}/share/man @@ -579,7 +481,7 @@ index b6eb7e0..770b4e8 100644 X11INC = /usr/X11R6/include X11LIB = /usr/X11R6/lib -@@ -22,12 +23,12 @@ FREETYPEINC = /usr/include/freetype2 +@@ -23,12 +24,12 @@ FREETYPEINC = /usr/include/freetype2 # includes and libs INCS = -I${X11INC} -I${FREETYPEINC} @@ -587,13 +489,39 @@ index b6eb7e0..770b4e8 100644 +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res # flags - CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} + CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} #CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} -CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS} +CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -O3 -march=native ${INCS} ${CPPFLAGS} LDFLAGS = ${LIBS} # Solaris +diff --git a/drw.c b/drw.c +index a58a2b4..f8a82f5 100644 +--- a/drw.c ++++ b/drw.c +@@ -195,7 +195,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname) + /* Wrapper to create color schemes. The caller has to call free(3) on the + * returned color scheme when done using it. */ + Clr * +-drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount) ++drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount) + { + size_t i; + Clr *ret; +diff --git a/drw.h b/drw.h +index 6471431..bdbf950 100644 +--- a/drw.h ++++ b/drw.h +@@ -40,7 +40,7 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in + + /* Colorscheme abstraction */ + void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); +-Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); ++Clr *drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount); + + /* Cursor abstraction */ + Cur *drw_cur_create(Drw *drw, int shape); diff --git a/dwm.1 b/dwm.1 index ddc8321..2da95f5 100644 --- a/dwm.1 @@ -633,10 +561,15 @@ index ddc8321..2da95f5 100644 .BR dmenu (1), .BR st (1) diff --git a/dwm.c b/dwm.c -index a96f33c..a049ff4 100644 +index f1d86b2..404f919 100644 --- a/dwm.c +++ b/dwm.c -@@ -40,6 +40,8 @@ +@@ -36,10 +36,13 @@ + #include <X11/Xlib.h> + #include <X11/Xproto.h> + #include <X11/Xutil.h> ++#include <X11/Xresource.h> + #ifdef XINERAMA #include <X11/extensions/Xinerama.h> #endif /* XINERAMA */ #include <X11/Xft/Xft.h> @@ -645,7 +578,7 @@ index a96f33c..a049ff4 100644 #include "drw.h" #include "util.h" -@@ -52,17 +54,38 @@ +@@ -52,17 +55,38 @@ #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) #define LENGTH(X) (sizeof X / sizeof X[0]) #define MOUSEMASK (BUTTONMASK|PointerMotionMask) @@ -688,14 +621,14 @@ index a96f33c..a049ff4 100644 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ -@@ -87,14 +110,17 @@ typedef struct Client Client; +@@ -87,14 +111,17 @@ typedef struct Client Client; struct Client { char name[256]; float mina, maxa; + float cfact; int x, y, w, h; int oldx, oldy, oldw, oldh; - int basew, baseh, incw, inch, maxw, maxh, minw, minh; + int basew, baseh, incw, inch, maxw, maxh, minw, minh, hintsvalid; int bw, oldbw; unsigned int tags; - int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; @@ -707,7 +640,7 @@ index a96f33c..a049ff4 100644 Monitor *mon; Window win; }; -@@ -106,6 +132,11 @@ typedef struct { +@@ -106,6 +133,11 @@ typedef struct { const Arg arg; } Key; @@ -719,7 +652,7 @@ index a96f33c..a049ff4 100644 typedef struct { const char *symbol; void (*arrange)(Monitor *); -@@ -138,16 +169,27 @@ typedef struct { +@@ -138,16 +170,40 @@ typedef struct { const char *title; unsigned int tags; int isfloating; @@ -734,6 +667,19 @@ index a96f33c..a049ff4 100644 + Client *icons; +}; + ++/* Xresources preferences */ ++enum resource_type { ++ STRING = 0, ++ INTEGER = 1, ++ FLOAT = 2 ++}; ++ ++typedef struct { ++ char *name; ++ enum resource_type type; ++ void *dst; ++} ResourcePref; ++ /* function declarations */ static void applyrules(Client *c); static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); @@ -747,7 +693,7 @@ index a96f33c..a049ff4 100644 static void buttonpress(XEvent *e); static void checkotherwm(void); static void cleanup(void); -@@ -156,6 +198,7 @@ static void clientmessage(XEvent *e); +@@ -156,6 +212,7 @@ static void clientmessage(XEvent *e); static void configure(Client *c); static void configurenotify(XEvent *e); static void configurerequest(XEvent *e); @@ -755,7 +701,7 @@ index a96f33c..a049ff4 100644 static Monitor *createmon(void); static void destroynotify(XEvent *e); static void detach(Client *c); -@@ -165,13 +208,16 @@ static void drawbar(Monitor *m); +@@ -165,13 +222,16 @@ static void drawbar(Monitor *m); static void drawbars(void); static void enternotify(XEvent *e); static void expose(XEvent *e); @@ -772,11 +718,11 @@ index a96f33c..a049ff4 100644 static int gettextprop(Window w, Atom atom, char *text, unsigned int size); static void grabbuttons(Client *c, int focused); static void grabkeys(void); -@@ -185,33 +231,48 @@ static void monocle(Monitor *m); +@@ -185,32 +245,47 @@ static void monocle(Monitor *m); static void motionnotify(XEvent *e); static void movemouse(const Arg *arg); static Client *nexttiled(Client *c); --static void pop(Client *); +-static void pop(Client *c); +static Client *prevtiled(Client *c); static void propertynotify(XEvent *e); +static void pushdown(const Arg *arg); @@ -807,7 +753,6 @@ index a96f33c..a049ff4 100644 static void setup(void); static void seturgent(Client *c, int urg); static void showhide(Client *c); - static void sigchld(int unused); +static void sigdwmblocks(const Arg *arg); +static void sighup(int unused); +static void sigterm(int unused); @@ -815,7 +760,7 @@ index a96f33c..a049ff4 100644 +static Monitor *systraytomon(Monitor *m); static void tag(const Arg *arg); static void tagmon(const Arg *arg); - static void tile(Monitor *); + static void tile(Monitor *m); static void togglebar(const Arg *arg); static void togglefloating(const Arg *arg); +static void togglefullscr(const Arg *arg); @@ -823,7 +768,7 @@ index a96f33c..a049ff4 100644 static void toggletag(const Arg *arg); static void toggleview(const Arg *arg); static void unfocus(Client *c, int setfocus); -@@ -224,20 +285,36 @@ static int updategeom(void); +@@ -223,20 +298,38 @@ static int updategeom(void); static void updatenumlockmask(void); static void updatesizehints(Client *c); static void updatestatus(void); @@ -841,13 +786,15 @@ index a96f33c..a049ff4 100644 static int xerrordummy(Display *dpy, XErrorEvent *ee); static int xerrorstart(Display *dpy, XErrorEvent *ee); static void zoom(const Arg *arg); - ++static void load_xresources(void); ++static void resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst); ++ +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 Client *prevzoom = NULL; +static Systray *systray = NULL; @@ -859,8 +806,8 @@ index a96f33c..a049ff4 100644 +pid_t dwmblockspid = 0; static int screen; static int sw, sh; /* X display screen geometry width, height */ - static int bh, blw = 0; /* bar geometry */ -@@ -258,9 +335,11 @@ static void (*handler[LASTEvent]) (XEvent *) = { + static int bh; /* bar height */ +@@ -257,9 +350,11 @@ static void (*handler[LASTEvent]) (XEvent *) = { [MapRequest] = maprequest, [MotionNotify] = motionnotify, [PropertyNotify] = propertynotify, @@ -873,7 +820,7 @@ index a96f33c..a049ff4 100644 static int running = 1; static Cur *cursor[CurLast]; static Clr **scheme; -@@ -269,6 +348,8 @@ static Drw *drw; +@@ -268,6 +363,8 @@ static Drw *drw; static Monitor *mons, *selmon; static Window root, wmcheckwin; @@ -882,7 +829,7 @@ index a96f33c..a049ff4 100644 /* configuration, allows nested code to access above variables */ #include "config.h" -@@ -286,6 +367,7 @@ applyrules(Client *c) +@@ -285,6 +382,7 @@ applyrules(Client *c) XClassHint ch = { NULL, NULL }; /* rule matching */ @@ -890,7 +837,7 @@ index a96f33c..a049ff4 100644 c->isfloating = 0; c->tags = 0; XGetClassHint(dpy, c->win, &ch); -@@ -298,8 +380,15 @@ applyrules(Client *c) +@@ -297,8 +395,15 @@ applyrules(Client *c) && (!r->class || strstr(class, r->class)) && (!r->instance || strstr(instance, r->instance))) { @@ -906,7 +853,7 @@ index a96f33c..a049ff4 100644 for (m = mons; m && m->num != r->monitor; m = m->next); if (m) c->mon = m; -@@ -309,7 +398,7 @@ applyrules(Client *c) +@@ -308,7 +413,7 @@ applyrules(Client *c) XFree(ch.res_class); if (ch.res_name) XFree(ch.res_name); @@ -915,7 +862,7 @@ index a96f33c..a049ff4 100644 } int -@@ -395,7 +484,7 @@ arrange(Monitor *m) +@@ -396,7 +501,7 @@ arrange(Monitor *m) void arrangemon(Monitor *m) { @@ -924,7 +871,7 @@ index a96f33c..a049ff4 100644 if (m->lt[m->sellt]->arrange) m->lt[m->sellt]->arrange(m); } -@@ -406,6 +495,26 @@ attach(Client *c) +@@ -407,6 +512,26 @@ attach(Client *c) c->next = c->mon->clients; c->mon->clients = c; } @@ -951,7 +898,7 @@ index a96f33c..a049ff4 100644 void attachstack(Client *c) -@@ -414,6 +523,61 @@ attachstack(Client *c) +@@ -415,6 +540,61 @@ attachstack(Client *c) c->mon->stack = c; } @@ -1013,9 +960,9 @@ index a96f33c..a049ff4 100644 void buttonpress(XEvent *e) { -@@ -440,9 +604,26 @@ buttonpress(XEvent *e) +@@ -441,9 +621,26 @@ buttonpress(XEvent *e) arg.ui = 1 << i; - } else if (ev->x < x + blw) + } else if (ev->x < x + TEXTW(selmon->ltsymbol)) click = ClkLtSymbol; - else if (ev->x > selmon->ww - (int)TEXTW(stext)) + else if (ev->x > (x = selmon->ww - (int)TEXTW(stext) + lrpad - getsystraywidth())) { @@ -1042,7 +989,7 @@ index a96f33c..a049ff4 100644 click = ClkWinTitle; } else if ((c = wintoclient(ev->window))) { focus(c); -@@ -483,6 +664,11 @@ cleanup(void) +@@ -484,6 +681,11 @@ cleanup(void) XUngrabKey(dpy, AnyKey, AnyModifier, root); while (mons) cleanupmon(mons); @@ -1054,7 +1001,7 @@ index a96f33c..a049ff4 100644 for (i = 0; i < CurLast; i++) drw_cur_free(drw, cursor[i]); for (i = 0; i < LENGTH(colors); i++) -@@ -513,9 +699,57 @@ cleanupmon(Monitor *mon) +@@ -515,9 +717,57 @@ cleanupmon(Monitor *mon) void clientmessage(XEvent *e) { @@ -1112,7 +1059,7 @@ index a96f33c..a049ff4 100644 if (!c) return; if (cme->message_type == netatom[NetWMState]) { -@@ -568,7 +802,7 @@ configurenotify(XEvent *e) +@@ -570,7 +820,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); @@ -1121,7 +1068,7 @@ index a96f33c..a049ff4 100644 } focus(NULL); arrange(NULL); -@@ -628,6 +862,19 @@ configurerequest(XEvent *e) +@@ -630,6 +880,19 @@ configurerequest(XEvent *e) XSync(dpy, False); } @@ -1141,7 +1088,7 @@ index a96f33c..a049ff4 100644 Monitor * createmon(void) { -@@ -653,6 +900,13 @@ destroynotify(XEvent *e) +@@ -655,6 +918,13 @@ destroynotify(XEvent *e) if ((c = wintoclient(ev->window))) unmanage(c, 1); @@ -1155,7 +1102,7 @@ index a96f33c..a049ff4 100644 } void -@@ -696,22 +950,27 @@ dirtomon(int dir) +@@ -698,22 +968,27 @@ dirtomon(int dir) void drawbar(Monitor *m) { @@ -1188,7 +1135,7 @@ index a96f33c..a049ff4 100644 for (c = m->clients; c; c = c->next) { occ |= c->tags; if (c->isurgent) -@@ -719,20 +978,25 @@ drawbar(Monitor *m) +@@ -721,20 +996,25 @@ drawbar(Monitor *m) } x = 0; for (i = 0; i < LENGTH(tags); i++) { @@ -1210,7 +1157,7 @@ index a96f33c..a049ff4 100644 + x += w; } - w = blw = TEXTW(m->ltsymbol); + w = TEXTW(m->ltsymbol); drw_setscheme(drw, scheme[SchemeNorm]); x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); @@ -1219,7 +1166,7 @@ index a96f33c..a049ff4 100644 if (m->sel) { drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); -@@ -743,7 +1007,7 @@ drawbar(Monitor *m) +@@ -745,7 +1025,7 @@ drawbar(Monitor *m) drw_rect(drw, x, 0, w, bh, 1, 1); } } @@ -1228,7 +1175,7 @@ index a96f33c..a049ff4 100644 } void -@@ -780,8 +1044,21 @@ expose(XEvent *e) +@@ -782,8 +1062,21 @@ expose(XEvent *e) Monitor *m; XExposeEvent *ev = &e->xexpose; @@ -1251,7 +1198,7 @@ index a96f33c..a049ff4 100644 } void -@@ -866,15 +1143,34 @@ getatomprop(Client *c, Atom prop) +@@ -868,15 +1161,34 @@ getatomprop(Client *c, Atom prop) unsigned long dl; unsigned char *p = NULL; Atom da, atom = None; @@ -1287,7 +1234,7 @@ index a96f33c..a049ff4 100644 int getrootptr(int *x, int *y) { -@@ -903,6 +1199,16 @@ getstate(Window w) +@@ -905,6 +1217,16 @@ getstate(Window w) return result; } @@ -1304,7 +1251,7 @@ index a96f33c..a049ff4 100644 int gettextprop(Window w, Atom atom, char *text, unsigned int size) { -@@ -1002,12 +1308,55 @@ keypress(XEvent *e) +@@ -1012,12 +1334,55 @@ keypress(XEvent *e) keys[i].func(&(keys[i].arg)); } @@ -1361,7 +1308,7 @@ index a96f33c..a049ff4 100644 XGrabServer(dpy); XSetErrorHandler(xerrordummy); XSetCloseDownMode(dpy, DestroyAll); -@@ -1021,18 +1370,20 @@ killclient(const Arg *arg) +@@ -1031,18 +1396,20 @@ killclient(const Arg *arg) void manage(Window w, XWindowAttributes *wa) { @@ -1383,15 +1330,15 @@ index a96f33c..a049ff4 100644 updatetitle(c); if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { -@@ -1041,6 +1392,7 @@ manage(Window w, XWindowAttributes *wa) +@@ -1051,6 +1418,7 @@ 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) -@@ -1066,7 +1418,10 @@ manage(Window w, XWindowAttributes *wa) + if (c->x + WIDTH(c) > c->mon->wx + c->mon->ww) +@@ -1074,7 +1442,10 @@ manage(Window w, XWindowAttributes *wa) c->isfloating = c->oldstate = trans != None || c->isfixed; if (c->isfloating) XRaiseWindow(dpy, c->win); @@ -1403,7 +1350,7 @@ index a96f33c..a049ff4 100644 attachstack(c); XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, (unsigned char *) &(c->win), 1); -@@ -1077,6 +1432,8 @@ manage(Window w, XWindowAttributes *wa) +@@ -1085,6 +1456,8 @@ manage(Window w, XWindowAttributes *wa) c->mon->sel = c; arrange(c->mon); XMapWindow(dpy, c->win); @@ -1412,7 +1359,7 @@ index a96f33c..a049ff4 100644 focus(NULL); } -@@ -1095,6 +1452,12 @@ maprequest(XEvent *e) +@@ -1103,6 +1476,12 @@ maprequest(XEvent *e) { static XWindowAttributes wa; XMapRequestEvent *ev = &e->xmaprequest; @@ -1423,9 +1370,9 @@ index a96f33c..a049ff4 100644 + updatesystray(); + } - if (!XGetWindowAttributes(dpy, ev->window, &wa)) + if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) return; -@@ -1203,13 +1566,14 @@ nexttiled(Client *c) +@@ -1209,13 +1588,14 @@ nexttiled(Client *c) return c; } @@ -1447,7 +1394,7 @@ index a96f33c..a049ff4 100644 } void -@@ -1219,8 +1583,21 @@ propertynotify(XEvent *e) +@@ -1225,8 +1605,21 @@ propertynotify(XEvent *e) Window trans; XPropertyEvent *ev = &e->xproperty; @@ -1471,7 +1418,7 @@ index a96f33c..a049ff4 100644 else if (ev->state == PropertyDelete) return; /* ignore */ else if ((c = wintoclient(ev->window))) { -@@ -1249,9 +1626,85 @@ propertynotify(XEvent *e) +@@ -1255,9 +1648,85 @@ propertynotify(XEvent *e) } } @@ -1557,7 +1504,7 @@ index a96f33c..a049ff4 100644 running = 0; } -@@ -1269,6 +1722,20 @@ recttomon(int x, int y, int w, int h) +@@ -1275,6 +1744,20 @@ recttomon(int x, int y, int w, int h) return r; } @@ -1578,7 +1525,7 @@ index a96f33c..a049ff4 100644 void resize(Client *c, int x, int y, int w, int h, int interact) { -@@ -1276,16 +1743,48 @@ resize(Client *c, int x, int y, int w, int h, int interact) +@@ -1282,16 +1765,48 @@ resize(Client *c, int x, int y, int w, int h, int interact) resizeclient(c, x, y, w, h); } @@ -1631,7 +1578,7 @@ index a96f33c..a049ff4 100644 XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); configure(c); XSync(dpy, False); -@@ -1348,6 +1847,19 @@ resizemouse(const Arg *arg) +@@ -1354,6 +1869,19 @@ resizemouse(const Arg *arg) } } @@ -1651,7 +1598,7 @@ index a96f33c..a049ff4 100644 void restack(Monitor *m) { -@@ -1384,10 +1896,18 @@ run(void) +@@ -1390,10 +1918,18 @@ run(void) handler[ev.type](&ev); /* call handler */ } @@ -1670,7 +1617,7 @@ index a96f33c..a049ff4 100644 Window d1, d2, *wins = NULL; XWindowAttributes wa; -@@ -1398,6 +1918,8 @@ scan(void) +@@ -1404,6 +1940,8 @@ scan(void) continue; if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState) manage(wins[i], &wa); @@ -1679,7 +1626,7 @@ index a96f33c..a049ff4 100644 } for (i = 0; i < num; i++) { /* now the transients */ if (!XGetWindowAttributes(dpy, wins[i], &wa)) -@@ -1409,6 +1931,7 @@ scan(void) +@@ -1415,6 +1953,7 @@ scan(void) if (wins) XFree(wins); } @@ -1687,7 +1634,7 @@ index a96f33c..a049ff4 100644 } void -@@ -1421,7 +1944,10 @@ sendmon(Client *c, Monitor *m) +@@ -1427,7 +1966,10 @@ sendmon(Client *c, Monitor *m) detachstack(c); c->mon = m; c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ @@ -1699,7 +1646,7 @@ index a96f33c..a049ff4 100644 attachstack(c); focus(NULL); arrange(NULL); -@@ -1437,26 +1963,36 @@ setclientstate(Client *c, long state) +@@ -1443,26 +1985,36 @@ setclientstate(Client *c, long state) } int @@ -1747,7 +1694,7 @@ index a96f33c..a049ff4 100644 } return exists; } -@@ -1470,7 +2006,7 @@ setfocus(Client *c) +@@ -1476,7 +2028,7 @@ setfocus(Client *c) XA_WINDOW, 32, PropModeReplace, (unsigned char *) &(c->win), 1); } @@ -1756,7 +1703,7 @@ index a96f33c..a049ff4 100644 } void -@@ -1508,13 +2044,30 @@ setlayout(const Arg *arg) +@@ -1514,13 +2066,30 @@ setlayout(const Arg *arg) selmon->sellt ^= 1; if (arg && arg->v) selmon->lt[selmon->sellt] = (Layout *)arg->v; @@ -1788,9 +1735,9 @@ index a96f33c..a049ff4 100644 /* arg > 1.0 will set mfact absolutely */ void setmfact(const Arg *arg) -@@ -1540,6 +2093,9 @@ setup(void) - /* clean up any zombies immediately */ - sigchld(0); +@@ -1553,6 +2122,9 @@ setup(void) + /* clean up any zombies (inherited from .xinitrc etc) immediately */ + while (waitpid(-1, NULL, WNOHANG) > 0); + signal(SIGHUP, sighup); + signal(SIGTERM, sigterm); @@ -1798,7 +1745,7 @@ index a96f33c..a049ff4 100644 /* init screen */ screen = DefaultScreen(dpy); sw = DisplayWidth(dpy, screen); -@@ -1559,6 +2115,10 @@ setup(void) +@@ -1572,6 +2144,10 @@ setup(void) wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); @@ -1809,7 +1756,7 @@ index a96f33c..a049ff4 100644 netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); -@@ -1566,6 +2126,9 @@ setup(void) +@@ -1579,6 +2155,9 @@ setup(void) netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); @@ -1819,7 +1766,7 @@ index a96f33c..a049ff4 100644 /* init cursors */ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); cursor[CurResize] = drw_cur_create(drw, XC_sizing); -@@ -1574,6 +2137,8 @@ setup(void) +@@ -1587,6 +2166,8 @@ setup(void) scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); for (i = 0; i < LENGTH(colors); i++) scheme[i] = drw_scm_create(drw, colors[i], 3); @@ -1828,7 +1775,7 @@ index a96f33c..a049ff4 100644 /* init bars */ updatebars(); updatestatus(); -@@ -1620,6 +2185,10 @@ showhide(Client *c) +@@ -1632,6 +2213,10 @@ showhide(Client *c) if (!c) return; if (ISVISIBLE(c)) { @@ -1839,8 +1786,8 @@ index a96f33c..a049ff4 100644 /* show clients top down */ XMoveWindow(dpy, c->win, c->x, c->y); if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) -@@ -1640,6 +2209,37 @@ sigchld(int unused) - while (0 < waitpid(-1, NULL, WNOHANG)); +@@ -1644,10 +2229,41 @@ showhide(Client *c) + } } +void @@ -1877,7 +1824,31 @@ index a96f33c..a049ff4 100644 void spawn(const Arg *arg) { -@@ -1678,9 +2278,15 @@ void +- struct sigaction sa; ++ struct sigaction sa; + + if (arg->v == dmenucmd) + dmenumon[0] = '0' + selmon->num; +@@ -1656,13 +2272,13 @@ spawn(const Arg *arg) + close(ConnectionNumber(dpy)); + setsid(); + +- sigemptyset(&sa.sa_mask); +- sa.sa_flags = 0; +- sa.sa_handler = SIG_DFL; +- sigaction(SIGCHLD, &sa, NULL); ++ sigemptyset(&sa.sa_mask); ++ sa.sa_flags = 0; ++ sa.sa_handler = SIG_DFL; ++ sigaction(SIGCHLD, &sa, NULL); + + execvp(((char **)arg->v)[0], (char **)arg->v); +- die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); ++ die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]); + } + } + +@@ -1688,9 +2304,15 @@ void tile(Monitor *m) { unsigned int i, n, h, mw, my, ty; @@ -1894,7 +1865,7 @@ index a96f33c..a049ff4 100644 if (n == 0) return; -@@ -1690,15 +2296,17 @@ tile(Monitor *m) +@@ -1700,15 +2322,17 @@ tile(Monitor *m) mw = m->ww; for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) if (i < m->nmaster) { @@ -1918,7 +1889,7 @@ index a96f33c..a049ff4 100644 } } -@@ -1707,7 +2315,18 @@ togglebar(const Arg *arg) +@@ -1717,7 +2341,18 @@ togglebar(const Arg *arg) { selmon->showbar = !selmon->showbar; updatebarpos(selmon); @@ -1938,7 +1909,7 @@ index a96f33c..a049ff4 100644 arrange(selmon); } -@@ -1725,6 +2344,39 @@ togglefloating(const Arg *arg) +@@ -1735,6 +2370,39 @@ togglefloating(const Arg *arg) arrange(selmon); } @@ -1978,7 +1949,7 @@ index a96f33c..a049ff4 100644 void toggletag(const Arg *arg) { -@@ -1771,6 +2423,20 @@ unmanage(Client *c, int destroyed) +@@ -1781,6 +2449,20 @@ unmanage(Client *c, int destroyed) Monitor *m = c->mon; XWindowChanges wc; @@ -1999,7 +1970,7 @@ index a96f33c..a049ff4 100644 detach(c); detachstack(c); if (!destroyed) { -@@ -1785,9 +2451,12 @@ unmanage(Client *c, int destroyed) +@@ -1796,9 +2478,12 @@ unmanage(Client *c, int destroyed) XUngrabServer(dpy); } free(c); @@ -2015,7 +1986,7 @@ index a96f33c..a049ff4 100644 } void -@@ -1802,11 +2471,18 @@ unmapnotify(XEvent *e) +@@ -1813,11 +2498,18 @@ unmapnotify(XEvent *e) else unmanage(c, 0); } @@ -2034,7 +2005,7 @@ index a96f33c..a049ff4 100644 Monitor *m; XSetWindowAttributes wa = { .override_redirect = True, -@@ -1817,10 +2493,15 @@ updatebars(void) +@@ -1828,10 +2520,15 @@ updatebars(void) for (m = mons; m; m = m->next) { if (m->barwin) continue; @@ -2051,19 +2022,83 @@ index a96f33c..a049ff4 100644 XMapRaised(dpy, m->barwin); XSetClassHint(dpy, m->barwin, &ch); } -@@ -1903,7 +2584,10 @@ updategeom(void) - m->clients = c->next; - detachstack(c); - c->mon = mons; -- attach(c); -+ if( attachbelow ) -+ attachBelow(c); -+ else -+ attach(c); - attachstack(c); - } - if (m == selmon) -@@ -1993,9 +2677,126 @@ updatesizehints(Client *c) +@@ -1885,42 +2582,41 @@ updategeom(void) + memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); + XFree(info); + nn = j; +- +- /* new monitors if nn > n */ +- for (i = n; i < nn; i++) { +- for (m = mons; m && m->next; m = m->next); +- if (m) +- m->next = createmon(); +- else +- mons = createmon(); +- } +- for (i = 0, m = mons; i < nn && m; m = m->next, i++) +- if (i >= n +- || unique[i].x_org != m->mx || unique[i].y_org != m->my +- || unique[i].width != m->mw || unique[i].height != m->mh) +- { +- dirty = 1; +- m->num = i; +- m->mx = m->wx = unique[i].x_org; +- m->my = m->wy = unique[i].y_org; +- m->mw = m->ww = unique[i].width; +- m->mh = m->wh = unique[i].height; +- updatebarpos(m); ++ /* new monitors if nn > n */ ++ for (i = n; i < nn; i++) { ++ for (m = mons; m && m->next; m = m->next); ++ if (m) ++ m->next = createmon(); ++ else ++ mons = createmon(); ++ } ++ for (i = 0, m = mons; i < nn && m; m = m->next, i++) ++ if (i >= n ++ || unique[i].x_org != m->mx || unique[i].y_org != m->my ++ || unique[i].width != m->mw || unique[i].height != m->mh) ++ { ++ dirty = 1; ++ m->num = i; ++ m->mx = m->wx = unique[i].x_org; ++ m->my = m->wy = unique[i].y_org; ++ m->mw = m->ww = unique[i].width; ++ m->mh = m->wh = unique[i].height; ++ updatebarpos(m); + } +- /* removed monitors if n > nn */ +- for (i = nn; i < n; i++) { +- for (m = mons; m && m->next; m = m->next); +- while ((c = m->clients)) { +- dirty = 1; +- m->clients = c->next; +- detachstack(c); +- c->mon = mons; +- attach(c); +- attachstack(c); ++ /* removed monitors if n > nn */ ++ for (i = nn; i < n; i++) { ++ for (m = mons; m && m->next; m = m->next); ++ while ((c = m->clients)) { ++ dirty = 1; ++ m->clients = c->next; ++ detachstack(c); ++ c->mon = mons; ++ attach(c); ++ attachstack(c); + } +- if (m == selmon) +- selmon = mons; +- cleanupmon(m); ++ if (m == selmon) ++ selmon = mons; ++ cleanupmon(m); + } + free(unique); + } else +@@ -2005,9 +2701,126 @@ updatesizehints(Client *c) void updatestatus(void) { @@ -2191,7 +2226,7 @@ index a96f33c..a049ff4 100644 } void -@@ -2028,8 +2829,11 @@ updatewmhints(Client *c) +@@ -2040,8 +2853,11 @@ updatewmhints(Client *c) if (c == selmon->sel && wmh->flags & XUrgencyHint) { wmh->flags &= ~XUrgencyHint; XSetWMHints(dpy, c->win, wmh); @@ -2204,7 +2239,7 @@ index a96f33c..a049ff4 100644 if (wmh->flags & InputHint) c->neverfocus = !wmh->input; else -@@ -2050,6 +2854,110 @@ view(const Arg *arg) +@@ -2062,6 +2878,110 @@ view(const Arg *arg) arrange(selmon); } @@ -2315,7 +2350,7 @@ index a96f33c..a049ff4 100644 Client * wintoclient(Window w) { -@@ -2063,6 +2971,16 @@ wintoclient(Window w) +@@ -2075,6 +2995,16 @@ wintoclient(Window w) return NULL; } @@ -2332,7 +2367,7 @@ index a96f33c..a049ff4 100644 Monitor * wintomon(Window w) { -@@ -2116,18 +3034,58 @@ xerrorstart(Display *dpy, XErrorEvent *ee) +@@ -2128,16 +3058,111 @@ xerrorstart(Display *dpy, XErrorEvent *ee) return -1; } @@ -2358,21 +2393,18 @@ index a96f33c..a049ff4 100644 Client *c = selmon->sel; + Client *at = NULL, *cold, *cprevious = NULL; - if (!selmon->lt[selmon->sellt]->arrange - || (selmon->sel && selmon->sel->isfloating)) +- if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) ++ if (!selmon->lt[selmon->sellt]->arrange || !c || c->isfloating) ++ return; ++ if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) return; -- if (c == nexttiled(selmon->clients)) -- if (!c || !(c = nexttiled(c->next))) -- return; -- pop(c); +- if (c == nexttiled(selmon->clients) && !(c = nexttiled(c->next))) + if (c == nexttiled(selmon->clients)) { + at = findbefore(prevzoom); + if (at) + cprevious = nexttiled(at->next); + if (!cprevious || cprevious != prevzoom) { + prevzoom = NULL; -+ if (!c || !(c = nexttiled(c->next))) -+ return; + } else + c = cprevious; + } @@ -2392,19 +2424,76 @@ index a96f33c..a049ff4 100644 + } + focus(c); + arrange(c->mon); ++} ++ ++void ++resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) ++{ ++ char *sdst = NULL; ++ int *idst = NULL; ++ float *fdst = NULL; ++ ++ sdst = dst; ++ idst = dst; ++ fdst = dst; ++ ++ char fullname[256]; ++ char *type; ++ XrmValue ret; ++ ++ snprintf(fullname, sizeof(fullname), "%s.%s", "dwm", name); ++ fullname[sizeof(fullname) - 1] = '\0'; ++ ++ XrmGetResource(db, fullname, "*", &type, &ret); ++ if (!(ret.addr == NULL || strncmp("String", type, 64))) ++ { ++ switch (rtype) { ++ case STRING: ++ strcpy(sdst, ret.addr); ++ break; ++ case INTEGER: ++ *idst = strtoul(ret.addr, NULL, 10); ++ break; ++ case FLOAT: ++ *fdst = strtof(ret.addr, NULL); ++ break; ++ } ++ } ++} ++ ++void ++load_xresources(void) ++{ ++ Display *display; ++ char *resm; ++ XrmDatabase db; ++ ResourcePref *p; ++ ++ display = XOpenDisplay(NULL); ++ resm = XResourceManagerString(display); ++ if (!resm) + return; +- pop(c); ++ ++ db = XrmGetStringDatabase(resm); ++ for (p = resources; p < resources + LENGTH(resources); p++) ++ resource_load(db, p->name, p->type, p->dst); ++ XCloseDisplay(display); } int -@@ -2141,6 +3099,8 @@ main(int argc, char *argv[]) +@@ -2151,14 +3176,20 @@ 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(); ++ XrmInitialize(); ++ load_xresources(); setup(); #ifdef __OpenBSD__ -@@ -2148,7 +3108,9 @@ main(int argc, char *argv[]) + if (pledge("stdio rpath proc exec", NULL) == -1) die("pledge"); #endif /* __OpenBSD__ */ scan(); @@ -2476,2755 +2565,6 @@ index 0000000..ac2d0e6 + exit 1 + ;; +esac -diff --git a/patches/dwm-6.2-urg-border.diff b/patches/dwm-6.2-urg-border.diff -new file mode 100644 -index 0000000..53f4d86 ---- /dev/null -+++ b/patches/dwm-6.2-urg-border.diff -@@ -0,0 +1,56 @@ -+From f20e5593e154e7e46c3f7100bd1378c7844b5ec8 Mon Sep 17 00:00:00 2001 -+From: Dirk Leichsenring <dlei@reddott.de> -+Date: Sun, 21 Jun 2020 14:00:40 +0200 -+Subject: [PATCH] Make the borders of urgent windows a different color - for dwm 6.2 -+ -+--- -+ config.def.h | 2 ++ -+ dwm.c | 7 +++++-- -+ 2 files changed, 7 insertions(+), 2 deletions(-) -+ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..1cb4492 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -12,10 +12,12 @@ static const char col_gray2[] = "#444444"; -+ static const char col_gray3[] = "#bbbbbb"; -+ static const char col_gray4[] = "#eeeeee"; -+ static const char col_cyan[] = "#005577"; -++static const char col_urgborder[] = "#ff0000"; -+ static const char *colors[][3] = { -+ /* fg bg border */ -+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, -+ [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -++ [SchemeUrg] = { col_gray4, col_cyan, col_urgborder }, -+ }; -+ -+ /* tagging */ -+diff --git a/dwm.c b/dwm.c -+index 4465af1..fda4013 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -59,7 +59,7 @@ -+ -+ /* enums */ -+ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -+-enum { SchemeNorm, SchemeSel }; /* color schemes */ -++enum { SchemeNorm, SchemeSel, SchemeUrg }; /* color schemes */ -+ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, -+ NetWMFullscreen, NetActiveWindow, NetWMWindowType, -+ NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -+@@ -2022,8 +2022,11 @@ updatewmhints(Client *c) -+ if (c == selmon->sel && wmh->flags & XUrgencyHint) { -+ wmh->flags &= ~XUrgencyHint; -+ XSetWMHints(dpy, c->win, wmh); -+- } else -++ } else { -+ c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0; -++ if (c->isurgent) -++ XSetWindowBorder(dpy, c->win, scheme[SchemeUrg][ColBorder].pixel); -++ } -+ if (wmh->flags & InputHint) -+ c->neverfocus = !wmh->input; -+ else -+-- -+2.27.0 -+ -diff --git a/patches/dwm-actualfullscreen-20191112-cb3f58a.diff b/patches/dwm-actualfullscreen-20191112-cb3f58a.diff -new file mode 100644 -index 0000000..21eea19 ---- /dev/null -+++ b/patches/dwm-actualfullscreen-20191112-cb3f58a.diff -@@ -0,0 +1,53 @@ -+From 3a16816a6f5d38014c2a06ce395873c545c8789a Mon Sep 17 00:00:00 2001 -+From: Soenke Lambert <s.lambert@mittwald.de> -+Date: Tue, 12 Nov 2019 10:44:02 +0100 -+Subject: [PATCH] Fullscreen current window with [Alt]+[Shift]+[f] -+ -+This actually fullscreens a window, instead of just hiding the statusbar -+and applying the monocle layout. -+--- -+ config.def.h | 1 + -+ dwm.c | 8 ++++++++ -+ 2 files changed, 9 insertions(+) -+ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..8cd3204 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -78,6 +78,7 @@ 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 } }, -+diff --git a/dwm.c b/dwm.c -+index 4465af1..c1b899a 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -211,6 +211,7 @@ static void tagmon(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); -+@@ -1719,6 +1720,13 @@ togglefloating(const Arg *arg) -+ arrange(selmon); -+ } -+ -++void -++togglefullscr(const Arg *arg) -++{ -++ if(selmon->sel) -++ setfullscreen(selmon->sel, !selmon->sel->isfullscreen); -++} -++ -+ void -+ toggletag(const Arg *arg) -+ { -+-- -+2.17.1 -+ -diff --git a/patches/dwm-attachbelow-toggleable-6.2.diff b/patches/dwm-attachbelow-toggleable-6.2.diff -new file mode 100644 -index 0000000..e5ff9fd ---- /dev/null -+++ b/patches/dwm-attachbelow-toggleable-6.2.diff -@@ -0,0 +1,199 @@ -+From ee036687ed9e1bb973b9e34694a57cf5dd67652d Mon Sep 17 00:00:00 2001 -+From: Jonathan Hodgson <git@jonathanh.co.uk> -+Date: Mon, 6 May 2019 18:34:40 +0100 -+Subject: [PATCH 1/4] Adds attach below option -+ -+--- -+ config.def.h | 1 + -+ dwm.c | 31 ++++++++++++++++++++++++++++--- -+ 2 files changed, 29 insertions(+), 3 deletions(-) -+ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..51ad933 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -35,6 +35,7 @@ static const Rule rules[] = { -+ 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 */ -++static const int attachbelow = 1; /* 1 means attach at the end */ -+ -+ static const Layout layouts[] = { -+ /* symbol arrange function */ -+diff --git a/dwm.c b/dwm.c -+index 4465af1..bd715a2 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac -+ static void arrange(Monitor *m); -+ static void arrangemon(Monitor *m); -+ static void attach(Client *c); -++static void attachBelow(Client *c); -+ static void attachstack(Client *c); -+ static void buttonpress(XEvent *e); -+ static void checkotherwm(void); -+@@ -405,6 +406,21 @@ attach(Client *c) -+ c->next = c->mon->clients; -+ c->mon->clients = c; -+ } -++void -++attachBelow(Client *c) -++{ -++ //If there is nothing on the monitor or the selected client is floating, attach as normal -++ if(c->mon->sel == NULL || c->mon->sel->isfloating) { -++ attach(c); -++ return; -++ } -++ -++ //Set the new client's next property to the same as the currently selected clients next -++ c->next = c->mon->sel->next; -++ //Set the currently selected clients next property to the new client -++ c->mon->sel->next = c; -++ -++} -+ -+ void -+ attachstack(Client *c) -+@@ -1062,7 +1078,10 @@ manage(Window w, XWindowAttributes *wa) -+ c->isfloating = c->oldstate = trans != None || c->isfixed; -+ if (c->isfloating) -+ XRaiseWindow(dpy, c->win); -+- attach(c); -++ if( attachbelow ) -++ attachBelow(c); -++ else -++ attach(c); -+ attachstack(c); -+ XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend, -+ (unsigned char *) &(c->win), 1); -+@@ -1417,7 +1436,10 @@ sendmon(Client *c, Monitor *m) -+ detachstack(c); -+ c->mon = m; -+ c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ -+- attach(c); -++ if( attachbelow ) -++ attachBelow(c); -++ else -++ attach(c); -+ attachstack(c); -+ focus(NULL); -+ arrange(NULL); -+@@ -1897,7 +1919,10 @@ updategeom(void) -+ m->clients = c->next; -+ detachstack(c); -+ c->mon = mons; -+- attach(c); -++ if( attachbelow ) -++ attachBelow(c); -++ else -++ attach(c); -+ attachstack(c); -+ } -+ if (m == selmon) -+-- -+2.21.0 -+ -+ -+From e212c1d8cbdcc56c33c717131dfa7c1689e27e9f Mon Sep 17 00:00:00 2001 -+From: Jonathan Hodgson <git@jonathanh.co.uk> -+Date: Mon, 6 May 2019 19:27:57 +0100 -+Subject: [PATCH 2/4] fixes comment -+ -+--- -+ config.def.h | 2 +- -+ 1 file changed, 1 insertion(+), 1 deletion(-) -+ -+diff --git a/config.def.h b/config.def.h -+index 51ad933..cb8053a 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -35,7 +35,7 @@ static const Rule rules[] = { -+ 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 */ -+-static const int attachbelow = 1; /* 1 means attach at the end */ -++static const int attachbelow = 1; /* 1 means attach after the currently active window */ -+ -+ static const Layout layouts[] = { -+ /* symbol arrange function */ -+-- -+2.21.0 -+ -+ -+From 7568ea3f8756e7e82b30c4943556ae646a445d1c Mon Sep 17 00:00:00 2001 -+From: Jonathan Hodgson <git@jonathanh.co.uk> -+Date: Mon, 6 May 2019 20:00:30 +0100 -+Subject: [PATCH 3/4] Makes changes to man page to reflect attach below patch -+ -+--- -+ dwm.1 | 3 +++ -+ 1 file changed, 3 insertions(+) -+ -+diff --git a/dwm.1 b/dwm.1 -+index 13b3729..fb6e76c 100644 -+--- a/dwm.1 -++++ b/dwm.1 -+@@ -29,6 +29,9 @@ color. The tags of the focused window are indicated with a filled square in the -+ top left corner. The tags which are applied to one or more windows are -+ indicated with an empty square in the top left corner. -+ .P -++The attach below patch makes newly spawned windows attach after the currently -++selected window -++.P -+ dwm draws a small border around windows to indicate the focus state. -+ .SH OPTIONS -+ .TP -+-- -+2.21.0 -+ -+ -+From 362b95a5b9f91673f27f3e3343b5738df3c9d6e9 Mon Sep 17 00:00:00 2001 -+From: Jonathan Hodgson <git@jonathanh.co.uk> -+Date: Sun, 2 Jun 2019 15:11:57 +0100 -+Subject: [PATCH 4/4] Allows attach below to be toggled -+ -+--- -+ config.def.h | 2 +- -+ dwm.c | 6 ++++++ -+ 2 files changed, 7 insertions(+), 1 deletion(-) -+ -+diff --git a/config.def.h b/config.def.h -+index cb8053a..b4d35aa 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -35,7 +35,7 @@ static const Rule rules[] = { -+ 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 */ -+-static const int attachbelow = 1; /* 1 means attach after the currently active window */ -++static int attachbelow = 1; /* 1 means attach after the currently active window */ -+ -+ static const Layout layouts[] = { -+ /* symbol arrange function */ -+diff --git a/dwm.c b/dwm.c -+index bd715a2..5d88653 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -148,6 +148,7 @@ static void arrange(Monitor *m); -+ static void arrangemon(Monitor *m); -+ static void attach(Client *c); -+ static void attachBelow(Client *c); -++static void toggleAttachBelow(); -+ static void attachstack(Client *c); -+ static void buttonpress(XEvent *e); -+ static void checkotherwm(void); -+@@ -422,6 +423,11 @@ attachBelow(Client *c) -+ -+ } -+ -++void toggleAttachBelow() -++{ -++ attachbelow = !attachbelow; -++} -++ -+ void -+ attachstack(Client *c) -+ { -+-- -+2.21.0 -+ -diff --git a/patches/dwm-autostart-20161205-bb3bd6f.diff b/patches/dwm-autostart-20161205-bb3bd6f.diff -new file mode 100644 -index 0000000..6f11eaf ---- /dev/null -+++ b/patches/dwm-autostart-20161205-bb3bd6f.diff -@@ -0,0 +1,39 @@ -+commit 5918623c5bd7fda155bf9dc3d33890c4ae1722d0 -+Author: Simon Bremer <simon.bremer@tum.de> -+Date: Thu Dec 22 17:31:07 2016 +0100 -+ -+ Applied and fixed autostart patch for previous version; -+ -+diff --git a/dwm.c b/dwm.c -+index d27cb67..066ed71 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -194,6 +194,7 @@ 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 run(void); -++static void runAutostart(void); -+ static void scan(void); -+ static int sendevent(Client *c, Atom proto); -+ static void sendmon(Client *c, Monitor *m); -+@@ -1386,6 +1387,12 @@ run(void) -+ } -+ -+ void -++runAutostart(void) { -++ system("cd ~/.dwm; ./autostart_blocking.sh"); -++ system("cd ~/.dwm; ./autostart.sh &"); -++} -++ -++void -+ scan(void) -+ { -+ unsigned int i, num; -+@@ -2145,6 +2152,7 @@ main(int argc, char *argv[]) -+ checkotherwm(); -+ setup(); -+ scan(); -++ runAutostart(); -+ run(); -+ cleanup(); -+ XCloseDisplay(dpy); -diff --git a/patches/dwm-cfacts-20200913-61bb8b2.diff b/patches/dwm-cfacts-20200913-61bb8b2.diff -new file mode 100644 -index 0000000..bb70e13 ---- /dev/null -+++ b/patches/dwm-cfacts-20200913-61bb8b2.diff -@@ -0,0 +1,117 @@ -+From c32a879432573d71dec7fcb4bf68927d2f4cdf10 Mon Sep 17 00:00:00 2001 -+From: iofq <cjriddz@protonmail.com> -+Date: Sat, 12 Sep 2020 22:28:09 -0500 -+Subject: [PATCH] Fixed 'cfacts' patch failure due to upstream commit -+ 'f09418bbb...' -+ -+--- -+ config.def.h | 3 +++ -+ dwm.c | 34 +++++++++++++++++++++++++++++++--- -+ 2 files changed, 34 insertions(+), 3 deletions(-) -+ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..83910c1 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -70,6 +70,9 @@ static Key keys[] = { -+ { MODKEY, XK_d, incnmaster, {.i = -1 } }, -+ { MODKEY, XK_h, setmfact, {.f = -0.05} }, -+ { MODKEY, XK_l, setmfact, {.f = +0.05} }, -++ { MODKEY|ShiftMask, XK_h, setcfact, {.f = +0.25} }, -++ { MODKEY|ShiftMask, XK_l, setcfact, {.f = -0.25} }, -++ { MODKEY|ShiftMask, XK_o, setcfact, {.f = 0.00} }, -+ { MODKEY, XK_Return, zoom, {0} }, -+ { MODKEY, XK_Tab, view, {0} }, -+ { MODKEY|ShiftMask, XK_c, killclient, {0} }, -+diff --git a/dwm.c b/dwm.c -+index 664c527..5233229 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -87,6 +87,7 @@ typedef struct Client Client; -+ struct Client { -+ char name[256]; -+ float mina, maxa; -++ float cfact; -+ int x, y, w, h; -+ int oldx, oldy, oldw, oldh; -+ int basew, baseh, incw, inch, maxw, maxh, minw, minh; -+@@ -201,6 +202,7 @@ static void setclientstate(Client *c, long state); -+ static void setfocus(Client *c); -+ static void setfullscreen(Client *c, int fullscreen); -+ static void setlayout(const Arg *arg); -++static void setcfact(const Arg *arg); -+ static void setmfact(const Arg *arg); -+ static void setup(void); -+ static void seturgent(Client *c, int urg); -+@@ -1030,6 +1032,7 @@ manage(Window w, XWindowAttributes *wa) -+ c->w = c->oldw = wa->width; -+ c->h = c->oldh = wa->height; -+ c->oldbw = wa->border_width; -++ c->cfact = 1.0; -+ -+ updatetitle(c); -+ if (XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { -+@@ -1512,6 +1515,23 @@ setlayout(const Arg *arg) -+ drawbar(selmon); -+ } -+ -++void setcfact(const Arg *arg) { -++ float f; -++ Client *c; -++ -++ c = selmon->sel; -++ -++ if(!arg || !c || !selmon->lt[selmon->sellt]->arrange) -++ return; -++ f = arg->f + c->cfact; -++ if(arg->f == 0.0) -++ f = 1.0; -++ else if(f < 0.25 || f > 4.0) -++ return; -++ c->cfact = f; -++ arrange(selmon); -++} -++ -+ /* arg > 1.0 will set mfact absolutely */ -+ void -+ setmfact(const Arg *arg) -+@@ -1675,9 +1695,15 @@ void -+ tile(Monitor *m) -+ { -+ unsigned int i, n, h, mw, my, ty; -++ float mfacts = 0, sfacts = 0; -+ Client *c; -+ -+- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); -++ for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) { -++ if (n < m->nmaster) -++ mfacts += c->cfact; -++ else -++ sfacts += c->cfact; -++ } -+ if (n == 0) -+ return; -+ -+@@ -1687,15 +1713,17 @@ tile(Monitor *m) -+ 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); -++ h = (m->wh - my) * (c->cfact / mfacts); -+ 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); -++ mfacts -= c->cfact; -+ } else { -+- h = (m->wh - ty) / (n - i); -++ h = (m->wh - ty) * (c->cfact / sfacts); -+ 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); -++ sfacts -= c->cfact; -+ } -+ } -+ -+-- -+2.28.0 -+ -diff --git a/patches/dwm-clientindicators-6.2.diff b/patches/dwm-clientindicators-6.2.diff -new file mode 100644 -index 0000000..f2e9afb ---- /dev/null -+++ b/patches/dwm-clientindicators-6.2.diff -@@ -0,0 +1,48 @@ -+From 8c72f9ea7c9cd8d254b52a4f7059113c41483597 Mon Sep 17 00:00:00 2001 -+From: Miles Alan <m@milesalan.com> -+Date: Mon, 17 Aug 2020 20:33:45 -0500 -+Subject: [PATCH] Draws a dot indicator overlayed on each tag icon for each -+ client. The selected client is drawn as a larger horizontal line. -+ -+--- -+ dwm.c | 14 ++++++++++---- -+ 1 file changed, 10 insertions(+), 4 deletions(-) -+ -+diff --git a/dwm.c b/dwm.c -+index 4465af1..e0ca438 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -695,6 +695,7 @@ dirtomon(int dir) -+ void -+ drawbar(Monitor *m) -+ { -++ int indn; -+ int x, w, sw = 0; -+ int boxs = drw->fonts->h / 9; -+ int boxw = drw->fonts->h / 6 + 2; -+@@ -715,13 +716,18 @@ drawbar(Monitor *m) -+ } -+ x = 0; -+ for (i = 0; i < LENGTH(tags); i++) { -++ indn = 0; -+ 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); -++ -++ for (c = m->clients; c; c = c->next) { -++ if (c->tags & (1 << i)) { -++ drw_rect(drw, x, 1 + (indn * 2), selmon->sel == c ? 6 : 1, 1, 1, urg & 1 << i); -++ indn++; -++ } -++ } -++ -+ x += w; -+ } -+ w = blw = TEXTW(m->ltsymbol); -+-- -+2.25.4 -+ -diff --git a/patches/dwm-dwmc-6.2.diff b/patches/dwm-dwmc-6.2.diff -new file mode 100644 -index 0000000..bf606d5 ---- /dev/null -+++ b/patches/dwm-dwmc-6.2.diff -@@ -0,0 +1,240 @@ -+From d94cb6f1a553d19127f44dbdc96e8bb5041956c2 Mon Sep 17 00:00:00 2001 -+From: Nihal Jere <noocsharp@gmail.com> -+Date: Sat, 21 Mar 2020 15:16:49 -0500 -+Subject: [PATCH] dwm-client -+ -+--- -+ Makefile | 2 +- -+ config.def.h | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ -+ dwm.c | 55 +++++++++++++++++++++++++++++++++++++++-- -+ dwmc | 40 ++++++++++++++++++++++++++++++ -+ 4 files changed, 164 insertions(+), 3 deletions(-) -+ create mode 100755 dwmc -+ -+diff --git a/Makefile b/Makefile -+index 77bcbc0..f837f5c 100644 -+--- a/Makefile -++++ b/Makefile -+@@ -38,7 +38,7 @@ dist: clean -+ -+ install: all -+ mkdir -p ${DESTDIR}${PREFIX}/bin -+- cp -f dwm ${DESTDIR}${PREFIX}/bin -++ cp -f dwm dwmc ${DESTDIR}${PREFIX}/bin -+ chmod 755 ${DESTDIR}${PREFIX}/bin/dwm -+ mkdir -p ${DESTDIR}${MANPREFIX}/man1 -+ sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..efbae79 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -113,3 +113,73 @@ static Button buttons[] = { -+ { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -+ }; -+ -++void -++setlayoutex(const Arg *arg) -++{ -++ setlayout(&((Arg) { .v = &layouts[arg->i] })); -++} -++ -++void -++viewex(const Arg *arg) -++{ -++ view(&((Arg) { .ui = 1 << arg->ui })); -++} -++ -++void -++viewall(const Arg *arg) -++{ -++ view(&((Arg){.ui = ~0})); -++} -++ -++void -++toggleviewex(const Arg *arg) -++{ -++ toggleview(&((Arg) { .ui = 1 << arg->ui })); -++} -++ -++void -++tagex(const Arg *arg) -++{ -++ tag(&((Arg) { .ui = 1 << arg->ui })); -++} -++ -++void -++toggletagex(const Arg *arg) -++{ -++ toggletag(&((Arg) { .ui = 1 << arg->ui })); -++} -++ -++void -++tagall(const Arg *arg) -++{ -++ tag(&((Arg){.ui = ~0})); -++} -++ -++/* signal definitions */ -++/* signum must be greater than 0 */ -++/* trigger signals using `xsetroot -name "fsignal:<signame> [<type> <value>]"` */ -++static Signal signals[] = { -++ /* signum function */ -++ { "focusstack", focusstack }, -++ { "setmfact", setmfact }, -++ { "togglebar", togglebar }, -++ { "incnmaster", incnmaster }, -++ { "togglefloating", togglefloating }, -++ { "focusmon", focusmon }, -++ { "tagmon", tagmon }, -++ { "zoom", zoom }, -++ { "view", view }, -++ { "viewall", viewall }, -++ { "viewex", viewex }, -++ { "toggleview", view }, -++ { "toggleviewex", toggleviewex }, -++ { "tag", tag }, -++ { "tagall", tagall }, -++ { "tagex", tagex }, -++ { "toggletag", tag }, -++ { "toggletagex", toggletagex }, -++ { "killclient", killclient }, -++ { "quit", quit }, -++ { "setlayout", setlayout }, -++ { "setlayoutex", setlayoutex }, -++}; -+diff --git a/dwm.c b/dwm.c -+index 4465af1..aa53706 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -106,6 +106,11 @@ typedef struct { -+ const Arg arg; -+ } Key; -+ -++typedef struct { -++ const char * sig; -++ void (*func)(const Arg *); -++} Signal; -++ -+ typedef struct { -+ const char *symbol; -+ void (*arrange)(Monitor *); -+@@ -148,6 +153,7 @@ static void arrange(Monitor *m); -+ static void arrangemon(Monitor *m); -+ static void attach(Client *c); -+ static void attachstack(Client *c); -++static int fake_signal(void); -+ static void buttonpress(XEvent *e); -+ static void checkotherwm(void); -+ static void cleanup(void); -+@@ -998,6 +1004,49 @@ keypress(XEvent *e) -+ keys[i].func(&(keys[i].arg)); -+ } -+ -++int -++fake_signal(void) -++{ -++ char fsignal[256]; -++ char indicator[9] = "fsignal:"; -++ char str_sig[50]; -++ char param[16]; -++ int i, len_str_sig, n, paramn; -++ size_t len_fsignal, len_indicator = strlen(indicator); -++ Arg arg; -++ -++ // Get root name property -++ if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) { -++ len_fsignal = strlen(fsignal); -++ -++ // Check if this is indeed a fake signal -++ if (len_indicator > len_fsignal ? 0 : strncmp(indicator, fsignal, len_indicator) == 0) { -++ paramn = sscanf(fsignal+len_indicator, "%s%n%s%n", str_sig, &len_str_sig, param, &n); -++ -++ if (paramn == 1) arg = (Arg) {0}; -++ else if (paramn > 2) return 1; -++ else if (strncmp(param, "i", n - len_str_sig) == 0) -++ sscanf(fsignal + len_indicator + n, "%i", &(arg.i)); -++ else if (strncmp(param, "ui", n - len_str_sig) == 0) -++ sscanf(fsignal + len_indicator + n, "%u", &(arg.ui)); -++ else if (strncmp(param, "f", n - len_str_sig) == 0) -++ sscanf(fsignal + len_indicator + n, "%f", &(arg.f)); -++ else return 1; -++ -++ // Check if a signal was found, and if so handle it -++ for (i = 0; i < LENGTH(signals); i++) -++ if (strncmp(str_sig, signals[i].sig, len_str_sig) == 0 && signals[i].func) -++ signals[i].func(&(arg)); -++ -++ // A fake signal was sent -++ return 1; -++ } -++ } -++ -++ // No fake signal was sent, so proceed with update -++ return 0; -++} -++ -+ void -+ killclient(const Arg *arg) -+ { -+@@ -1215,8 +1264,10 @@ propertynotify(XEvent *e) -+ Window trans; -+ XPropertyEvent *ev = &e->xproperty; -+ -+- if ((ev->window == root) && (ev->atom == XA_WM_NAME)) -+- updatestatus(); -++ if ((ev->window == root) && (ev->atom == XA_WM_NAME)) { -++ if (!fake_signal()) -++ updatestatus(); -++ } -+ else if (ev->state == PropertyDelete) -+ return; /* ignore */ -+ else if ((c = wintoclient(ev->window))) { -+diff --git a/dwmc b/dwmc -+new file mode 100755 -+index 0000000..5ff8dbc -+--- /dev/null -++++ b/dwmc -+@@ -0,0 +1,40 @@ -++#!/usr/bin/env sh -++ -++signal() { -++ xsetroot -name "fsignal:$*" -++} -++ -++case $# in -++1) -++ case $1 in -++ setlayout | view | viewall | togglebar | togglefloating | zoom | killclient | quit) -++ signal $1 -++ ;; -++ *) -++ echo "Unknown command or missing one argument." -++ exit 1 -++ ;; -++ esac -++ ;; -++2) -++ case $1 in -++ view) -++ signal $1 ui $2 -++ ;; -++ viewex | toggleviewex | tagex | toggletagex | setlayoutex | focusstack | incnmaster | focusmon | tagmon) -++ signal $1 i $2 -++ ;; -++ setmfact) -++ signal $1 f $2 -++ ;; -++ *) -++ echo "Unknown command or one too many arguments." -++ exit 1 -++ ;; -++ esac -++ ;; -++*) -++ echo "Too many arguments." -++ exit 1 -++ ;; -++esac -+-- -+2.25.1 -+ -diff --git a/patches/dwm-push_no_master-6.2.diff b/patches/dwm-push_no_master-6.2.diff -new file mode 100644 -index 0000000..873e438 ---- /dev/null -+++ b/patches/dwm-push_no_master-6.2.diff -@@ -0,0 +1,70 @@ -+diff --git a/dwm.c b/dwm.c -+index 4465af1..49e63f0 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -185,7 +185,10 @@ static void motionnotify(XEvent *e); -+ static void movemouse(const Arg *arg); -+ static Client *nexttiled(Client *c); -+ static void pop(Client *); -++static Client *prevtiled(Client *c); -+ static void propertynotify(XEvent *e); -++static void pushdown(const Arg *arg); -++static void pushup(const Arg *arg); -+ static void quit(const Arg *arg); -+ static Monitor *recttomon(int x, int y, int w, int h); -+ static void resize(Client *c, int x, int y, int w, int h, int interact); -+@@ -1208,6 +1211,16 @@ pop(Client *c) -+ arrange(c->mon); -+ } -+ -++Client * -++prevtiled(Client *c) { -++ Client *p, *r; -++ -++ for(p = selmon->clients, r = NULL; p && p != c; p = p->next) -++ if(!p->isfloating && ISVISIBLE(p)) -++ r = p; -++ return r; -++} -++ -+ void -+ propertynotify(XEvent *e) -+ { -+@@ -1245,6 +1258,37 @@ propertynotify(XEvent *e) -+ } -+ } -+ -++void -++pushdown(const Arg *arg) { -++ Client *sel = selmon->sel, *c; -++ -++ if(!sel || sel->isfloating || sel == nexttiled(selmon->clients)) -++ return; -++ if((c = nexttiled(sel->next))) { -++ detach(sel); -++ sel->next = c->next; -++ c->next = sel; -++ } -++ focus(sel); -++ arrange(selmon); -++} -++ -++void -++pushup(const Arg *arg) { -++ Client *sel = selmon->sel, *c; -++ -++ if(!sel || sel->isfloating) -++ return; -++ if((c = prevtiled(sel)) && c != nexttiled(selmon->clients)) { -++ detach(sel); -++ sel->next = c; -++ for(c = selmon->clients; c->next != sel->next; c = c->next); -++ c->next = sel; -++ } -++ focus(sel); -++ arrange(selmon); -++} -++ -+ void -+ quit(const Arg *arg) -+ { -diff --git a/patches/dwm-restartsig-20180523-6.2.diff b/patches/dwm-restartsig-20180523-6.2.diff -new file mode 100644 -index 0000000..f1f8680 ---- /dev/null -+++ b/patches/dwm-restartsig-20180523-6.2.diff -@@ -0,0 +1,139 @@ -+From 2991f37f0aaf44b9f9b11e7893ff0af8eb88f649 Mon Sep 17 00:00:00 2001 -+From: Christopher Drelich <cd@cdrakka.com> -+Date: Wed, 23 May 2018 22:50:38 -0400 -+Subject: [PATCH] Modifies quit to handle restarts and adds SIGHUP and SIGTERM -+ handlers. -+ -+Modified quit() to restart if it receives arg .i = 1 -+MOD+CTRL+SHIFT+Q was added to confid.def.h to do just that. -+ -+Signal handlers were handled for SIGHUP and SIGTERM. -+If dwm receives these signals it calls quit() with -+arg .i = to 1 or 0, respectively. -+ -+To restart dwm: -+MOD+CTRL+SHIFT+Q -+or -+kill -HUP dwmpid -+ -+To quit dwm cleanly: -+MOD+SHIFT+Q -+or -+kill -TERM dwmpid -+--- -+ config.def.h | 1 + -+ dwm.1 | 10 ++++++++++ -+ dwm.c | 22 ++++++++++++++++++++++ -+ 3 files changed, 33 insertions(+) -+ -+diff --git a/config.def.h b/config.def.h -+index a9ac303..e559429 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -94,6 +94,7 @@ static Key keys[] = { -+ TAGKEYS( XK_8, 7) -+ TAGKEYS( XK_9, 8) -+ { MODKEY|ShiftMask, XK_q, quit, {0} }, -++ { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} }, -+ }; -+ -+ /* button definitions */ -+diff --git a/dwm.1 b/dwm.1 -+index 13b3729..36a331c 100644 -+--- a/dwm.1 -++++ b/dwm.1 -+@@ -142,6 +142,9 @@ 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 -+@@ -155,6 +158,13 @@ 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 bb95e26..286eecd 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -205,6 +205,8 @@ 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); -+@@ -260,6 +262,7 @@ 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; -+@@ -1248,6 +1251,7 @@ propertynotify(XEvent *e) -+ void -+ quit(const Arg *arg) -+ { -++ if(arg->i) restart = 1; -+ running = 0; -+ } -+ -+@@ -1536,6 +1540,9 @@ setup(void) -+ /* clean up any zombies immediately */ -+ sigchld(0); -+ -++ signal(SIGHUP, sighup); -++ signal(SIGTERM, sigterm); -++ -+ /* init screen */ -+ screen = DefaultScreen(dpy); -+ sw = DisplayWidth(dpy, screen); -+@@ -1637,6 +1644,20 @@ 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) -+@@ -2139,6 +2160,7 @@ main(int argc, char *argv[]) -+ setup(); -+ scan(); -+ run(); -++ if(restart) execvp(argv[0], argv); -+ cleanup(); -+ XCloseDisplay(dpy); -+ return EXIT_SUCCESS; -+-- -+2.7.4 -+ -diff --git a/patches/dwm-scratchpads-20200414-728d397b.diff b/patches/dwm-scratchpads-20200414-728d397b.diff -new file mode 100644 -index 0000000..d3e90c0 ---- /dev/null -+++ b/patches/dwm-scratchpads-20200414-728d397b.diff -@@ -0,0 +1,199 @@ -+From 728d397b21982af88737277fd9d6939a7b558786 Mon Sep 17 00:00:00 2001 -+From: Christian Tenllado <ctenllado@gmail.com> -+Date: Tue, 14 Apr 2020 23:31:15 +0200 -+Subject: [PATCH] Multiple scratchpads -+ -+This patch enables multiple scratchpads, each with one asigned window. -+This enables the same scratchpad workflow that you have in i3. -+ -+Scratchpads are implemented as special tags, whose mask does not -+apply to new spawned windows. To assign a window to a scratchpad you -+have to set up a rule, as you do with regular tags. -+ -+Windows tagged with scratchpad tags can be set floating or not in the -+rules array. Most users would probably want them floating (i3 style), -+but having them tiled does also perfectly work and might fit better the -+DWM approach. In case they are set floating, the patch moves them to the -+center of the screen whenever they are shown. The patch can easily be -+modified to make this last feature configurable in the rules array (see -+the center patch). -+ -+The togglescratch function, borrowed from the previous scratchpad patch -+and slightly modified, can be used to spawn a registered scratchpad -+process or toggle its view. This function looks for a window tagged with -+the selected scratchpad tag. If it is found its view is toggled. If it is -+not found the corresponding registered command is spawned. The -+config.def.h shows three examples of its use to spawn a terminal in the -+first scratchpad tag, a second terminal running ranger on the second -+scratchpad tag and the keepassxc application to manage passwords on a -+third scratchpad tag. -+ -+If you prefer to spawn your scratchpad applications from the startup -+script, you might opt for binding keys to toggleview instead, as -+scratchpads are just special tags (you may even extend the TAGKEYS macro -+to generalize the key bindings). -+--- -+ config.def.h | 28 ++++++++++++++++++++++++---- -+ dwm.c | 43 +++++++++++++++++++++++++++++++++++++++++-- -+ 2 files changed, 65 insertions(+), 6 deletions(-) -+ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..06265e1 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -18,17 +18,33 @@ static const char *colors[][3] = { -+ [SchemeSel] = { col_gray4, col_cyan, col_cyan }, -+ }; -+ -++typedef struct { -++ const char *name; -++ const void *cmd; -++} Sp; -++const char *spcmd1[] = {"st", "-n", "spterm", "-g", "120x34", NULL }; -++const char *spcmd2[] = {"st", "-n", "spfm", "-g", "144x41", "-e", "ranger", NULL }; -++const char *spcmd3[] = {"keepassxc", NULL }; -++static Sp scratchpads[] = { -++ /* name cmd */ -++ {"spterm", spcmd1}, -++ {"spranger", spcmd2}, -++ {"keepassxc", spcmd3}, -++}; -++ -+ /* 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 monitor */ -+- { "Gimp", NULL, NULL, 0, 1, -1 }, -+- { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -++ { "Gimp", NULL, NULL, 0, 1, -1 }, -++ { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -++ { NULL, "spterm", NULL, SPTAG(0), 1, -1 }, -++ { NULL, "spfm", NULL, SPTAG(1), 1, -1 }, -++ { NULL, "keepassxc", NULL, SPTAG(2), 0, -1 }, -+ }; -+ -+ /* layout(s) */ -+@@ -59,6 +75,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() -+ static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; -+ static const char *termcmd[] = { "st", NULL }; -+ -++ -+ static Key keys[] = { -+ /* modifier key function argument */ -+ { MODKEY, XK_p, spawn, {.v = dmenucmd } }, -+@@ -84,6 +101,9 @@ static Key keys[] = { -+ { MODKEY, XK_period, focusmon, {.i = +1 } }, -+ { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, -+ { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, -++ { MODKEY, XK_y, togglescratch, {.ui = 0 } }, -++ { MODKEY, XK_u, togglescratch, {.ui = 1 } }, -++ { MODKEY, XK_x, togglescratch, {.ui = 2 } }, -+ TAGKEYS( XK_1, 0) -+ TAGKEYS( XK_2, 1) -+ TAGKEYS( XK_3, 2) -+@@ -106,7 +126,7 @@ static Button buttons[] = { -+ { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, -+ { ClkClientWin, MODKEY, Button1, movemouse, {0} }, -+ { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, -+- { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, -++ { ClkClientWin, MODKEY, Button1, resizemouse, {0} }, -+ { ClkTagBar, 0, Button1, view, {0} }, -+ { ClkTagBar, 0, Button3, toggleview, {0} }, -+ { ClkTagBar, MODKEY, Button1, tag, {0} }, -+diff --git a/dwm.c b/dwm.c -+index 4465af1..646aa1a 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -54,7 +54,10 @@ -+ #define MOUSEMASK (BUTTONMASK|PointerMotionMask) -+ #define WIDTH(X) ((X)->w + 2 * (X)->bw) -+ #define HEIGHT(X) ((X)->h + 2 * (X)->bw) -+-#define TAGMASK ((1 << LENGTH(tags)) - 1) -++#define NUMTAGS (LENGTH(tags) + LENGTH(scratchpads)) -++#define TAGMASK ((1 << NUMTAGS) - 1) -++#define SPTAG(i) ((1 << LENGTH(tags)) << (i)) -++#define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << LENGTH(tags)) -+ #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) -+ -+ /* enums */ -+@@ -211,6 +214,7 @@ static void tagmon(const Arg *arg); -+ static void tile(Monitor *); -+ static void togglebar(const Arg *arg); -+ static void togglefloating(const Arg *arg); -++static void togglescratch(const Arg *arg); -+ static void toggletag(const Arg *arg); -+ static void toggleview(const Arg *arg); -+ static void unfocus(Client *c, int setfocus); -+@@ -299,6 +303,11 @@ applyrules(Client *c) -+ { -+ c->isfloating = r->isfloating; -+ c->tags |= r->tags; -++ if ((r->tags & SPTAGMASK) && r->isfloating) { -++ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); -++ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); -++ } -++ -+ for (m = mons; m && m->num != r->monitor; m = m->next); -+ if (m) -+ c->mon = m; -+@@ -308,7 +317,7 @@ applyrules(Client *c) -+ XFree(ch.res_class); -+ if (ch.res_name) -+ XFree(ch.res_name); -+- c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; -++ c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : (c->mon->tagset[c->mon->seltags] & ~SPTAGMASK); -+ } -+ -+ int -+@@ -1616,6 +1625,10 @@ showhide(Client *c) -+ if (!c) -+ return; -+ if (ISVISIBLE(c)) { -++ if ((c->tags & SPTAGMASK) && c->isfloating) { -++ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2); -++ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2); -++ } -+ /* show clients top down */ -+ XMoveWindow(dpy, c->win, c->x, c->y); -+ if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) -+@@ -1719,6 +1732,32 @@ togglefloating(const Arg *arg) -+ arrange(selmon); -+ } -+ -++void -++togglescratch(const Arg *arg) -++{ -++ Client *c; -++ unsigned int found = 0; -++ unsigned int scratchtag = SPTAG(arg->ui); -++ Arg sparg = {.v = scratchpads[arg->ui].cmd}; -++ -++ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next); -++ if (found) { -++ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag; -++ if (newtagset) { -++ selmon->tagset[selmon->seltags] = newtagset; -++ focus(NULL); -++ arrange(selmon); -++ } -++ if (ISVISIBLE(c)) { -++ focus(c); -++ restack(selmon); -++ } -++ } else { -++ selmon->tagset[selmon->seltags] |= scratchtag; -++ spawn(&sparg); -++ } -++} -++ -+ void -+ toggletag(const Arg *arg) -+ { -+-- -+2.20.1 -+ -diff --git a/patches/dwm-statuscmd-signal-6.2.diff b/patches/dwm-statuscmd-signal-6.2.diff -new file mode 100644 -index 0000000..97fda1b ---- /dev/null -+++ b/patches/dwm-statuscmd-signal-6.2.diff -@@ -0,0 +1,157 @@ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..b67825e 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -103,7 +103,9 @@ static Button buttons[] = { -+ { ClkLtSymbol, 0, Button1, setlayout, {0} }, -+ { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, -+ { ClkWinTitle, 0, Button2, zoom, {0} }, -+- { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, -++ { ClkStatusText, 0, Button1, sigdwmblocks, {.i = 1} }, -++ { ClkStatusText, 0, Button2, sigdwmblocks, {.i = 2} }, -++ { ClkStatusText, 0, Button3, sigdwmblocks, {.i = 3} }, -+ { ClkClientWin, MODKEY, Button1, movemouse, {0} }, -+ { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, -+ { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, -+diff --git a/dwm.c b/dwm.c -+index 4465af1..c600131 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -156,6 +156,7 @@ static void clientmessage(XEvent *e); -+ static void configure(Client *c); -+ static void configurenotify(XEvent *e); -+ static void configurerequest(XEvent *e); -++static void copyvalidchars(char *text, char *rawtext); -+ static Monitor *createmon(void); -+ static void destroynotify(XEvent *e); -+ static void detach(Client *c); -+@@ -169,6 +170,7 @@ static void focus(Client *c); -+ static void focusin(XEvent *e); -+ static void focusmon(const Arg *arg); -+ static void focusstack(const Arg *arg); -++static int getdwmblockspid(); -+ static int getrootptr(int *x, int *y); -+ static long getstate(Window w); -+ static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -+@@ -205,6 +207,7 @@ static void setup(void); -+ static void seturgent(Client *c, int urg); -+ static void showhide(Client *c); -+ static void sigchld(int unused); -++static void sigdwmblocks(const Arg *arg); -+ static void spawn(const Arg *arg); -+ static void tag(const Arg *arg); -+ static void tagmon(const Arg *arg); -+@@ -237,6 +240,9 @@ static void zoom(const Arg *arg); -+ /* variables */ -+ static const char broken[] = "broken"; -+ static char stext[256]; -++static char rawstext[256]; -++static int dwmblockssig; -++pid_t dwmblockspid = 0; -+ static int screen; -+ static int sw, sh; /* X display screen geometry width, height */ -+ static int bh, blw = 0; /* bar geometry */ -+@@ -439,9 +445,26 @@ buttonpress(XEvent *e) -+ arg.ui = 1 << i; -+ } else if (ev->x < x + blw) -+ click = ClkLtSymbol; -+- else if (ev->x > selmon->ww - TEXTW(stext)) -++ else if (ev->x > (x = selmon->ww - TEXTW(stext) + lrpad)) { -+ click = ClkStatusText; -+- else -++ -++ char *text = rawstext; -++ int i = -1; -++ char ch; -++ dwmblockssig = 0; -++ while (text[++i]) { -++ if ((unsigned char)text[i] < ' ') { -++ ch = text[i]; -++ text[i] = '\0'; -++ x += TEXTW(text) - lrpad; -++ text[i] = ch; -++ text += i+1; -++ i = -1; -++ if (x >= ev->x) break; -++ dwmblockssig = ch; -++ } -++ } -++ } else -+ click = ClkWinTitle; -+ } else if ((c = wintoclient(ev->window))) { -+ focus(c); -+@@ -627,6 +650,19 @@ configurerequest(XEvent *e) -+ XSync(dpy, False); -+ } -+ -++void -++copyvalidchars(char *text, char *rawtext) -++{ -++ int i = -1, j = 0; -++ -++ while(rawtext[++i]) { -++ if ((unsigned char)rawtext[i] >= ' ') { -++ text[j++] = rawtext[i]; -++ } -++ } -++ text[j] = '\0'; -++} -++ -+ Monitor * -+ createmon(void) -+ { -+@@ -871,6 +907,18 @@ getatomprop(Client *c, Atom prop) -+ return atom; -+ } -+ -++int -++getdwmblockspid() -++{ -++ char buf[16]; -++ FILE *fp = popen("pidof -s dwmblocks", "r"); -++ fgets(buf, sizeof(buf), fp); -++ pid_t pid = strtoul(buf, NULL, 10); -++ pclose(fp); -++ dwmblockspid = pid; -++ return pid != 0 ? 0 : -1; -++} -++ -+ int -+ getrootptr(int *x, int *y) -+ { -+@@ -1636,6 +1684,23 @@ sigchld(int unused) -+ while (0 < waitpid(-1, NULL, WNOHANG)); -+ } -+ -++void -++sigdwmblocks(const Arg *arg) -++{ -++ union sigval sv; -++ sv.sival_int = (dwmblockssig << 8) | arg->i; -++ if (!dwmblockspid) -++ if (getdwmblockspid() == -1) -++ return; -++ -++ if (sigqueue(dwmblockspid, SIGUSR1, sv) == -1) { -++ if (errno == ESRCH) { -++ if (!getdwmblockspid()) -++ sigqueue(dwmblockspid, SIGUSR1, sv); -++ } -++ } -++} -++ -+ void -+ spawn(const Arg *arg) -+ { -+@@ -1987,8 +2052,10 @@ updatesizehints(Client *c) -+ void -+ updatestatus(void) -+ { -+- if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) -++ if (!gettextprop(root, XA_WM_NAME, rawstext, sizeof(rawstext))) -+ strcpy(stext, "dwm-"VERSION); -++ else -++ copyvalidchars(stext, rawstext); -+ drawbar(selmon); -+ } -+ -diff --git a/patches/dwm-swallow-20200522-7accbcf.diff b/patches/dwm-swallow-20200522-7accbcf.diff -new file mode 100644 -index 0000000..1cb144f ---- /dev/null -+++ b/patches/dwm-swallow-20200522-7accbcf.diff -@@ -0,0 +1,420 @@ -+From 7accbcf7db35995d4c26c5cd69338aafa6feb89a Mon Sep 17 00:00:00 2001 -+From: wtl <wtl144000@gmail.com> -+Date: Fri, 22 May 2020 22:38:38 +0300 -+Subject: [PATCH] swallow X windows from the terminal -+ -+--- -+ config.def.h | 9 ++- -+ config.mk | 2 +- -+ dwm.c | 218 +++++++++++++++++++++++++++++++++++++++++++++++++-- -+ 3 files changed, 220 insertions(+), 9 deletions(-) -+ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..4c0b25c 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -3,6 +3,7 @@ -+ /* 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 int showbar = 1; /* 0 means no bar */ -+ static const int topbar = 1; /* 0 means bottom bar */ -+ static const char *fonts[] = { "monospace:size=10" }; -+@@ -26,9 +27,11 @@ static const Rule rules[] = { -+ * WM_CLASS(STRING) = instance, class -+ * WM_NAME(STRING) = title -+ */ -+- /* class instance title tags mask isfloating monitor */ -+- { "Gimp", NULL, NULL, 0, 1, -1 }, -+- { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, -++ /* 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 */ -+ }; -+ -+ /* layout(s) */ -+diff --git a/config.mk b/config.mk -+index 7084c33..b77641d 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} -++LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res -+ -+ # flags -+ CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} -+diff --git a/dwm.c b/dwm.c -+index 9fd0286..1befee4 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -40,6 +40,8 @@ -+ #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" -+@@ -92,9 +94,11 @@ struct Client { -+ int basew, baseh, incw, inch, maxw, maxh, minw, minh; -+ int bw, oldbw; -+ unsigned int tags; -+- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; -++ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow; -++ pid_t pid; -+ Client *next; -+ Client *snext; -++ Client *swallowing; -+ Monitor *mon; -+ Window win; -+ }; -+@@ -138,6 +142,8 @@ typedef struct { -+ const char *title; -+ unsigned int tags; -+ int isfloating; -++ int isterminal; -++ int noswallow; -+ int monitor; -+ } Rule; -+ -+@@ -235,9 +241,16 @@ 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 */ -+@@ -269,6 +282,8 @@ 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" -+ -+@@ -286,6 +301,7 @@ applyrules(Client *c) -+ XClassHint ch = { NULL, NULL }; -+ -+ /* rule matching */ -++ c->noswallow = -1; -+ c->isfloating = 0; -+ c->tags = 0; -+ XGetClassHint(dpy, c->win, &ch); -+@@ -298,6 +314,8 @@ 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); -+@@ -414,6 +432,61 @@ attachstack(Client *c) -+ c->mon->stack = 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) -+ { -+@@ -653,6 +726,9 @@ destroynotify(XEvent *e) -+ -+ if ((c = wintoclient(ev->window))) -+ unmanage(c, 1); -++ -++ else if ((c = swallowingclient(ev->window))) -++ unmanage(c->swallowing, 1); -+ } -+ -+ void -+@@ -1018,12 +1094,13 @@ killclient(const Arg *arg) -+ void -+ manage(Window w, XWindowAttributes *wa) -+ { -+- Client *c, *t = NULL; -++ Client *c, *t = NULL, *term = 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; -+@@ -1038,6 +1115,7 @@ 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) -+@@ -1074,6 +1152,8 @@ manage(Window w, XWindowAttributes *wa) -+ c->mon->sel = c; -+ arrange(c->mon); -+ XMapWindow(dpy, c->win); -++ if (term) -++ swallow(term, c); -+ focus(NULL); -+ } -+ -+@@ -1384,7 +1464,9 @@ run(void) -+ void -+ scan(void) -+ { -++ scanner = 1; -+ unsigned int i, num; -++ char swin[256]; -+ Window d1, d2, *wins = NULL; -+ XWindowAttributes wa; -+ -+@@ -1395,6 +1477,8 @@ 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)) -+@@ -1406,6 +1490,7 @@ scan(void) -+ if (wins) -+ XFree(wins); -+ } -++ scanner = 0; -+ } -+ -+ void -+@@ -1768,6 +1853,20 @@ 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) { -+@@ -1782,9 +1881,12 @@ unmanage(Client *c, int destroyed) -+ XUngrabServer(dpy); -+ } -+ free(c); -+- focus(NULL); -+- updateclientlist(); -+- arrange(m); -++ -++ if (!s) { -++ arrange(m); -++ focus(NULL); -++ updateclientlist(); -++ } -+ } -+ -+ void -+@@ -2047,6 +2149,110 @@ view(const Arg *arg) -+ 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) -+ { -+@@ -2138,6 +2344,8 @@ 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__ -+-- -+2.26.2 -+ -diff --git a/patches/dwm-systray-6.2.diff b/patches/dwm-systray-6.2.diff -new file mode 100644 -index 0000000..27187ac ---- /dev/null -+++ b/patches/dwm-systray-6.2.diff -@@ -0,0 +1,746 @@ -+From 4001ccae7b1a41bdcb247b0cf095a51af7b68c28 Mon Sep 17 00:00:00 2001 -+From: Igor Gevka <igor.gevka@gmail.com> -+Date: Sun, 16 Feb 2020 15:03:10 -0800 -+Subject: [PATCH] [PATCH] Implements a system tray for dwm. -+ -+Original author: Jan Christoph Ebersbach <jceb@e-jc.de>, inspired by http://code.google.com/p/dwm-plus -+URL: http://dwm.suckless.org/patches/systray -+dwm 6.2 port by Igor Gevka <igor.gevka@gmail.com> -+--- -+ config.def.h | 4 + -+ dwm.c | 404 +++++++++++++++++++++++++++++++++++++++++++++++---- -+ 2 files changed, 382 insertions(+), 26 deletions(-) -+ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..2d824d1 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -3,6 +3,10 @@ -+ /* appearance */ -+ static const unsigned int borderpx = 1; /* border pixel of windows */ -+ static const unsigned int snap = 32; /* snap pixel */ -++static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ -++static const unsigned int systrayspacing = 2; /* systray spacing */ -++static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ -++static const int showsystray = 1; /* 0 means no systray */ -+ static const int showbar = 1; /* 0 means no bar */ -+ static const int topbar = 1; /* 0 means bottom bar */ -+ static const char *fonts[] = { "monospace:size=10" }; -+diff --git a/dwm.c b/dwm.c -+index 4465af1..3e361fa 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -57,12 +57,30 @@ -+ #define TAGMASK ((1 << LENGTH(tags)) - 1) -+ #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) -+ -++#define SYSTEM_TRAY_REQUEST_DOCK 0 -++ -++/* XEMBED messages */ -++#define XEMBED_EMBEDDED_NOTIFY 0 -++#define XEMBED_WINDOW_ACTIVATE 1 -++#define XEMBED_FOCUS_IN 4 -++#define XEMBED_MODALITY_ON 10 -++ -++#define XEMBED_MAPPED (1 << 0) -++#define XEMBED_WINDOW_ACTIVATE 1 -++#define XEMBED_WINDOW_DEACTIVATE 2 -++ -++#define VERSION_MAJOR 0 -++#define VERSION_MINOR 0 -++#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR -++ -+ /* enums */ -+ enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ -+ enum { SchemeNorm, SchemeSel }; /* color schemes */ -+ enum { NetSupported, NetWMName, NetWMState, NetWMCheck, -++ NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, -+ NetWMFullscreen, NetActiveWindow, NetWMWindowType, -+ NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ -++enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ -+ enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ -+ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, -+ ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ -+@@ -141,6 +159,12 @@ typedef struct { -+ int monitor; -+ } Rule; -+ -++typedef struct Systray Systray; -++struct Systray { -++ Window win; -++ Client *icons; -++}; -++ -+ /* function declarations */ -+ static void applyrules(Client *c); -+ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); -+@@ -169,8 +193,10 @@ static void focus(Client *c); -+ static void focusin(XEvent *e); -+ static void focusmon(const Arg *arg); -+ static void focusstack(const Arg *arg); -++static Atom getatomprop(Client *c, Atom prop); -+ static int getrootptr(int *x, int *y); -+ static long getstate(Window w); -++static unsigned int getsystraywidth(); -+ static int gettextprop(Window w, Atom atom, char *text, unsigned int size); -+ static void grabbuttons(Client *c, int focused); -+ static void grabkeys(void); -+@@ -188,13 +214,16 @@ static void pop(Client *); -+ static void propertynotify(XEvent *e); -+ static void quit(const Arg *arg); -+ static Monitor *recttomon(int x, int y, int w, int h); -++static void removesystrayicon(Client *i); -+ static void resize(Client *c, int x, int y, int w, int h, int interact); -++static void resizebarwin(Monitor *m); -+ static void resizeclient(Client *c, int x, int y, int w, int h); -+ static void resizemouse(const Arg *arg); -++static void resizerequest(XEvent *e); -+ static void restack(Monitor *m); -+ static void run(void); -+ static void scan(void); -+-static int sendevent(Client *c, Atom proto); -++static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); -+ static void sendmon(Client *c, Monitor *m); -+ static void setclientstate(Client *c, long state); -+ static void setfocus(Client *c); -+@@ -206,6 +235,7 @@ static void seturgent(Client *c, int urg); -+ static void showhide(Client *c); -+ static void sigchld(int unused); -+ static void spawn(const Arg *arg); -++static Monitor *systraytomon(Monitor *m); -+ static void tag(const Arg *arg); -+ static void tagmon(const Arg *arg); -+ static void tile(Monitor *); -+@@ -223,18 +253,23 @@ static int updategeom(void); -+ static void updatenumlockmask(void); -+ static void updatesizehints(Client *c); -+ static void updatestatus(void); -++static void updatesystray(void); -++static void updatesystrayicongeom(Client *i, int w, int h); -++static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); -+ static void updatetitle(Client *c); -+ static void updatewindowtype(Client *c); -+ static void updatewmhints(Client *c); -+ static void view(const Arg *arg); -+ static Client *wintoclient(Window w); -+ static Monitor *wintomon(Window w); -++static Client *wintosystrayicon(Window w); -+ static int xerror(Display *dpy, XErrorEvent *ee); -+ static int xerrordummy(Display *dpy, XErrorEvent *ee); -+ static int xerrorstart(Display *dpy, XErrorEvent *ee); -+ static void zoom(const Arg *arg); -+ -+ /* variables */ -++static Systray *systray = NULL; -+ static const char broken[] = "broken"; -+ static char stext[256]; -+ static int screen; -+@@ -257,9 +292,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { -+ [MapRequest] = maprequest, -+ [MotionNotify] = motionnotify, -+ [PropertyNotify] = propertynotify, -++ [ResizeRequest] = resizerequest, -+ [UnmapNotify] = unmapnotify -+ }; -+-static Atom wmatom[WMLast], netatom[NetLast]; -++static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; -+ static int running = 1; -+ static Cur *cursor[CurLast]; -+ static Clr **scheme; -+@@ -439,7 +475,7 @@ buttonpress(XEvent *e) -+ arg.ui = 1 << i; -+ } else if (ev->x < x + blw) -+ click = ClkLtSymbol; -+- else if (ev->x > selmon->ww - TEXTW(stext)) -++ else if (ev->x > selmon->ww - TEXTW(stext) - getsystraywidth()) -+ click = ClkStatusText; -+ else -+ click = ClkWinTitle; -+@@ -482,6 +518,11 @@ cleanup(void) -+ XUngrabKey(dpy, AnyKey, AnyModifier, root); -+ while (mons) -+ cleanupmon(mons); -++ if (showsystray) { -++ XUnmapWindow(dpy, systray->win); -++ XDestroyWindow(dpy, systray->win); -++ free(systray); -++ } -+ for (i = 0; i < CurLast; i++) -+ drw_cur_free(drw, cursor[i]); -+ for (i = 0; i < LENGTH(colors); i++) -+@@ -512,9 +553,57 @@ cleanupmon(Monitor *mon) -+ void -+ clientmessage(XEvent *e) -+ { -++ XWindowAttributes wa; -++ XSetWindowAttributes swa; -+ XClientMessageEvent *cme = &e->xclient; -+ Client *c = wintoclient(cme->window); -+ -++ if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { -++ /* add systray icons */ -++ if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { -++ if (!(c = (Client *)calloc(1, sizeof(Client)))) -++ die("fatal: could not malloc() %u bytes\n", sizeof(Client)); -++ if (!(c->win = cme->data.l[2])) { -++ free(c); -++ return; -++ } -++ c->mon = selmon; -++ c->next = systray->icons; -++ systray->icons = c; -++ if (!XGetWindowAttributes(dpy, c->win, &wa)) { -++ /* use sane defaults */ -++ wa.width = bh; -++ wa.height = bh; -++ wa.border_width = 0; -++ } -++ c->x = c->oldx = c->y = c->oldy = 0; -++ c->w = c->oldw = wa.width; -++ c->h = c->oldh = wa.height; -++ c->oldbw = wa.border_width; -++ c->bw = 0; -++ c->isfloating = True; -++ /* reuse tags field as mapped status */ -++ c->tags = 1; -++ updatesizehints(c); -++ updatesystrayicongeom(c, wa.width, wa.height); -++ XAddToSaveSet(dpy, c->win); -++ XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); -++ XReparentWindow(dpy, c->win, systray->win, 0, 0); -++ /* use parents background color */ -++ swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; -++ XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); -++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); -++ /* FIXME not sure if I have to send these events, too */ -++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); -++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); -++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); -++ XSync(dpy, False); -++ resizebarwin(selmon); -++ updatesystray(); -++ setclientstate(c, NormalState); -++ } -++ return; -++ } -+ if (!c) -+ return; -+ if (cme->message_type == netatom[NetWMState]) { -+@@ -567,7 +656,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, m->by, m->ww, bh); -++ resizebarwin(m); -+ } -+ focus(NULL); -+ arrange(NULL); -+@@ -652,6 +741,11 @@ destroynotify(XEvent *e) -+ -+ if ((c = wintoclient(ev->window))) -+ unmanage(c, 1); -++ else if ((c = wintosystrayicon(ev->window))) { -++ removesystrayicon(c); -++ resizebarwin(selmon); -++ updatesystray(); -++ } -+ } -+ -+ void -+@@ -695,19 +789,23 @@ dirtomon(int dir) -+ void -+ drawbar(Monitor *m) -+ { -+- int x, w, sw = 0; -++ int x, w, sw = 0, stw = 0; -+ int boxs = drw->fonts->h / 9; -+ int boxw = drw->fonts->h / 6 + 2; -+ unsigned int i, occ = 0, urg = 0; -+ Client *c; -+ -++ if(showsystray && m == systraytomon(m)) -++ stw = getsystraywidth(); -++ -+ /* draw status first so it can be overdrawn by tags later */ -+ if (m == selmon) { /* status is only drawn on selected monitor */ -+ drw_setscheme(drw, scheme[SchemeNorm]); -+- sw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ -+- drw_text(drw, m->ww - sw, 0, sw, bh, 0, stext, 0); -++ sw = TEXTW(stext) - lrpad / 2 + 2; /* 2px right padding */ -++ drw_text(drw, m->ww - sw - stw, 0, sw, bh, lrpad / 2 - 2, stext, 0); -+ } -+ -++ resizebarwin(m); -+ for (c = m->clients; c; c = c->next) { -+ occ |= c->tags; -+ if (c->isurgent) -+@@ -728,7 +826,7 @@ drawbar(Monitor *m) -+ drw_setscheme(drw, scheme[SchemeNorm]); -+ x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); -+ -+- if ((w = m->ww - sw - x) > bh) { -++ if ((w = m->ww - sw - stw - x) > bh) { -+ if (m->sel) { -+ drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); -+ drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); -+@@ -739,7 +837,7 @@ drawbar(Monitor *m) -+ drw_rect(drw, x, 0, w, bh, 1, 1); -+ } -+ } -+- drw_map(drw, m->barwin, 0, 0, m->ww, bh); -++ drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); -+ } -+ -+ void -+@@ -776,8 +874,11 @@ expose(XEvent *e) -+ Monitor *m; -+ XExposeEvent *ev = &e->xexpose; -+ -+- if (ev->count == 0 && (m = wintomon(ev->window))) -++ if (ev->count == 0 && (m = wintomon(ev->window))) { -+ drawbar(m); -++ if (m == selmon) -++ updatesystray(); -++ } -+ } -+ -+ void -+@@ -862,10 +963,17 @@ getatomprop(Client *c, Atom prop) -+ unsigned long dl; -+ unsigned char *p = NULL; -+ Atom da, atom = None; -++ /* FIXME getatomprop should return the number of items and a pointer to -++ * the stored data instead of this workaround */ -++ Atom req = XA_ATOM; -++ if (prop == xatom[XembedInfo]) -++ req = xatom[XembedInfo]; -+ -+- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, -++ if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, -+ &da, &di, &dl, &dl, &p) == Success && p) { -+ atom = *(Atom *)p; -++ if (da == xatom[XembedInfo] && dl == 2) -++ atom = ((Atom *)p)[1]; -+ XFree(p); -+ } -+ return atom; -+@@ -899,6 +1007,16 @@ getstate(Window w) -+ return result; -+ } -+ -++unsigned int -++getsystraywidth() -++{ -++ unsigned int w = 0; -++ Client *i; -++ if(showsystray) -++ for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; -++ return w ? w + systrayspacing : 1; -++} -++ -+ int -+ gettextprop(Window w, Atom atom, char *text, unsigned int size) -+ { -+@@ -1003,7 +1121,7 @@ killclient(const Arg *arg) -+ { -+ if (!selmon->sel) -+ return; -+- if (!sendevent(selmon->sel, wmatom[WMDelete])) { -++ if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { -+ XGrabServer(dpy); -+ XSetErrorHandler(xerrordummy); -+ XSetCloseDownMode(dpy, DestroyAll); -+@@ -1091,6 +1209,12 @@ maprequest(XEvent *e) -+ { -+ static XWindowAttributes wa; -+ XMapRequestEvent *ev = &e->xmaprequest; -++ Client *i; -++ if ((i = wintosystrayicon(ev->window))) { -++ sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); -++ resizebarwin(selmon); -++ updatesystray(); -++ } -+ -+ if (!XGetWindowAttributes(dpy, ev->window, &wa)) -+ return; -+@@ -1215,6 +1339,16 @@ propertynotify(XEvent *e) -+ Window trans; -+ XPropertyEvent *ev = &e->xproperty; -+ -++ if ((c = wintosystrayicon(ev->window))) { -++ if (ev->atom == XA_WM_NORMAL_HINTS) { -++ updatesizehints(c); -++ updatesystrayicongeom(c, c->w, c->h); -++ } -++ else -++ updatesystrayiconstate(c, ev); -++ resizebarwin(selmon); -++ updatesystray(); -++ } -+ if ((ev->window == root) && (ev->atom == XA_WM_NAME)) -+ updatestatus(); -+ else if (ev->state == PropertyDelete) -+@@ -1265,6 +1399,20 @@ recttomon(int x, int y, int w, int h) -+ return r; -+ } -+ -++void -++removesystrayicon(Client *i) -++{ -++ Client **ii; -++ -++ if (!showsystray || !i) -++ return; -++ for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); -++ if (ii) -++ *ii = i->next; -++ free(i); -++} -++ -++ -+ void -+ resize(Client *c, int x, int y, int w, int h, int interact) -+ { -+@@ -1272,6 +1420,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) -+ resizeclient(c, x, y, w, h); -+ } -+ -++void -++resizebarwin(Monitor *m) { -++ unsigned int w = m->ww; -++ if (showsystray && m == systraytomon(m)) -++ w -= getsystraywidth(); -++ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); -++} -++ -+ void -+ resizeclient(Client *c, int x, int y, int w, int h) -+ { -+@@ -1344,6 +1500,19 @@ resizemouse(const Arg *arg) -+ } -+ } -+ -++void -++resizerequest(XEvent *e) -++{ -++ XResizeRequestEvent *ev = &e->xresizerequest; -++ Client *i; -++ -++ if ((i = wintosystrayicon(ev->window))) { -++ updatesystrayicongeom(i, ev->width, ev->height); -++ resizebarwin(selmon); -++ updatesystray(); -++ } -++} -++ -+ void -+ restack(Monitor *m) -+ { -+@@ -1433,26 +1602,36 @@ setclientstate(Client *c, long state) -+ } -+ -+ int -+-sendevent(Client *c, Atom proto) -++sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) -+ { -+ int n; -+- Atom *protocols; -++ Atom *protocols, mt; -+ int exists = 0; -+ XEvent ev; -+ -+- if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { -+- while (!exists && n--) -+- exists = protocols[n] == proto; -+- XFree(protocols); -++ if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { -++ mt = wmatom[WMProtocols]; -++ if (XGetWMProtocols(dpy, w, &protocols, &n)) { -++ while (!exists && n--) -++ exists = protocols[n] == proto; -++ XFree(protocols); -++ } -++ } -++ else { -++ exists = True; -++ mt = proto; -+ } -+ if (exists) { -+ ev.type = ClientMessage; -+- ev.xclient.window = c->win; -+- ev.xclient.message_type = wmatom[WMProtocols]; -++ ev.xclient.window = w; -++ ev.xclient.message_type = mt; -+ ev.xclient.format = 32; -+- ev.xclient.data.l[0] = proto; -+- ev.xclient.data.l[1] = CurrentTime; -+- XSendEvent(dpy, c->win, False, NoEventMask, &ev); -++ ev.xclient.data.l[0] = d0; -++ ev.xclient.data.l[1] = d1; -++ ev.xclient.data.l[2] = d2; -++ ev.xclient.data.l[3] = d3; -++ ev.xclient.data.l[4] = d4; -++ XSendEvent(dpy, w, False, mask, &ev); -+ } -+ return exists; -+ } -+@@ -1466,7 +1645,7 @@ setfocus(Client *c) -+ XA_WINDOW, 32, PropModeReplace, -+ (unsigned char *) &(c->win), 1); -+ } -+- sendevent(c, wmatom[WMTakeFocus]); -++ sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); -+ } -+ -+ void -+@@ -1555,6 +1734,10 @@ setup(void) -+ wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); -+ netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); -+ netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); -++ netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); -++ netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); -++ netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); -++ netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); -+ netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); -+ netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); -+ netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); -+@@ -1562,6 +1745,9 @@ setup(void) -+ netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); -+ netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); -+ netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); -++ xatom[Manager] = XInternAtom(dpy, "MANAGER", False); -++ xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); -++ xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); -+ /* init cursors */ -+ cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); -+ cursor[CurResize] = drw_cur_create(drw, XC_sizing); -+@@ -1570,6 +1756,8 @@ setup(void) -+ scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); -+ for (i = 0; i < LENGTH(colors); i++) -+ scheme[i] = drw_scm_create(drw, colors[i], 3); -++ /* init system tray */ -++ updatesystray(); -+ /* init bars */ -+ updatebars(); -+ updatestatus(); -+@@ -1701,7 +1889,18 @@ togglebar(const Arg *arg) -+ { -+ selmon->showbar = !selmon->showbar; -+ updatebarpos(selmon); -+- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); -++ resizebarwin(selmon); -++ if (showsystray) { -++ XWindowChanges wc; -++ if (!selmon->showbar) -++ wc.y = -bh; -++ else if (selmon->showbar) { -++ wc.y = 0; -++ if (!selmon->topbar) -++ wc.y = selmon->mh - bh; -++ } -++ XConfigureWindow(dpy, systray->win, CWY, &wc); -++ } -+ arrange(selmon); -+ } -+ -+@@ -1796,11 +1995,18 @@ unmapnotify(XEvent *e) -+ else -+ unmanage(c, 0); -+ } -++ else if ((c = wintosystrayicon(ev->window))) { -++ /* KLUDGE! sometimes icons occasionally unmap their windows, but do -++ * _not_ destroy them. We map those windows back */ -++ XMapRaised(dpy, c->win); -++ updatesystray(); -++ } -+ } -+ -+ void -+ updatebars(void) -+ { -++ unsigned int w; -+ Monitor *m; -+ XSetWindowAttributes wa = { -+ .override_redirect = True, -+@@ -1811,10 +2017,15 @@ updatebars(void) -+ for (m = mons; m; m = m->next) { -+ if (m->barwin) -+ continue; -+- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), -++ w = m->ww; -++ if (showsystray && m == systraytomon(m)) -++ w -= getsystraywidth(); -++ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), -+ CopyFromParent, DefaultVisual(dpy, screen), -+ CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); -+ XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); -++ if (showsystray && m == systraytomon(m)) -++ XMapRaised(dpy, systray->win); -+ XMapRaised(dpy, m->barwin); -+ XSetClassHint(dpy, m->barwin, &ch); -+ } -+@@ -1990,6 +2201,121 @@ updatestatus(void) -+ if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) -+ strcpy(stext, "dwm-"VERSION); -+ drawbar(selmon); -++ updatesystray(); -++} -++ -++void -++updatesystrayicongeom(Client *i, int w, int h) -++{ -++ if (i) { -++ i->h = bh; -++ if (w == h) -++ i->w = bh; -++ else if (h == bh) -++ i->w = w; -++ else -++ i->w = (int) ((float)bh * ((float)w / (float)h)); -++ applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); -++ /* force icons into the systray dimensions if they don't want to */ -++ if (i->h > bh) { -++ if (i->w == i->h) -++ i->w = bh; -++ else -++ i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); -++ i->h = bh; -++ } -++ } -++} -++ -++void -++updatesystrayiconstate(Client *i, XPropertyEvent *ev) -++{ -++ long flags; -++ int code = 0; -++ -++ if (!showsystray || !i || ev->atom != xatom[XembedInfo] || -++ !(flags = getatomprop(i, xatom[XembedInfo]))) -++ return; -++ -++ if (flags & XEMBED_MAPPED && !i->tags) { -++ i->tags = 1; -++ code = XEMBED_WINDOW_ACTIVATE; -++ XMapRaised(dpy, i->win); -++ setclientstate(i, NormalState); -++ } -++ else if (!(flags & XEMBED_MAPPED) && i->tags) { -++ i->tags = 0; -++ code = XEMBED_WINDOW_DEACTIVATE; -++ XUnmapWindow(dpy, i->win); -++ setclientstate(i, WithdrawnState); -++ } -++ else -++ return; -++ sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, -++ systray->win, XEMBED_EMBEDDED_VERSION); -++} -++ -++void -++updatesystray(void) -++{ -++ XSetWindowAttributes wa; -++ XWindowChanges wc; -++ Client *i; -++ Monitor *m = systraytomon(NULL); -++ unsigned int x = m->mx + m->mw; -++ unsigned int w = 1; -++ -++ if (!showsystray) -++ return; -++ if (!systray) { -++ /* init systray */ -++ if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) -++ die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); -++ systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); -++ wa.event_mask = ButtonPressMask | ExposureMask; -++ wa.override_redirect = True; -++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; -++ XSelectInput(dpy, systray->win, SubstructureNotifyMask); -++ XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, -++ PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); -++ XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); -++ XMapRaised(dpy, systray->win); -++ XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); -++ if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { -++ sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); -++ XSync(dpy, False); -++ } -++ else { -++ fprintf(stderr, "dwm: unable to obtain system tray.\n"); -++ free(systray); -++ systray = NULL; -++ return; -++ } -++ } -++ for (w = 0, i = systray->icons; i; i = i->next) { -++ /* make sure the background color stays the same */ -++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; -++ XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); -++ XMapRaised(dpy, i->win); -++ w += systrayspacing; -++ i->x = w; -++ XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); -++ w += i->w; -++ if (i->mon != m) -++ i->mon = m; -++ } -++ w = w ? w + systrayspacing : 1; -++ x -= w; -++ XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); -++ wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh; -++ wc.stack_mode = Above; wc.sibling = m->barwin; -++ XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc); -++ XMapWindow(dpy, systray->win); -++ XMapSubwindows(dpy, systray->win); -++ /* redraw background */ -++ XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); -++ XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); -++ XSync(dpy, False); -+ } -+ -+ void -+@@ -2057,6 +2383,16 @@ wintoclient(Window w) -+ return NULL; -+ } -+ -++Client * -++wintosystrayicon(Window w) { -++ Client *i = NULL; -++ -++ if (!showsystray || !w) -++ return i; -++ for (i = systray->icons; i && i->win != w; i = i->next) ; -++ return i; -++} -++ -+ Monitor * -+ wintomon(Window w) -+ { -+@@ -2110,6 +2446,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) -+ return -1; -+ } -+ -++Monitor * -++systraytomon(Monitor *m) { -++ Monitor *t; -++ int i, n; -++ if(!systraypinning) { -++ if(!m) -++ return selmon; -++ return m == selmon ? m : NULL; -++ } -++ for(n = 1, t = mons; t && t->next; n++, t = t->next) ; -++ for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) ; -++ if(systraypinningfailfirst && n < systraypinning) -++ return mons; -++ return t; -++} -++ -+ void -+ zoom(const Arg *arg) -+ { -+-- -+2.17.1 -+ -diff --git a/patches/dwm-uselessgap-6.2.diff b/patches/dwm-uselessgap-6.2.diff -new file mode 100644 -index 0000000..d9cacbe ---- /dev/null -+++ b/patches/dwm-uselessgap-6.2.diff -@@ -0,0 +1,81 @@ -+From 58a5ece9406ca6c90dc362617c065e4aac19417f Mon Sep 17 00:00:00 2001 -+From: Cyril Cressent <cyril@cressent.org> -+Date: Wed, 3 Jul 2019 21:33:45 -0700 -+Subject: [PATCH] Port the uselessgap patch to 6.2 -+ -+--- -+ config.def.h | 1 + -+ dwm.c | 36 ++++++++++++++++++++++++++++++------ -+ 2 files changed, 31 insertions(+), 6 deletions(-) -+ -+diff --git a/config.def.h b/config.def.h -+index 1c0b587..b11471d 100644 -+--- a/config.def.h -++++ b/config.def.h -+@@ -2,6 +2,7 @@ -+ -+ /* appearance */ -+ static const unsigned int borderpx = 1; /* border pixel of windows */ -++static const unsigned int gappx = 6; /* gaps between windows */ -+ static const unsigned int snap = 32; /* snap pixel */ -+ static const int showbar = 1; /* 0 means no bar */ -+ static const int topbar = 1; /* 0 means bottom bar */ -+diff --git a/dwm.c b/dwm.c -+index 4465af1..4545e05 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -52,8 +52,8 @@ -+ #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) -+ #define LENGTH(X) (sizeof X / sizeof X[0]) -+ #define MOUSEMASK (BUTTONMASK|PointerMotionMask) -+-#define WIDTH(X) ((X)->w + 2 * (X)->bw) -+-#define HEIGHT(X) ((X)->h + 2 * (X)->bw) -++#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) -++#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) -+ #define TAGMASK ((1 << LENGTH(tags)) - 1) -+ #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) -+ -+@@ -1276,12 +1276,36 @@ void -+ resizeclient(Client *c, int x, int y, int w, int h) -+ { -+ XWindowChanges wc; -++ unsigned int n; -++ unsigned int gapoffset; -++ unsigned int gapincr; -++ Client *nbc; -+ -+- c->oldx = c->x; c->x = wc.x = x; -+- c->oldy = c->y; c->y = wc.y = y; -+- c->oldw = c->w; c->w = wc.width = w; -+- c->oldh = c->h; c->h = wc.height = h; -+ wc.border_width = c->bw; -++ -++ /* Get number of clients for the selected monitor */ -++ for (n = 0, nbc = nexttiled(selmon->clients); nbc; nbc = nexttiled(nbc->next), n++); -++ -++ /* Do nothing if layout is floating */ -++ if (c->isfloating || selmon->lt[selmon->sellt]->arrange == NULL) { -++ gapincr = gapoffset = 0; -++ } else { -++ /* Remove border and gap if layout is monocle or only one client */ -++ if (selmon->lt[selmon->sellt]->arrange == monocle || n == 1) { -++ gapoffset = 0; -++ gapincr = -2 * borderpx; -++ wc.border_width = 0; -++ } else { -++ gapoffset = gappx; -++ gapincr = 2 * gappx; -++ } -++ } -++ -++ c->oldx = c->x; c->x = wc.x = x + gapoffset; -++ c->oldy = c->y; c->y = wc.y = y + gapoffset; -++ c->oldw = c->w; c->w = wc.width = w - gapincr; -++ c->oldh = c->h; c->h = wc.height = h - gapincr; -++ -+ XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); -+ configure(c); -+ XSync(dpy, False); -+-- -+2.22.0 -+ -diff --git a/patches/dwm-zoomswap-6.2.diff b/patches/dwm-zoomswap-6.2.diff -new file mode 100644 -index 0000000..3c658e6 ---- /dev/null -+++ b/patches/dwm-zoomswap-6.2.diff -@@ -0,0 +1,95 @@ -+From 3867ef5a68e15a4faff377ddbc8371853de4a800 Mon Sep 17 00:00:00 2001 -+From: aleks <aleks.stier@icloud.com> -+Date: Sat, 19 Oct 2019 00:56:21 +0200 -+Subject: [PATCH] Put master to exact position of zoomed client -+ -+The default behaviour when zooming a client is to put the previous -+master on top of the client-stack. This patch puts the master to the -+exact position of the zoomed client in the stack. -+--- -+ dwm.c | 44 ++++++++++++++++++++++++++++++++++++++++---- -+ 1 file changed, 40 insertions(+), 4 deletions(-) -+ -+diff --git a/dwm.c b/dwm.c -+index 4465af1..1719b36 100644 -+--- a/dwm.c -++++ b/dwm.c -+@@ -165,6 +165,7 @@ static void drawbar(Monitor *m); -+ static void drawbars(void); -+ static void enternotify(XEvent *e); -+ static void expose(XEvent *e); -++static Client *findbefore(Client *c); -+ static void focus(Client *c); -+ static void focusin(XEvent *e); -+ static void focusmon(const Arg *arg); -+@@ -235,6 +236,7 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee); -+ static void zoom(const Arg *arg); -+ -+ /* variables */ -++static Client *prevzoom = NULL; -+ static const char broken[] = "broken"; -+ static char stext[256]; -+ static int screen; -+@@ -780,6 +782,16 @@ expose(XEvent *e) -+ drawbar(m); -+ } -+ -++Client * -++findbefore(Client *c) -++{ -++ Client *tmp; -++ if (c == selmon->clients) -++ return NULL; -++ for (tmp = selmon->clients; tmp && tmp->next != c; tmp = tmp->next); -++ return tmp; -++} -++ -+ void -+ focus(Client *c) -+ { -+@@ -2114,14 +2126,38 @@ void -+ zoom(const Arg *arg) -+ { -+ Client *c = selmon->sel; -++ Client *at = NULL, *cold, *cprevious = NULL; -+ -+ if (!selmon->lt[selmon->sellt]->arrange -+ || (selmon->sel && selmon->sel->isfloating)) -+ return; -+- if (c == nexttiled(selmon->clients)) -+- if (!c || !(c = nexttiled(c->next))) -+- return; -+- pop(c); -++ if (c == nexttiled(selmon->clients)) { -++ at = findbefore(prevzoom); -++ if (at) -++ cprevious = nexttiled(at->next); -++ if (!cprevious || cprevious != prevzoom) { -++ prevzoom = NULL; -++ if (!c || !(c = nexttiled(c->next))) -++ return; -++ } else -++ c = cprevious; -++ } -++ cold = nexttiled(selmon->clients); -++ if (c != cold && !at) -++ at = findbefore(c); -++ detach(c); -++ attach(c); -++ /* swap windows instead of pushing the previous one down */ -++ if (c != cold && at) { -++ prevzoom = cold; -++ if (cold && at != cold) { -++ detach(cold); -++ cold->next = at->next; -++ at->next = cold; -++ } -++ } -++ focus(c); -++ arrange(c->mon); -+ } -+ -+ int -+-- -+2.23.0 -+ diff --git a/tcl.c b/tcl.c new file mode 100644 index 0000000..4c94914 |