dotfiles

Config files from my daily system
Index Commits Files Refs README
commit 79427ef5555f087b9f4f05869884c9378152c3ef
parent aebb145c854568cff98e2b2ed302704f206a381d
Author: mjkloeckner <martin.cachari@gmail.com>
Date:   Wed, 21 Dec 2022 18:29:33 -0300

removed git submodules

Git submodules like dwm, dwmblocks and dmenu are removed from this repo.
I will create a standalone git repository for each one of them in a
future

Diffstat:
D.config/dmenu | 1-
D.config/dwm/LICENSE | 37-------------------------------------
D.config/dwm/Makefile | 52----------------------------------------------------
D.config/dwm/README | 48------------------------------------------------
D.config/dwm/config.def.h | 217-------------------------------------------------------------------------------
D.config/dwm/config.h | 217-------------------------------------------------------------------------------
D.config/dwm/config.mk | 38--------------------------------------
D.config/dwm/dmenu_run_history | 50--------------------------------------------------
D.config/dwm/drw.c | 438-------------------------------------------------------------------------------
D.config/dwm/drw.h | 57---------------------------------------------------------
D.config/dwm/drw.o | 0
D.config/dwm/dwm | 0
D.config/dwm/dwm.1 | 199-------------------------------------------------------------------------------
D.config/dwm/dwm.c | 2851-------------------------------------------------------------------------------
D.config/dwm/dwm.o | 0
D.config/dwm/dwm.png | 0
D.config/dwm/gaplessgrid.c | 35-----------------------------------
D.config/dwm/patches/dwm-alpha-20201019-61bb8b2.diff | 289------------------------------------------------------------------------------
D.config/dwm/patches/dwm-alwayscenter-20200625-f04cac6.diff | 12------------
D.config/dwm/patches/dwm-autostart-20210120-cb3f58a.diff | 179-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-cfacts-vanitygaps-6.2_combo.diff | 1110-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-combo-6.1.diff | 75---------------------------------------------------------------------------
D.config/dwm/patches/dwm-defaulttransparency-r1521.diff | 73-------------------------------------------------------------------------
D.config/dwm/patches/dwm-fixborders-6.2.diff | 27---------------------------
D.config/dwm/patches/dwm-floatrules-6.2.diff | 64----------------------------------------------------------------
D.config/dwm/patches/dwm-fullgaps-20200508-7b77734.diff | 138-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-gaplessgrid-20160731-56a31dc.diff | 43-------------------------------------------
D.config/dwm/patches/dwm-gridmode-20170909-ceac8c9.diff | 73-------------------------------------------------------------------------
D.config/dwm/patches/dwm-pertag-perseltag-6.2.diff | 224-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-statuscmd-20210405-67d76bd.diff | 208-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-statuscmd-6.2.diff | 142-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-statuscmd-signal-6.2.diff | 157-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-sticky-6.1.diff | 58----------------------------------------------------------
D.config/dwm/patches/dwm-systray-20210217-61bb8b2.diff | 754-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-systray-20210418-67d76bd.diff | 754-------------------------------------------------------------------------------
D.config/dwm/patches/dwm-titlecolor-20190206-6.2.diff | 46----------------------------------------------
D.config/dwm/patches/dwmblocks-statuscmd.diff | 80-------------------------------------------------------------------------------
D.config/dwm/transient.c | 42------------------------------------------
D.config/dwm/util.c | 35-----------------------------------
D.config/dwm/util.h | 8--------
D.config/dwm/util.o | 0
D.config/dwm/vanitygaps.c | 823-------------------------------------------------------------------------------
D.config/dwmblocks | 1-
MREADME.md | 12+++++++-----
44 files changed, 7 insertions(+), 9660 deletions(-)
diff --git a/.config/dmenu b/.config/dmenu
@@ -1 +0,0 @@
-Subproject commit 1a13d0465d1a6f4f74bc5b07b04c9bd542f20ba6
diff --git a/.config/dwm/LICENSE b/.config/dwm/LICENSE
@@ -1,37 +0,0 @@
-MIT/X Consortium License
-
-© 2006-2019 Anselm R Garbe <anselm@garbe.ca>
-© 2006-2009 Jukka Salmi <jukka at salmi dot ch>
-© 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
-© 2007-2011 Peter Hartlich <sgkkr at hartlich dot com>
-© 2007-2009 Szabolcs Nagy <nszabolcs at gmail dot com>
-© 2007-2009 Christof Musik <christof at sendfax dot de>
-© 2007-2009 Premysl Hruby <dfenze at gmail dot com>
-© 2007-2008 Enno Gottox Boland <gottox at s01 dot de>
-© 2008 Martin Hurton <martin dot hurton at gmail dot com>
-© 2008 Neale Pickett <neale dot woozle dot org>
-© 2009 Mate Nagy <mnagy at port70 dot net>
-© 2010-2016 Hiltjo Posthuma <hiltjo@codemadness.org>
-© 2010-2012 Connor Lane Smith <cls@lubutu.com>
-© 2011 Christoph Lohmann <20h@r-36.net>
-© 2015-2016 Quentin Rameau <quinq@fifth.space>
-© 2015-2016 Eric Pruitt <eric.pruitt@gmail.com>
-© 2016-2017 Markus Teich <markus.teich@stusta.mhn.de>
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
diff --git a/.config/dwm/Makefile b/.config/dwm/Makefile
@@ -1,52 +0,0 @@
-# dwm - dynamic window manager
-# See LICENSE file for copyright and license details.
-
-include config.mk
-
-SRC = drw.c dwm.c util.c
-OBJ = ${SRC:.c=.o}
-
-all: options dwm
-
-options:
-    @echo dwm build options:
-    @echo "CFLAGS   = ${CFLAGS}"
-    @echo "LDFLAGS  = ${LDFLAGS}"
-    @echo "CC       = ${CC}"
-
-.c.o:
-    ${CC} -c ${CFLAGS} $<
-
-${OBJ}: config.h config.mk
-
-config.h:
-    cp config.def.h $@
-
-dwm: ${OBJ}
-    ${CC} -o $@ ${OBJ} ${LDFLAGS}
-
-clean:
-    rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz
-    rm -f config.h
-
-dist: clean
-    mkdir -p dwm-${VERSION}
-    cp -R LICENSE Makefile README config.def.h config.mk\
-        dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION}
-    tar -cf dwm-${VERSION}.tar dwm-${VERSION}
-    gzip dwm-${VERSION}.tar
-    rm -rf dwm-${VERSION}
-
-install: all
-    mkdir -p ${DESTDIR}${PREFIX}/bin
-    cp -f dwm ${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
-    chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
-
-uninstall:
-    rm -f ${DESTDIR}${PREFIX}/bin/dwm\
-        ${DESTDIR}${MANPREFIX}/man1/dwm.1
-
-.PHONY: all options clean dist install uninstall
diff --git a/.config/dwm/README b/.config/dwm/README
@@ -1,48 +0,0 @@
-dwm - dynamic window manager
-============================
-dwm is an extremely fast, small, and dynamic window manager for X.
-
-
-Requirements
-------------
-In order to build dwm you need the Xlib header files.
-
-
-Installation
-------------
-Edit config.mk to match your local setup (dwm is installed into
-the /usr/local namespace by default).
-
-Afterwards enter the following command to build and install dwm (if
-necessary as root):
-
-    make clean install
-
-
-Running dwm
------------
-Add the following line to your .xinitrc to start dwm using startx:
-
-    exec dwm
-
-In order to connect dwm to a specific display, make sure that
-the DISPLAY environment variable is set correctly, e.g.:
-
-    DISPLAY=foo.bar:1 exec dwm
-
-(This will start dwm on display :1 of the host foo.bar.)
-
-In order to display status info in the bar, you can do something
-like this in your .xinitrc:
-
-    while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
-    do
-        sleep 1
-    done &
-    exec dwm
-
-
-Configuration
--------------
-The configuration of dwm is done by creating a custom config.h
-and (re)compiling the source code.
diff --git a/.config/dwm/config.def.h b/.config/dwm/config.def.h
@@ -1,217 +0,0 @@
-/* appearance */
-static const unsigned int borderpx  = 0;        /* border pixel of windows */
-static const unsigned int snap      = 16;       /* snap pixel */
-static const unsigned int gappih    = 3;       /* horiz inner gap between windows */
-static const unsigned int gappiv    = 3;       /* vert inner gap between windows */
-static const unsigned int gappoh    = 6;       /* horiz outer gap between windows and screen edge */
-static const unsigned int gappov    = 8;       /* vert outer gap between windows and screen edge */
-static       int smartgaps          = 1;        /* 1 means no outer gap when there is only one window */
-static const unsigned int systraypinning = 0;   /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */
-static const unsigned int systrayonleft = 0;       /* 0: systray in the right corner, >0: systray on left of status text */
-static const unsigned int systrayspacing = 0;   /* 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             = 0;        /* 0 means bottom bar */
-static const char *fonts[]          = { "Source Code Pro:style=Regular:size=8", "JoyPixels:style=Regular:size=7:antialias=true:autohint=true", "DejaVu Sans"  };
-static const char dmenufont[]       = "DejaVuSansMono Nerd Font:style=Regular:size=8";
-static const char col_gray1[]       = "#000000";
-static const char col_gray2[]       = "#444444";
-static const char col_gray3[]       = "#cccccc";
-static const char col_gray4[]       = "#eeeeee";
-static const char col_cyan[]        = "#005577";
-static const char col_blue[]        = "#0055ff";
-static const char col_red[]        = "#ff1100";
-static const char col_orange[]        = "#ff1100";
-static const char col_violet[]        = "#EE82EE";
-static const char col_darkmagenta[]        = "#8B008B";
-/* static const unsigned int baralpha = 0xd0; */
-/* static const unsigned int borderalpha = OPAQUE; */
-
-static const char *colors[][3]      = {
-    /*               fg         bg         border   */
-    [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
-    [SchemeSel]  = { col_gray4, col_darkmagenta,  col_darkmagenta  },
-    [SchemeTitle]  = { col_gray4, col_gray1,  col_cyan  },
-};
-
-/* static const unsigned int alphas[][3]      = { */
-/*     /1*               fg      bg        border     *1/ */
-/*     [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, */
-/*     [SchemeSel]  = { OPAQUE, baralpha, borderalpha }, */
-/* }; */
-
-/* tagging */
-static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
-
-static const Rule rules[] = {
-    /* xprop(1):
-     *    WM_CLASS(STRING) = instance, class
-     *    WM_NAME(STRING) = title
-     */
-    /* class        instance    title       tags mask   isfloating    monitor    float x,y,w,h    floatborderpx*/
-    { "Gimp",        NULL,       NULL,        0,            0,          -1 },
-    { "Firefox",    NULL,       NULL,        1 << 8,     0,          -1 },
-    { "calculator", NULL,        NULL,        0,            1,          -1,        80,50,400,300,        1 },
-    { "floating",    NULL,        NULL,        0,            1,          -1,        80,50,800,600,        0 },
-};
-
-/* 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 */
-
-#define FORCE_VSPLIT 1  /* nrowgrid layout: force two clients to always split vertically */
-#include "vanitygaps.c"
-
-static const Layout layouts[] = {
-    /* symbol     arrange function */
-    { "[]=",      tile },    /* first entry is default */
-    { "[M]",      monocle },
-    //{ "[#]",      gaplessgrid },
-    { "[@]",      spiral },
-    { "[\\]",     dwindle },
-    { "H[]",      deck },
-    { "TTT",      bstack },
-    { "===",      bstackhoriz },
-    { "HHH",      grid },
-    { "###",      nrowgrid },
-    //{ "---",      horizgrid },
-    //{ ":::",      gaplessgrid },
-    { "|M|",      centeredmaster },
-    { ">M>",      centeredfloatingmaster },
-    { "><>",      NULL },    /* no layout function means floating behavior */
-    { NULL,       NULL },
-};
-
-/* key definitions */
-#define MODKEY Mod4Mask        /* MODKEY to SuperKey */
-#define MOD2KEY Mod1Mask    /* MOD2KEY to altkey    */
-
-#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_history", "-h", "16", "-b", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_darkmagenta, "-sf", col_gray4, NULL };
-/*    static const char *termcmd[]  = { "alacritty", "-o", "cursor.style.blinking=Always", NULL };    */
-static const char *termcmd[]  = { "kitty", NULL };
-static const char *ftermcmd[]  = { "kitty", "--class", "floating", NULL };
-static const char *webcmd[]  = { "firefox", NULL };
-static const char *filescmd[]  = { "alacritty", "-e", "ranger", NULL };
-static const char *gfilescmd[]  = { "pcmanfm-qt", "-n", NULL };
-static const char *bookscmd[] = { "openbook", "-nb", col_gray1, "-nf", col_gray3, "-sb", col_darkmagenta, "-sf", col_gray4, NULL };
-static const char *spotifycmd[]  = { "spotify", NULL };
-static const char *virtualboxcmd[]  = { "virtualbox", NULL };
-static const char *calccmd[]  = { "gnome-calculator", NULL };
-static const char *lutriscmd[]  = { "lutris", NULL };
-static const char *switchkblayout[]  = { "switchkblayout", NULL };
-
-
-/* commands spawned when clicking statusbar, the mouse button pressed is exported as BUTTON */
-static char *statuscmds[] = { "notify-send -r Mouse$BUTTON" };
-static char *statuscmd[] = { "/bin/sh", "-c", NULL, NULL };
-
-static Key keys[] = {
-    /* modifier                     key        function        argument */
-    { MODKEY,                       XK_d,      spawn,          {.v = dmenucmd } },
-    { MODKEY,                        XK_Return, spawn,          {.v = termcmd } },
-    { MODKEY|ShiftMask,                XK_Return, spawn,          {.v = ftermcmd } },
-    { MODKEY,                        XK_w,       spawn,          {.v = webcmd } },
-    { MODKEY,                        XK_e,       spawn,          {.v = gfilescmd } },
-    { MODKEY,                        XK_z,       spawn,          {.v = lutriscmd } },
-    { MODKEY|ShiftMask,                XK_e,       spawn,          {.v = filescmd } },
-    { MODKEY,                        XK_v,       spawn,          {.v = virtualboxcmd } },
-    { MODKEY,                        XK_b,       spawn,          {.v = bookscmd } },
-    { MODKEY,                        XK_s,       spawn,          {.v = spotifycmd } },
-    { MODKEY,                        XK_c,       spawn,          {.v = calccmd } },
-    { MODKEY|MOD2KEY,                XK_l,       spawn,          {.v = switchkblayout } },
-    { MODKEY|ShiftMask,             XK_b,      togglebar,      {0} },
-    { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
-    { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_i,      incnmaster,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_p,      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|ShiftMask,             XK_j,      zoom,           {0} },
-    { MODKEY,                       XK_Tab,    view,           {0} },
-    { MODKEY,                        XK_q,      killclient,     {0} },
-    { MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
-    { MODKEY|ShiftMask,             XK_t,      setlayout,      {.v = &layouts[2]} },
-    { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[1]} },
-    { MODKEY|ShiftMask,             XK_m,      setlayout,      {.v = &layouts[9]} },
-    { MODKEY,                       XK_y,      setlayout,      {.v = &layouts[3]} },
-    { MODKEY|ShiftMask,             XK_y,      setlayout,      {.v = &layouts[4]} },
-    { MODKEY,                       XK_u,      setlayout,      {.v = &layouts[5]} },
-    { MODKEY|ShiftMask,             XK_u,      setlayout,      {.v = &layouts[6]} },
-    { MODKEY,                       XK_g,      setlayout,      {.v = &layouts[7]} },
-    { MODKEY|ShiftMask,             XK_g,      setlayout,      {.v = &layouts[8]} },
-    { MODKEY,                       XK_i,      setlayout,      {.v = &layouts[10]} },
-    { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[11]} },
-    { 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 } },
-    { MODKEY|ShiftMask,                XK_equal,  incrgaps,       {.i = +1 } },
-    { MODKEY,                        XK_minus,  incrgaps,       {.i = -1 } },
-    { MODKEY|MOD2KEY,                XK_i,      incrigaps,      {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,        XK_i,      incrigaps,      {.i = -1 } },
-    { MODKEY|MOD2KEY,                XK_o,      incrogaps,      {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,        XK_o,      incrogaps,      {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_6,      incrihgaps,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_6,      incrihgaps,     {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_7,      incrivgaps,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_7,      incrivgaps,     {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_8,      incrohgaps,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_8,      incrohgaps,     {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_9,      incrovgaps,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_9,      incrovgaps,     {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_0,      togglegaps,     {0} },
-    { MODKEY,                        XK_equal,  defaultgaps,    {0} },
-    TAGKEYS(                        XK_1,                      0)
-    TAGKEYS(                        XK_2,                      1)
-    TAGKEYS(                        XK_3,                      2)
-    TAGKEYS(                        XK_4,                      3)
-    TAGKEYS(                        XK_5,                      4)
-    TAGKEYS(                        XK_6,                      5)
-    TAGKEYS(                        XK_7,                      6)
-    TAGKEYS(                        XK_8,                      7)
-    TAGKEYS(                        XK_9,                      8)
-    TAGKEYS(                        XK_0,                      9)
-    { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
-};
-
-/* 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,        spawn,          {.v = statuscmd } },
-    { ClkStatusText,        0,              Button2,        spawn,          {.v = statuscmd } },
-    { ClkStatusText,        0,              Button3,        spawn,          {.v = statuscmd } },
-    { 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} },
-    { ClkStatusText,        0,              Button1,        spawn,          {.v = statuscmd } },
-    { ClkStatusText,        0,              Button2,        spawn,          {.v = statuscmd } },
-    { ClkStatusText,        0,              Button3,        spawn,          {.v = statuscmd } },
-};
diff --git a/.config/dwm/config.h b/.config/dwm/config.h
@@ -1,217 +0,0 @@
-/* appearance */
-static const unsigned int borderpx  = 0;        /* border pixel of windows */
-static const unsigned int snap      = 16;       /* snap pixel */
-static const unsigned int gappih    = 3;       /* horiz inner gap between windows */
-static const unsigned int gappiv    = 3;       /* vert inner gap between windows */
-static const unsigned int gappoh    = 6;       /* horiz outer gap between windows and screen edge */
-static const unsigned int gappov    = 8;       /* vert outer gap between windows and screen edge */
-static       int smartgaps          = 1;        /* 1 means no outer gap when there is only one window */
-static const unsigned int systraypinning = 0;   /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */
-static const unsigned int systrayonleft = 0;       /* 0: systray in the right corner, >0: systray on left of status text */
-static const unsigned int systrayspacing = 0;   /* 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             = 0;        /* 0 means bottom bar */
-static const char *fonts[]          = { "Source Code Pro:style=Regular:size=8", "JoyPixels:style=Regular:size=7:antialias=true:autohint=true", "DejaVu Sans"  };
-static const char dmenufont[]       = "DejaVuSansMono Nerd Font:style=Regular:size=8";
-static const char col_gray1[]       = "#000000";
-static const char col_gray2[]       = "#444444";
-static const char col_gray3[]       = "#cccccc";
-static const char col_gray4[]       = "#eeeeee";
-static const char col_cyan[]        = "#005577";
-static const char col_blue[]        = "#0055ff";
-static const char col_red[]        = "#ff1100";
-static const char col_orange[]        = "#ff1100";
-static const char col_violet[]        = "#EE82EE";
-static const char col_darkmagenta[]        = "#8B008B";
-/* static const unsigned int baralpha = 0xd0; */
-/* static const unsigned int borderalpha = OPAQUE; */
-
-static const char *colors[][3]      = {
-    /*               fg         bg         border   */
-    [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
-    [SchemeSel]  = { col_gray4, col_darkmagenta,  col_darkmagenta  },
-    [SchemeTitle]  = { col_gray4, col_gray1,  col_cyan  },
-};
-
-/* static const unsigned int alphas[][3]      = { */
-/*     /1*               fg      bg        border     *1/ */
-/*     [SchemeNorm] = { OPAQUE, baralpha, borderalpha }, */
-/*     [SchemeSel]  = { OPAQUE, baralpha, borderalpha }, */
-/* }; */
-
-/* tagging */
-static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
-
-static const Rule rules[] = {
-    /* xprop(1):
-     *    WM_CLASS(STRING) = instance, class
-     *    WM_NAME(STRING) = title
-     */
-    /* class        instance    title       tags mask   isfloating    monitor    float x,y,w,h    floatborderpx*/
-    { "Gimp",        NULL,       NULL,        0,            0,          -1 },
-    { "Firefox",    NULL,       NULL,        1 << 8,     0,          -1 },
-    { "calculator", NULL,        NULL,        0,            1,          -1,        80,50,400,300,        1 },
-    { "floating",    NULL,        NULL,        0,            1,          -1,        80,50,800,600,        0 },
-};
-
-/* 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 */
-
-#define FORCE_VSPLIT 1  /* nrowgrid layout: force two clients to always split vertically */
-#include "vanitygaps.c"
-
-static const Layout layouts[] = {
-    /* symbol     arrange function */
-    { "[]=",      tile },    /* first entry is default */
-    { "[M]",      monocle },
-    //{ "[#]",      gaplessgrid },
-    { "[@]",      spiral },
-    { "[\\]",     dwindle },
-    { "H[]",      deck },
-    { "TTT",      bstack },
-    { "===",      bstackhoriz },
-    { "HHH",      grid },
-    { "###",      nrowgrid },
-    //{ "---",      horizgrid },
-    //{ ":::",      gaplessgrid },
-    { "|M|",      centeredmaster },
-    { ">M>",      centeredfloatingmaster },
-    { "><>",      NULL },    /* no layout function means floating behavior */
-    { NULL,       NULL },
-};
-
-/* key definitions */
-#define MODKEY Mod4Mask        /* MODKEY to SuperKey */
-#define MOD2KEY Mod1Mask    /* MOD2KEY to altkey    */
-
-#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_history", "-h", "16", "-b", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_darkmagenta, "-sf", col_gray4, NULL };
-/*    static const char *termcmd[]  = { "alacritty", "-o", "cursor.style.blinking=Always", NULL };    */
-static const char *termcmd[]  = { "kitty", NULL };
-static const char *ftermcmd[]  = { "kitty", "--class", "floating", NULL };
-static const char *webcmd[]  = { "firefox", NULL };
-static const char *filescmd[]  = { "alacritty", "-e", "ranger", NULL };
-static const char *gfilescmd[]  = { "pcmanfm-qt", "-n", NULL };
-static const char *bookscmd[] = { "openbook", "-nb", col_gray1, "-nf", col_gray3, "-sb", col_darkmagenta, "-sf", col_gray4, NULL };
-static const char *spotifycmd[]  = { "spotify", NULL };
-static const char *virtualboxcmd[]  = { "virtualbox", NULL };
-static const char *calccmd[]  = { "gnome-calculator", NULL };
-static const char *lutriscmd[]  = { "lutris", NULL };
-static const char *switchkblayout[]  = { "switchkblayout", NULL };
-
-
-/* commands spawned when clicking statusbar, the mouse button pressed is exported as BUTTON */
-static char *statuscmds[] = { "notify-send -r Mouse$BUTTON" };
-static char *statuscmd[] = { "/bin/sh", "-c", NULL, NULL };
-
-static Key keys[] = {
-    /* modifier                     key        function        argument */
-    { MODKEY,                       XK_d,      spawn,          {.v = dmenucmd } },
-    { MODKEY,                        XK_Return, spawn,          {.v = termcmd } },
-    { MODKEY|ShiftMask,                XK_Return, spawn,          {.v = ftermcmd } },
-    { MODKEY,                        XK_w,       spawn,          {.v = webcmd } },
-    { MODKEY,                        XK_e,       spawn,          {.v = gfilescmd } },
-    { MODKEY,                        XK_z,       spawn,          {.v = lutriscmd } },
-    { MODKEY|ShiftMask,                XK_e,       spawn,          {.v = filescmd } },
-    { MODKEY,                        XK_v,       spawn,          {.v = virtualboxcmd } },
-    { MODKEY,                        XK_b,       spawn,          {.v = bookscmd } },
-    { MODKEY,                        XK_s,       spawn,          {.v = spotifycmd } },
-    { MODKEY,                        XK_c,       spawn,          {.v = calccmd } },
-    { MODKEY|MOD2KEY,                XK_l,       spawn,          {.v = switchkblayout } },
-    { MODKEY|ShiftMask,             XK_b,      togglebar,      {0} },
-    { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
-    { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_i,      incnmaster,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_p,      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|ShiftMask,             XK_j,      zoom,           {0} },
-    { MODKEY,                       XK_Tab,    view,           {0} },
-    { MODKEY,                        XK_q,      killclient,     {0} },
-    { MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
-    { MODKEY|ShiftMask,             XK_t,      setlayout,      {.v = &layouts[2]} },
-    { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[1]} },
-    { MODKEY|ShiftMask,             XK_m,      setlayout,      {.v = &layouts[9]} },
-    { MODKEY,                       XK_y,      setlayout,      {.v = &layouts[3]} },
-    { MODKEY|ShiftMask,             XK_y,      setlayout,      {.v = &layouts[4]} },
-    { MODKEY,                       XK_u,      setlayout,      {.v = &layouts[5]} },
-    { MODKEY|ShiftMask,             XK_u,      setlayout,      {.v = &layouts[6]} },
-    { MODKEY,                       XK_g,      setlayout,      {.v = &layouts[7]} },
-    { MODKEY|ShiftMask,             XK_g,      setlayout,      {.v = &layouts[8]} },
-    { MODKEY,                       XK_i,      setlayout,      {.v = &layouts[10]} },
-    { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[11]} },
-    { 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 } },
-    { MODKEY|ShiftMask,                XK_equal,  incrgaps,       {.i = +1 } },
-    { MODKEY,                        XK_minus,  incrgaps,       {.i = -1 } },
-    { MODKEY|MOD2KEY,                XK_i,      incrigaps,      {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,        XK_i,      incrigaps,      {.i = -1 } },
-    { MODKEY|MOD2KEY,                XK_o,      incrogaps,      {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,        XK_o,      incrogaps,      {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_6,      incrihgaps,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_6,      incrihgaps,     {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_7,      incrivgaps,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_7,      incrivgaps,     {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_8,      incrohgaps,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_8,      incrohgaps,     {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_9,      incrovgaps,     {.i = +1 } },
-    { MODKEY|MOD2KEY|ShiftMask,     XK_9,      incrovgaps,     {.i = -1 } },
-    { MODKEY|MOD2KEY,               XK_0,      togglegaps,     {0} },
-    { MODKEY,                        XK_equal,  defaultgaps,    {0} },
-    TAGKEYS(                        XK_1,                      0)
-    TAGKEYS(                        XK_2,                      1)
-    TAGKEYS(                        XK_3,                      2)
-    TAGKEYS(                        XK_4,                      3)
-    TAGKEYS(                        XK_5,                      4)
-    TAGKEYS(                        XK_6,                      5)
-    TAGKEYS(                        XK_7,                      6)
-    TAGKEYS(                        XK_8,                      7)
-    TAGKEYS(                        XK_9,                      8)
-    TAGKEYS(                        XK_0,                      9)
-    { MODKEY|ShiftMask,             XK_q,      quit,           {0} },
-};
-
-/* 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,        spawn,          {.v = statuscmd } },
-    { ClkStatusText,        0,              Button2,        spawn,          {.v = statuscmd } },
-    { ClkStatusText,        0,              Button3,        spawn,          {.v = statuscmd } },
-    { 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} },
-    { ClkStatusText,        0,              Button1,        spawn,          {.v = statuscmd } },
-    { ClkStatusText,        0,              Button2,        spawn,          {.v = statuscmd } },
-    { ClkStatusText,        0,              Button3,        spawn,          {.v = statuscmd } },
-};
diff --git a/.config/dwm/config.mk b/.config/dwm/config.mk
@@ -1,38 +0,0 @@
-# dwm version
-VERSION = 6.2
-
-# Customize below to fit your system
-
-# paths
-PREFIX = /usr/local
-MANPREFIX = ${PREFIX}/share/man
-
-X11INC = /usr/X11R6/include
-X11LIB = /usr/X11R6/lib
-
-# Xinerama, comment if you don't want it
-XINERAMALIBS  = -lXinerama
-XINERAMAFLAGS = -DXINERAMA
-
-# freetype
-FREETYPELIBS = -lfontconfig -lXft
-FREETYPEINC = /usr/include/freetype2
-# OpenBSD (uncomment)
-#FREETYPEINC = ${X11INC}/freetype2
-
-# includes and libs
-INCS = -I${X11INC} -I${FREETYPEINC}
-LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
-
-# flags
-CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
-#CFLAGS   = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
-CFLAGS   = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
-LDFLAGS  = ${LIBS}
-
-# Solaris
-#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
-#LDFLAGS = ${LIBS}
-
-# compiler and linker
-CC = cc
diff --git a/.config/dwm/dmenu_run_history b/.config/dwm/dmenu_run_history
@@ -1,50 +0,0 @@
-#!/bin/sh
-
-cachedir=${XDG_CACHE_HOME:-"$HOME/.cache"}
-if [ -d "$cachedir" ]; then
-    cache=$cachedir/dmenu_run
-    historyfile=$cachedir/dmenu_history
-else            # if no xdg dir, fall back to dotfiles in ~
-    cache=$HOME/.dmenu_cache
-    historyfile=$HOME/.dmenu_history
-fi
-
-IFS=:
-if stest -dqr -n "$cache" $PATH; then
-    stest -flx $PATH | sort -u > "$cache"
-fi
-unset IFS
-
-awk -v histfile=$historyfile '
-    BEGIN {
-        while( (getline < histfile) > 0 ) {
-            sub("^[0-9]+\t","")
-            print
-            x[$0]=1
-        }
-    } !x[$0]++ ' "$cache" \
-    | dmenu "$@" \
-    | awk -v histfile=$historyfile '
-        BEGIN {
-            FS=OFS="\t"
-            while ( (getline < histfile) > 0 ) {
-                count=$1
-                sub("^[0-9]+\t","")
-                fname=$0
-                history[fname]=count
-            }
-            close(histfile)
-        }
-
-        {
-            history[$0]++
-            print
-        }
-
-        END {
-            if(!NR) exit
-            for (f in history)
-                print history[f],f | "sort -t '\t' -k1rn >" histfile
-        }
-    ' \
-    | while read cmd; do ${SHELL:-"/bin/sh"} -c "$cmd" & done
diff --git a/.config/dwm/drw.c b/.config/dwm/drw.c
@@ -1,438 +0,0 @@
-/* See LICENSE file for copyright and license details. */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <X11/Xlib.h>
-#include <X11/Xft/Xft.h>
-
-#include "drw.h"
-#include "util.h"
-
-#define UTF_INVALID 0xFFFD
-#define UTF_SIZ     4
-
-static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80,    0, 0xC0, 0xE0, 0xF0};
-static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
-static const long utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  0x10000};
-static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
-
-static long
-utf8decodebyte(const char c, size_t *i)
-{
-    for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
-        if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
-            return (unsigned char)c & ~utfmask[*i];
-    return 0;
-}
-
-static size_t
-utf8validate(long *u, size_t i)
-{
-    if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
-        *u = UTF_INVALID;
-    for (i = 1; *u > utfmax[i]; ++i)
-        ;
-    return i;
-}
-
-static size_t
-utf8decode(const char *c, long *u, size_t clen)
-{
-    size_t i, j, len, type;
-    long udecoded;
-
-    *u = UTF_INVALID;
-    if (!clen)
-        return 0;
-    udecoded = utf8decodebyte(c[0], &len);
-    if (!BETWEEN(len, 1, UTF_SIZ))
-        return 1;
-    for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
-        udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
-        if (type)
-            return j;
-    }
-    if (j < len)
-        return 0;
-    *u = udecoded;
-    utf8validate(u, len);
-
-    return len;
-}
-
-Drw *
-drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
-{
-    Drw *drw = ecalloc(1, sizeof(Drw));
-
-    drw->dpy = dpy;
-    drw->screen = screen;
-    drw->root = root;
-    drw->w = w;
-    drw->h = h;
-    drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
-    drw->gc = XCreateGC(dpy, root, 0, NULL);
-    XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
-
-    return drw;
-}
-
-void
-drw_resize(Drw *drw, unsigned int w, unsigned int h)
-{
-    if (!drw)
-        return;
-
-    drw->w = w;
-    drw->h = h;
-    if (drw->drawable)
-        XFreePixmap(drw->dpy, drw->drawable);
-    drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
-}
-
-void
-drw_free(Drw *drw)
-{
-    XFreePixmap(drw->dpy, drw->drawable);
-    XFreeGC(drw->dpy, drw->gc);
-    drw_fontset_free(drw->fonts);
-    free(drw);
-}
-
-/* This function is an implementation detail. Library users should use
- * drw_fontset_create instead.
- */
-static Fnt *
-xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
-{
-    Fnt *font;
-    XftFont *xfont = NULL;
-    FcPattern *pattern = NULL;
-
-    if (fontname) {
-        /* Using the pattern found at font->xfont->pattern does not yield the
-         * same substitution results as using the pattern returned by
-         * FcNameParse; using the latter results in the desired fallback
-         * behaviour whereas the former just results in missing-character
-         * rectangles being drawn, at least with some fonts. */
-        if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
-            fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
-            return NULL;
-        }
-        if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
-            fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname);
-            XftFontClose(drw->dpy, xfont);
-            return NULL;
-        }
-    } else if (fontpattern) {
-        if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
-            fprintf(stderr, "error, cannot load font from pattern.\n");
-            return NULL;
-        }
-    } else {
-        die("no font specified.");
-    }
-
-    /* Do not allow using color fonts. This is a workaround for a BadLength
-     * error from Xft with color glyphs. Modelled on the Xterm workaround. See
-     * https://bugzilla.redhat.com/show_bug.cgi?id=1498269
-     * https://lists.suckless.org/dev/1701/30932.html
-     * https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916349
-     * and lots more all over the internet.
-     */
-/*    FcBool iscol;
-    if(FcPatternGetBool(xfont->pattern, FC_COLOR, 0, &iscol) == FcResultMatch && iscol) {
-        XftFontClose(drw->dpy, xfont);
-        return NULL;
-    }
-*/
-    font = ecalloc(1, sizeof(Fnt));
-    font->xfont = xfont;
-    font->pattern = pattern;
-    font->h = xfont->ascent + xfont->descent;
-    font->dpy = drw->dpy;
-
-    return font;
-}
-
-static void
-xfont_free(Fnt *font)
-{
-    if (!font)
-        return;
-    if (font->pattern)
-        FcPatternDestroy(font->pattern);
-    XftFontClose(font->dpy, font->xfont);
-    free(font);
-}
-
-Fnt*
-drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
-{
-    Fnt *cur, *ret = NULL;
-    size_t i;
-
-    if (!drw || !fonts)
-        return NULL;
-
-    for (i = 1; i <= fontcount; i++) {
-        if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
-            cur->next = ret;
-            ret = cur;
-        }
-    }
-    return (drw->fonts = ret);
-}
-
-void
-drw_fontset_free(Fnt *font)
-{
-    if (font) {
-        drw_fontset_free(font->next);
-        xfont_free(font);
-    }
-}
-
-void
-drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
-{
-    if (!drw || !dest || !clrname)
-        return;
-
-    if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
-                           DefaultColormap(drw->dpy, drw->screen),
-                           clrname, dest))
-        die("error, cannot allocate color '%s'", clrname);
-
-    dest->pixel |= 0xff << 24;
-}
-
-/* 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)
-{
-    size_t i;
-    Clr *ret;
-
-    /* need at least two colors for a scheme */
-    if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
-        return NULL;
-
-    for (i = 0; i < clrcount; i++)
-        drw_clr_create(drw, &ret[i], clrnames[i]);
-    return ret;
-}
-
-void
-drw_setfontset(Drw *drw, Fnt *set)
-{
-    if (drw)
-        drw->fonts = set;
-}
-
-void
-drw_setscheme(Drw *drw, Clr *scm)
-{
-    if (drw)
-        drw->scheme = scm;
-}
-
-void
-drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert)
-{
-    if (!drw || !drw->scheme)
-        return;
-    XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel);
-    if (filled)
-        XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
-    else
-        XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
-}
-
-int
-drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
-{
-    char buf[1024];
-    int ty;
-    unsigned int ew;
-    XftDraw *d = NULL;
-    Fnt *usedfont, *curfont, *nextfont;
-    size_t i, len;
-    int utf8strlen, utf8charlen, render = x || y || w || h;
-    long utf8codepoint = 0;
-    const char *utf8str;
-    FcCharSet *fccharset;
-    FcPattern *fcpattern;
-    FcPattern *match;
-    XftResult result;
-    int charexists = 0;
-
-    if (!drw || (render && !drw->scheme) || !text || !drw->fonts)
-        return 0;
-
-    if (!render) {
-        w = ~w;
-    } else {
-        XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
-        XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
-        d = XftDrawCreate(drw->dpy, drw->drawable,
-                          DefaultVisual(drw->dpy, drw->screen),
-                          DefaultColormap(drw->dpy, drw->screen));
-        x += lpad;
-        w -= lpad;
-    }
-
-    usedfont = drw->fonts;
-    while (1) {
-        utf8strlen = 0;
-        utf8str = text;
-        nextfont = NULL;
-        while (*text) {
-            utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
-            for (curfont = drw->fonts; curfont; curfont = curfont->next) {
-                charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
-                if (charexists) {
-                    if (curfont == usedfont) {
-                        utf8strlen += utf8charlen;
-                        text += utf8charlen;
-                    } else {
-                        nextfont = curfont;
-                    }
-                    break;
-                }
-            }
-
-            if (!charexists || nextfont)
-                break;
-            else
-                charexists = 0;
-        }
-
-        if (utf8strlen) {
-            drw_font_getexts(usedfont, utf8str, utf8strlen, &ew, NULL);
-            /* shorten text if necessary */
-            for (len = MIN(utf8strlen, sizeof(buf) - 1); len && ew > w; len--)
-                drw_font_getexts(usedfont, utf8str, len, &ew, NULL);
-
-            if (len) {
-                memcpy(buf, utf8str, len);
-                buf[len] = '\0';
-                if (len < utf8strlen)
-                    for (i = len; i && i > len - 3; buf[--i] = '.')
-                        ; /* NOP */
-
-                if (render) {
-                    ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
-                    XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
-                                      usedfont->xfont, x, ty, (XftChar8 *)buf, len);
-                }
-                x += ew;
-                w -= ew;
-            }
-        }
-
-        if (!*text) {
-            break;
-        } else if (nextfont) {
-            charexists = 0;
-            usedfont = nextfont;
-        } else {
-            /* Regardless of whether or not a fallback font is found, the
-             * character must be drawn. */
-            charexists = 1;
-
-            fccharset = FcCharSetCreate();
-            FcCharSetAddChar(fccharset, utf8codepoint);
-
-            if (!drw->fonts->pattern) {
-                /* Refer to the comment in xfont_create for more information. */
-                die("the first font in the cache must be loaded from a font string.");
-            }
-
-            fcpattern = FcPatternDuplicate(drw->fonts->pattern);
-            FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
-            FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
-            FcPatternAddBool(fcpattern, FC_COLOR, FcFalse);
-
-            FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
-            FcDefaultSubstitute(fcpattern);
-            match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
-
-            FcCharSetDestroy(fccharset);
-            FcPatternDestroy(fcpattern);
-
-            if (match) {
-                usedfont = xfont_create(drw, NULL, match);
-                if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
-                    for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
-                        ; /* NOP */
-                    curfont->next = usedfont;
-                } else {
-                    xfont_free(usedfont);
-                    usedfont = drw->fonts;
-                }
-            }
-        }
-    }
-    if (d)
-        XftDrawDestroy(d);
-
-    return x + (render ? w : 0);
-}
-
-void
-drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
-{
-    if (!drw)
-        return;
-
-    XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
-    XSync(drw->dpy, False);
-}
-
-unsigned int
-drw_fontset_getwidth(Drw *drw, const char *text)
-{
-    if (!drw || !drw->fonts || !text)
-        return 0;
-    return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
-}
-
-void
-drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
-{
-    XGlyphInfo ext;
-
-    if (!font || !text)
-        return;
-
-    XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
-    if (w)
-        *w = ext.xOff;
-    if (h)
-        *h = font->h;
-}
-
-Cur *
-drw_cur_create(Drw *drw, int shape)
-{
-    Cur *cur;
-
-    if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
-        return NULL;
-
-    cur->cursor = XCreateFontCursor(drw->dpy, shape);
-
-    return cur;
-}
-
-void
-drw_cur_free(Drw *drw, Cur *cursor)
-{
-    if (!cursor)
-        return;
-
-    XFreeCursor(drw->dpy, cursor->cursor);
-    free(cursor);
-}
diff --git a/.config/dwm/drw.h b/.config/dwm/drw.h
@@ -1,57 +0,0 @@
-/* See LICENSE file for copyright and license details. */
-
-typedef struct {
-    Cursor cursor;
-} Cur;
-
-typedef struct Fnt {
-    Display *dpy;
-    unsigned int h;
-    XftFont *xfont;
-    FcPattern *pattern;
-    struct Fnt *next;
-} Fnt;
-
-enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
-typedef XftColor Clr;
-
-typedef struct {
-    unsigned int w, h;
-    Display *dpy;
-    int screen;
-    Window root;
-    Drawable drawable;
-    GC gc;
-    Clr *scheme;
-    Fnt *fonts;
-} Drw;
-
-/* Drawable abstraction */
-Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
-void drw_resize(Drw *drw, unsigned int w, unsigned int h);
-void drw_free(Drw *drw);
-
-/* Fnt abstraction */
-Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
-void drw_fontset_free(Fnt* set);
-unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
-void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
-
-/* 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);
-
-/* Cursor abstraction */
-Cur *drw_cur_create(Drw *drw, int shape);
-void drw_cur_free(Drw *drw, Cur *cursor);
-
-/* Drawing context manipulation */
-void drw_setfontset(Drw *drw, Fnt *set);
-void drw_setscheme(Drw *drw, Clr *scm);
-
-/* Drawing functions */
-void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
-int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
-
-/* Map functions */
-void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
diff --git a/.config/dwm/drw.o b/.config/dwm/drw.o
Binary files differ.
diff --git a/.config/dwm/dwm b/.config/dwm/dwm
Binary files differ.
diff --git a/.config/dwm/dwm.1 b/.config/dwm/dwm.1
@@ -1,199 +0,0 @@
-.TH DWM 1 dwm\-VERSION
-.SH NAME
-dwm \- dynamic window manager
-.SH SYNOPSIS
-.B dwm
-.RB [ \-v ]
-.SH DESCRIPTION
-dwm is a dynamic window manager for X. It manages windows in tiled, monocle
-and floating layouts. Either layout can be applied dynamically, optimising the
-environment for the application in use and the task performed.
-.P
-In tiled layouts windows are managed in a master and stacking area. The master
-area on the left contains one window by default, and the stacking area on the
-right contains all other windows. The number of master area windows can be
-adjusted from zero to an arbitrary number. In monocle layout all windows are
-maximised to the screen size. In floating layout windows can be resized and
-moved freely. Dialog windows are always managed floating, regardless of the
-layout applied.
-.P
-Windows are grouped by tags. Each window can be tagged with one or multiple
-tags. Selecting certain tags displays all windows with these tags.
-.P
-Each screen contains a small status bar which displays all available tags, the
-layout, the title of the focused window, and the text read from the root window
-name property, if the screen is focused. A floating window is indicated with an
-empty square and a maximised floating window is indicated with a filled square
-before the windows title.  The selected tags are indicated with a different
-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
-dwm draws a small border around windows to indicate the focus state.
-.P
-On start, dwm can start additional programs that may be specified in two special
-shell scripts (see the FILES section below), autostart_blocking.sh and
-autostart.sh.  The former is executed first and dwm will wait for its
-termination before starting.  The latter is executed in the background before
-dwm enters its handler loop.
-.P
-Either of these files may be omitted.
-.SH OPTIONS
-.TP
-.B \-v
-prints version information to stderr, then exits.
-.SH USAGE
-.SS Status bar
-.TP
-.B X root window name
-is read and displayed in the status text area. It can be set with the
-.BR xsetroot (1)
-command.
-.TP
-.B Button1
-click on a tag label to display all windows with that tag, click on the layout
-label toggles between tiled and floating layout.
-.TP
-.B Button3
-click on a tag label adds/removes all windows with that tag to/from the view.
-.TP
-.B Mod1\-Button1
-click on a tag label applies that tag to the focused window.
-.TP
-.B Mod1\-Button3
-click on a tag label adds/removes that tag to/from the focused window.
-.SS Keyboard commands
-.TP
-.B Mod1\-Shift\-Return
-Start
-.BR st(1).
-.TP
-.B Mod1\-p
-Spawn
-.BR dmenu(1)
-for launching other programs.
-.TP
-.B Mod1\-,
-Focus previous screen, if any.
-.TP
-.B Mod1\-.
-Focus next screen, if any.
-.TP
-.B Mod1\-Shift\-,
-Send focused window to previous screen, if any.
-.TP
-.B Mod1\-Shift\-.
-Send focused window to next screen, if any.
-.TP
-.B Mod1\-b
-Toggles bar on and off.
-.TP
-.B Mod1\-t
-Sets tiled layout.
-.TP
-.B Mod1\-f
-Sets floating layout.
-.TP
-.B Mod1\-m
-Sets monocle layout.
-.TP
-.B Mod1\-space
-Toggles between current and previous layout.
-.TP
-.B Mod1\-j
-Focus next window.
-.TP
-.B Mod1\-k
-Focus previous window.
-.TP
-.B Mod1\-i
-Increase number of windows in master area.
-.TP
-.B Mod1\-d
-Decrease number of windows in master area.
-.TP
-.B Mod1\-l
-Increase master area size.
-.TP
-.B Mod1\-h
-Decrease master area size.
-.TP
-.B Mod1\-Return
-Zooms/cycles focused window to/from master area (tiled layouts only).
-.TP
-.B Mod1\-Shift\-c
-Close focused window.
-.TP
-.B Mod1\-Shift\-space
-Toggle focused window between tiled and floating state.
-.TP
-.B Mod1\-Tab
-Toggles to the previously selected tags.
-.TP
-.B Mod1\-Shift\-[1..n]
-Apply nth tag to focused window.
-.TP
-.B Mod1\-Shift\-0
-Apply all tags to focused window.
-.TP
-.B Mod1\-Control\-Shift\-[1..n]
-Add/remove nth tag to/from focused window.
-.TP
-.B Mod1\-[1..n]
-View all windows with nth tag.
-.TP
-.B Mod1\-0
-View all windows with any tag.
-.TP
-.B Mod1\-Control\-[1..n]
-Add/remove all windows with nth tag to/from the view.
-.TP
-.B Mod1\-Shift\-q
-Quit dwm.
-.SS Mouse commands
-.TP
-.B Mod1\-Button1
-Move focused window while dragging. Tiled windows will be toggled to the floating state.
-.TP
-.B Mod1\-Button2
-Toggles focused window between floating and tiled state.
-.TP
-.B Mod1\-Button3
-Resize focused window while dragging. Tiled windows will be toggled to the floating state.
-.SH FILES
-The files containing programs to be started along with dwm are searched for in
-the following directories:
-.IP "1. $XDG_DATA_HOME/dwm"
-.IP "2. $HOME/.local/share/dwm"
-.IP "3. $HOME/.dwm"
-.P
-The first existing directory is scanned for any of the autostart files below.
-.TP 15
-autostart.sh
-This file is started as a shell background process before dwm enters its handler
-loop.
-.TP 15
-autostart_blocking.sh
-This file is started before any autostart.sh; dwm waits for its termination.
-.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 SEE ALSO
-.BR dmenu (1),
-.BR st (1)
-.SH ISSUES
-Java applications which use the XToolkit/XAWT backend may draw grey windows
-only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
-JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
-are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
-environment variable
-.BR AWT_TOOLKIT=MToolkit
-(to use the older Motif backend instead) or running
-.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
-or
-.B wmname LG3D
-(to pretend that a non-reparenting window manager is running that the
-XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
-.BR _JAVA_AWT_WM_NONREPARENTING=1 .
-.SH BUGS
-Send all bug reports with a patch to hackers@suckless.org.
diff --git a/.config/dwm/dwm.c b/.config/dwm/dwm.c
@@ -1,2851 +0,0 @@
-/* See LICENSE file for copyright and license details.
- *
- * dynamic window manager is designed like any other X client as well. It is
- * driven through handling X events. In contrast to other X clients, a window
- * manager selects for SubstructureRedirectMask on the root window, to receive
- * events about window (dis-)appearance. Only one X connection at a time is
- * allowed to select for this event mask.
- *
- * The event handlers of dwm are organized in an array which is accessed
- * whenever a new event has been fetched. This allows event dispatching
- * in O(1) time.
- *
- * Each child of the root window is called a client, except windows which have
- * set the override_redirect flag. Clients are organized in a linked client
- * list on each monitor, the focus history is remembered through a stack list
- * on each monitor. Each client contains a bit array to indicate the tags of a
- * client.
- *
- * Keys and tagging rules are organized as arrays and defined in config.h.
- *
- * To understand everything else, start reading main().
- */
-#include <errno.h>
-#include <locale.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <X11/cursorfont.h>
-#include <X11/keysym.h>
-#include <X11/Xatom.h>
-#include <X11/Xlib.h>
-#include <X11/Xproto.h>
-#include <X11/Xutil.h>
-#ifdef XINERAMA
-#include <X11/extensions/Xinerama.h>
-#endif /* XINERAMA */
-#include <X11/Xft/Xft.h>
-
-#include "drw.h"
-#include "util.h"
-
-/* macros */
-#define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
-#define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
-#define INTERSECT(x,y,w,h,m)    (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
-                               * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
-#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 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, SchemeTitle }; /* 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 */
-
-typedef union {
-    int i;
-    unsigned int ui;
-    float f;
-    const void *v;
-} Arg;
-
-typedef struct {
-    unsigned int click;
-    unsigned int mask;
-    unsigned int button;
-    void (*func)(const Arg *arg);
-    const Arg arg;
-} Button;
-
-typedef struct Monitor Monitor;
-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 bw, oldbw;
-    unsigned int tags;
-    int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
-    int floatborderpx;
-    Client *next;
-    Client *snext;
-    Monitor *mon;
-    Window win;
-};
-
-typedef struct {
-    unsigned int mod;
-    KeySym keysym;
-    void (*func)(const Arg *);
-    const Arg arg;
-} Key;
-
-typedef struct {
-    const char *symbol;
-    void (*arrange)(Monitor *);
-} Layout;
-
-typedef struct Pertag Pertag;
-struct Monitor {
-    char ltsymbol[16];
-    float mfact;
-    int nmaster;
-    int num;
-    int by;               /* bar geometry */
-    int mx, my, mw, mh;   /* screen size */
-    int wx, wy, ww, wh;   /* window area  */
-    int gappih;           /* horizontal gap between windows */
-    int gappiv;           /* vertical gap between windows */
-    int gappoh;           /* horizontal outer gaps */
-    int gappov;           /* vertical outer gaps */
-    unsigned int seltags;
-    unsigned int sellt;
-    unsigned int tagset[2];
-    int showbar;
-    int topbar;
-    Client *clients;
-    Client *sel;
-    Client *stack;
-    Monitor *next;
-    Window barwin;
-    const Layout *lt[2];
-    Pertag *pertag;
-};
-
-typedef struct {
-    const char *class;
-    const char *instance;
-    const char *title;
-    unsigned int tags;
-    int isfloating;
-    int monitor;
-    int floatx, floaty, floatw, floath;
-    int floatborderpx;
-} 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);
-static void arrange(Monitor *m);
-static void arrangemon(Monitor *m);
-static void attach(Client *c);
-static void attachstack(Client *c);
-static void buttonpress(XEvent *e);
-static void checkotherwm(void);
-static void cleanup(void);
-static void cleanupmon(Monitor *mon);
-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);
-static void detachstack(Client *c);
-static Monitor *dirtomon(int dir);
-static void drawbar(Monitor *m);
-static void drawbars(void);
-static void enternotify(XEvent *e);
-static void expose(XEvent *e);
-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);
-static void incnmaster(const Arg *arg);
-static void keypress(XEvent *e);
-static void killclient(const Arg *arg);
-static void manage(Window w, XWindowAttributes *wa);
-static void mappingnotify(XEvent *e);
-static void maprequest(XEvent *e);
-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 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 runautostart(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);
-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);
-static void showhide(Client *c);
-static void sigchld(int unused);
-/*    static void sigdwmblocks(const Arg *arg);    */
-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 togglebar(const Arg *arg);
-static void togglefloating(const Arg *arg);
-static void toggletag(const Arg *arg);
-static void toggleview(const Arg *arg);
-static void unfocus(Client *c, int setfocus);
-static void unmanage(Client *c, int destroyed);
-static void unmapnotify(XEvent *e);
-static void updatebarpos(Monitor *m);
-static void updatebars(void);
-static void updateclientlist(void);
-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 Client *wintosystrayicon(Window w);
-static Monitor *wintomon(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 autostartblocksh[] = "autostart_blocking.sh";
-static const char autostartsh[] = "autostart.sh";
-static const char broken[] = "broken";
-static const char dwmdir[] = "dwm";
-static const char localshare[] = ".local/share";
-static char stext[256];
-static int statuscmdn;
-static char lastbutton[] = "-";
-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 */
-static int lrpad;            /* sum of left and right padding for text */
-static int (*xerrorxlib)(Display *, XErrorEvent *);
-static unsigned int numlockmask = 0;
-static void (*handler[LASTEvent]) (XEvent *) = {
-    [ButtonPress] = buttonpress,
-    [ClientMessage] = clientmessage,
-    [ConfigureRequest] = configurerequest,
-    [ConfigureNotify] = configurenotify,
-    [DestroyNotify] = destroynotify,
-    [EnterNotify] = enternotify,
-    [Expose] = expose,
-    [FocusIn] = focusin,
-    [KeyPress] = keypress,
-    [MappingNotify] = mappingnotify,
-    [MapRequest] = maprequest,
-    [MotionNotify] = motionnotify,
-    [PropertyNotify] = propertynotify,
-    [ResizeRequest] = resizerequest,
-    [UnmapNotify] = unmapnotify
-};
-static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast];
-static int running = 1;
-static Cur *cursor[CurLast];
-static Clr **scheme;
-static Display *dpy;
-static Drw *drw;
-static Monitor *mons, *selmon;
-static Window root, wmcheckwin;
-
-/* configuration, allows nested code to access above variables */
-#include "config.h"
-
-struct Pertag {
-    unsigned int curtag, prevtag; /* current and previous tag */
-    int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
-    float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
-    unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
-    const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes  */
-    int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
-};
-
-/* compile-time check if all tags fit into an unsigned int bit array. */
-struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
-
-/* function implementations */
-void
-applyrules(Client *c)
-{
-    const char *class, *instance;
-    unsigned int i;
-    const Rule *r;
-    Monitor *m;
-    XClassHint ch = { NULL, NULL };
-
-    /* rule matching */
-    c->isfloating = 0;
-    c->tags = 0;
-    XGetClassHint(dpy, c->win, &ch);
-    class    = ch.res_class ? ch.res_class : broken;
-    instance = ch.res_name  ? ch.res_name  : broken;
-
-    for (i = 0; i < LENGTH(rules); i++) {
-        r = &rules[i];
-        if ((!r->title || strstr(c->name, r->title))
-        && (!r->class || strstr(class, r->class))
-        && (!r->instance || strstr(instance, r->instance)))
-        {
-            c->isfloating = r->isfloating;
-            c->tags |= r->tags;
-            c->floatborderpx = r->floatborderpx;
-            if (r->isfloating) {
-                c->x = r->floatx;
-                c->y = r->floaty;
-                c->w = r->floatw;
-                c->h = r->floath;
-            }
-            for (m = mons; m && m->num != r->monitor; m = m->next);
-            if (m)
-                c->mon = m;
-        }
-    }
-    if (ch.res_class)
-        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];
-}
-
-int
-applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact)
-{
-    int baseismin;
-    Monitor *m = c->mon;
-
-    /* set minimum possible */
-    *w = MAX(1, *w);
-    *h = MAX(1, *h);
-    if (interact) {
-        if (*x > sw)
-            *x = sw - WIDTH(c);
-        if (*y > sh)
-            *y = sh - HEIGHT(c);
-        if (*x + *w + 2 * c->bw < 0)
-            *x = 0;
-        if (*y + *h + 2 * c->bw < 0)
-            *y = 0;
-    } else {
-        if (*x >= m->wx + m->ww)
-            *x = m->wx + m->ww - WIDTH(c);
-        if (*y >= m->wy + m->wh)
-            *y = m->wy + m->wh - HEIGHT(c);
-        if (*x + *w + 2 * c->bw <= m->wx)
-            *x = m->wx;
-        if (*y + *h + 2 * c->bw <= m->wy)
-            *y = m->wy;
-    }
-    if (*h < bh)
-        *h = bh;
-    if (*w < bh)
-        *w = bh;
-    if (resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) {
-        /* see last two sentences in ICCCM 4.1.2.3 */
-        baseismin = c->basew == c->minw && c->baseh == c->minh;
-        if (!baseismin) { /* temporarily remove base dimensions */
-            *w -= c->basew;
-            *h -= c->baseh;
-        }
-        /* adjust for aspect limits */
-        if (c->mina > 0 && c->maxa > 0) {
-            if (c->maxa < (float)*w / *h)
-                *w = *h * c->maxa + 0.5;
-            else if (c->mina < (float)*h / *w)
-                *h = *w * c->mina + 0.5;
-        }
-        if (baseismin) { /* increment calculation requires this */
-            *w -= c->basew;
-            *h -= c->baseh;
-        }
-        /* adjust for increment value */
-        if (c->incw)
-            *w -= *w % c->incw;
-        if (c->inch)
-            *h -= *h % c->inch;
-        /* restore base dimensions */
-        *w = MAX(*w + c->basew, c->minw);
-        *h = MAX(*h + c->baseh, c->minh);
-        if (c->maxw)
-            *w = MIN(*w, c->maxw);
-        if (c->maxh)
-            *h = MIN(*h, c->maxh);
-    }
-    return *x != c->x || *y != c->y || *w != c->w || *h != c->h;
-}
-
-void
-arrange(Monitor *m)
-{
-    if (m)
-        showhide(m->stack);
-    else for (m = mons; m; m = m->next)
-        showhide(m->stack);
-    if (m) {
-        arrangemon(m);
-        restack(m);
-    } else for (m = mons; m; m = m->next)
-        arrangemon(m);
-}
-
-void
-arrangemon(Monitor *m)
-{
-    strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
-    if (m->lt[m->sellt]->arrange)
-        m->lt[m->sellt]->arrange(m);
-}
-
-void
-attach(Client *c)
-{
-    c->next = c->mon->clients;
-    c->mon->clients = c;
-}
-
-void
-attachstack(Client *c)
-{
-    c->snext = c->mon->stack;
-    c->mon->stack = c;
-}
-
-void
-buttonpress(XEvent *e)
-{
-    unsigned int i, x, click;
-    Arg arg = {0};
-    Client *c;
-    Monitor *m;
-    XButtonPressedEvent *ev = &e->xbutton;
-    *lastbutton = '0' + ev->button;
-
-    click = ClkRootWin;
-    /* focus monitor if necessary */
-    if ((m = wintomon(ev->window)) && m != selmon) {
-        unfocus(selmon->sel, 1);
-        selmon = m;
-        focus(NULL);
-    }
-    if (ev->window == selmon->barwin) {
-        i = x = 0;
-        do
-            x += TEXTW(tags[i]);
-        while (ev->x >= x && ++i < LENGTH(tags));
-        if (i < LENGTH(tags)) {
-            click = ClkTagBar;
-            arg.ui = 1 << i;
-        } else if (ev->x < x + blw)
-            click = ClkLtSymbol;
-//        else if (ev->x > selmon->ww - (int)TEXTW(stext))
-        else if (ev->x < selmon->ww - (int)TEXTW(stext) - getsystraywidth()) {
-//        else if (ev->x > (x = selmon->ww - TEXTW(stext) + lrpad)) {
-//        else if (ev->x > (x = selmon->ww - TEXTW(stext) + lrpad - getsystraywidth())) {
-            click = ClkStatusText;
-//        else
-
-            char *text = rawstext;
-            int i = -1;
-            char ch;
-            statuscmdn = 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;
-                    if (ch <= LENGTH(statuscmds)) statuscmdn = ch - 1;
-                }
-            }
-        } else
-            click = ClkWinTitle;
-    } else if ((c = wintoclient(ev->window))) {
-        focus(c);
-        restack(selmon);
-        XAllowEvents(dpy, ReplayPointer, CurrentTime);
-        click = ClkClientWin;
-    }
-    for (i = 0; i < LENGTH(buttons); i++)
-        if (click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
-        && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
-            buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
-}
-
-void
-checkotherwm(void)
-{
-    xerrorxlib = XSetErrorHandler(xerrorstart);
-    /* this causes an error if some other window manager is running */
-    XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask);
-    XSync(dpy, False);
-    XSetErrorHandler(xerror);
-    XSync(dpy, False);
-}
-
-void
-cleanup(void)
-{
-    Arg a = {.ui = ~0};
-    Layout foo = { "", NULL };
-    Monitor *m;
-    size_t i;
-
-    view(&a);
-    selmon->lt[selmon->sellt] = &foo;
-    for (m = mons; m; m = m->next)
-        while (m->stack)
-            unmanage(m->stack, 0);
-    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++)
-        free(scheme[i]);
-    XDestroyWindow(dpy, wmcheckwin);
-    drw_free(drw);
-    XSync(dpy, False);
-    XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
-    XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
-}
-
-void
-cleanupmon(Monitor *mon)
-{
-    Monitor *m;
-
-    if (mon == mons)
-        mons = mons->next;
-    else {
-        for (m = mons; m && m->next != mon; m = m->next);
-        m->next = mon->next;
-    }
-    XUnmapWindow(dpy, mon->barwin);
-    XDestroyWindow(dpy, mon->barwin);
-    free(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]) {
-        if (cme->data.l[1] == netatom[NetWMFullscreen]
-        || cme->data.l[2] == netatom[NetWMFullscreen])
-            setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD    */
-                || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen)));
-    } else if (cme->message_type == netatom[NetActiveWindow]) {
-        if (c != selmon->sel && !c->isurgent)
-            seturgent(c, 1);
-    }
-}
-
-void
-configure(Client *c)
-{
-    XConfigureEvent ce;
-
-    ce.type = ConfigureNotify;
-    ce.display = dpy;
-    ce.event = c->win;
-    ce.window = c->win;
-    ce.x = c->x;
-    ce.y = c->y;
-    ce.width = c->w;
-    ce.height = c->h;
-    ce.border_width = c->bw;
-    ce.above = None;
-    ce.override_redirect = False;
-    XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
-}
-
-void
-configurenotify(XEvent *e)
-{
-    Monitor *m;
-    Client *c;
-    XConfigureEvent *ev = &e->xconfigure;
-    int dirty;
-
-    /* TODO: updategeom handling sucks, needs to be simplified */
-    if (ev->window == root) {
-        dirty = (sw != ev->width || sh != ev->height);
-        sw = ev->width;
-        sh = ev->height;
-        if (updategeom() || dirty) {
-            drw_resize(drw, sw, bh);
-            updatebars();
-            for (m = mons; m; m = m->next) {
-                for (c = m->clients; c; c = c->next)
-                    if (c->isfullscreen)
-                        resizeclient(c, m->mx, m->my, m->mw, m->mh);
-                resizebarwin(m);
-            }
-            focus(NULL);
-            arrange(NULL);
-        }
-    }
-}
-
-void
-configurerequest(XEvent *e)
-{
-    Client *c;
-    Monitor *m;
-    XConfigureRequestEvent *ev = &e->xconfigurerequest;
-    XWindowChanges wc;
-
-    if ((c = wintoclient(ev->window))) {
-        if (ev->value_mask & CWBorderWidth)
-            c->bw = ev->border_width;
-        else if (c->isfloating || !selmon->lt[selmon->sellt]->arrange) {
-            m = c->mon;
-            if (ev->value_mask & CWX) {
-                c->oldx = c->x;
-                c->x = m->mx + ev->x;
-            }
-            if (ev->value_mask & CWY) {
-                c->oldy = c->y;
-                c->y = m->my + ev->y;
-            }
-            if (ev->value_mask & CWWidth) {
-                c->oldw = c->w;
-                c->w = ev->width;
-            }
-            if (ev->value_mask & CWHeight) {
-                c->oldh = c->h;
-                c->h = ev->height;
-            }
-            if ((c->x + c->w) > m->mx + m->mw && c->isfloating)
-                c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */
-            if ((c->y + c->h) > m->my + m->mh && c->isfloating)
-                c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */
-            if ((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight)))
-                configure(c);
-            if (ISVISIBLE(c))
-                XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
-        } else
-            configure(c);
-    } else {
-        wc.x = ev->x;
-        wc.y = ev->y;
-        wc.width = ev->width;
-        wc.height = ev->height;
-        wc.border_width = ev->border_width;
-        wc.sibling = ev->above;
-        wc.stack_mode = ev->detail;
-        XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
-    }
-    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)
-{
-    Monitor *m;
-    unsigned int i;
-
-    m = ecalloc(1, sizeof(Monitor));
-    m->tagset[0] = m->tagset[1] = 1;
-    m->mfact = mfact;
-    m->nmaster = nmaster;
-    m->showbar = showbar;
-    m->topbar = topbar;
-    m->gappih = gappih;
-    m->gappiv = gappiv;
-    m->gappoh = gappoh;
-    m->gappov = gappov;
-    m->lt[0] = &layouts[0];
-    m->lt[1] = &layouts[1 % LENGTH(layouts)];
-    strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-    m->pertag = ecalloc(1, sizeof(Pertag));
-    m->pertag->curtag = m->pertag->prevtag = 1;
-
-    for (i = 0; i <= LENGTH(tags); i++) {
-        m->pertag->nmasters[i] = m->nmaster;
-        m->pertag->mfacts[i] = m->mfact;
-
-        m->pertag->ltidxs[i][0] = m->lt[0];
-        m->pertag->ltidxs[i][1] = m->lt[1];
-        m->pertag->sellts[i] = m->sellt;
-
-        m->pertag->showbars[i] = m->showbar;
-    }
-
-    return m;
-}
-
-void
-destroynotify(XEvent *e)
-{
-    Client *c;
-    XDestroyWindowEvent *ev = &e->xdestroywindow;
-
-    if ((c = wintoclient(ev->window)))
-        unmanage(c, 1);
-    else if ((c = wintosystrayicon(ev->window))) {
-        removesystrayicon(c);
-        resizebarwin(selmon);
-        updatesystray();
-    }
-}
-
-void
-detach(Client *c)
-{
-    Client **tc;
-
-    for (tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next);
-    *tc = c->next;
-}
-
-void
-detachstack(Client *c)
-{
-    Client **tc, *t;
-
-    for (tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext);
-    *tc = c->snext;
-
-    if (c == c->mon->sel) {
-        for (t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext);
-        c->mon->sel = t;
-    }
-}
-
-Monitor *
-dirtomon(int dir)
-{
-    Monitor *m = NULL;
-
-    if (dir > 0) {
-        if (!(m = selmon->next))
-            m = mons;
-    } else if (selmon == mons)
-        for (m = mons; m->next; m = m->next);
-    else
-        for (m = mons; m->next != selmon; m = m->next);
-    return m;
-}
-
-void
-drawbar(Monitor *m)
-{
-    int x, w, tw = 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) && !systrayonleft)
-        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]);
-        tw = TEXTW(stext) - lrpad + 8; /* 2px padding */
-//        tw = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */
-        drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0);
-    }
-
-    resizebarwin(m);
-    for (c = m->clients; c; c = c->next) {
-        occ |= c->tags;
-        if (c->isurgent)
-            urg |= c->tags;
-    }
-    x = 0;
-    for (i = 0; i < LENGTH(tags); i++) {
-        w = TEXTW(tags[i]);
-        drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
-        drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
-        if (occ & 1 << i)
-            drw_rect(drw, x + boxs, boxs, boxw, boxw,
-                m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
-                urg & 1 << i);
-        x += w;
-    }
-    w = blw = TEXTW(m->ltsymbol);
-    drw_setscheme(drw, scheme[SchemeNorm]);
-    x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
-
-    if ((w = m->ww - tw - stw - x) > bh) {
-        if (m->sel) {
-            drw_setscheme(drw, scheme[m == selmon ? SchemeTitle : SchemeNorm]);
-            drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
-            if (m->sel->isfloating)
-                drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
-        } else {
-            drw_setscheme(drw, scheme[SchemeNorm]);
-            drw_rect(drw, x, 0, w, bh, 1, 1);
-        }
-    }
-    drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh);
-}
-
-void
-drawbars(void)
-{
-    Monitor *m;
-
-    for (m = mons; m; m = m->next)
-        drawbar(m);
-}
-
-void
-enternotify(XEvent *e)
-{
-    Client *c;
-    Monitor *m;
-    XCrossingEvent *ev = &e->xcrossing;
-
-    if ((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
-        return;
-    c = wintoclient(ev->window);
-    m = c ? c->mon : wintomon(ev->window);
-    if (m != selmon) {
-        unfocus(selmon->sel, 1);
-        selmon = m;
-    } else if (!c || c == selmon->sel)
-        return;
-    focus(c);
-}
-
-void
-expose(XEvent *e)
-{
-    Monitor *m;
-    XExposeEvent *ev = &e->xexpose;
-
-    if (ev->count == 0 && (m = wintomon(ev->window))) {
-        drawbar(m);
-        if (m == selmon)
-            updatesystray();
-    }
-}
-
-void
-focus(Client *c)
-{
-    if (!c || !ISVISIBLE(c))
-        for (c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
-    if (selmon->sel && selmon->sel != c)
-        unfocus(selmon->sel, 0);
-    if (c) {
-        if (c->mon != selmon)
-            selmon = c->mon;
-        if (c->isurgent)
-            seturgent(c, 0);
-        detachstack(c);
-        attachstack(c);
-        grabbuttons(c, 1);
-        XSetWindowBorder(dpy, c->win, scheme[SchemeSel][ColBorder].pixel);
-        setfocus(c);
-    } else {
-        XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
-        XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
-    }
-    selmon->sel = c;
-    drawbars();
-}
-
-/* there are some broken focus acquiring clients needing extra handling */
-void
-focusin(XEvent *e)
-{
-    XFocusChangeEvent *ev = &e->xfocus;
-
-    if (selmon->sel && ev->window != selmon->sel->win)
-        setfocus(selmon->sel);
-}
-
-void
-focusmon(const Arg *arg)
-{
-    Monitor *m;
-
-    if (!mons->next)
-        return;
-    if ((m = dirtomon(arg->i)) == selmon)
-        return;
-    unfocus(selmon->sel, 0);
-    selmon = m;
-    focus(NULL);
-}
-
-void
-focusstack(const Arg *arg)
-{
-    Client *c = NULL, *i;
-
-    if (!selmon->sel)
-        return;
-    if (arg->i > 0) {
-        for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next);
-        if (!c)
-            for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next);
-    } else {
-        for (i = selmon->clients; i != selmon->sel; i = i->next)
-            if (ISVISIBLE(i))
-                c = i;
-        if (!c)
-            for (; i; i = i->next)
-                if (ISVISIBLE(i))
-                    c = i;
-    }
-    if (c) {
-        focus(c);
-        restack(selmon);
-    }
-}
-
-Atom
-getatomprop(Client *c, Atom prop)
-{
-    int di;
-    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, 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;
-}
-
-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)
-{
-    int di;
-    unsigned int dui;
-    Window dummy;
-
-    return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui);
-}
-
-long
-getstate(Window w)
-{
-    int format;
-    long result = -1;
-    unsigned char *p = NULL;
-    unsigned long n, extra;
-    Atom real;
-
-    if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
-        &real, &format, &n, &extra, (unsigned char **)&p) != Success)
-        return -1;
-    if (n != 0)
-        result = *p;
-    XFree(p);
-    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)
-{
-    char **list = NULL;
-    int n;
-    XTextProperty name;
-
-    if (!text || size == 0)
-        return 0;
-    text[0] = '\0';
-    if (!XGetTextProperty(dpy, w, &name, atom) || !name.nitems)
-        return 0;
-    if (name.encoding == XA_STRING)
-        strncpy(text, (char *)name.value, size - 1);
-    else {
-        if (XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) {
-            strncpy(text, *list, size - 1);
-            XFreeStringList(list);
-        }
-    }
-    text[size - 1] = '\0';
-    XFree(name.value);
-    return 1;
-}
-
-void
-grabbuttons(Client *c, int focused)
-{
-    updatenumlockmask();
-    {
-        unsigned int i, j;
-        unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
-        XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
-        if (!focused)
-            XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
-                BUTTONMASK, GrabModeSync, GrabModeSync, None, None);
-        for (i = 0; i < LENGTH(buttons); i++)
-            if (buttons[i].click == ClkClientWin)
-                for (j = 0; j < LENGTH(modifiers); j++)
-                    XGrabButton(dpy, buttons[i].button,
-                        buttons[i].mask | modifiers[j],
-                        c->win, False, BUTTONMASK,
-                        GrabModeAsync, GrabModeSync, None, None);
-    }
-}
-
-void
-grabkeys(void)
-{
-    updatenumlockmask();
-    {
-        unsigned int i, j;
-        unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
-        KeyCode code;
-
-        XUngrabKey(dpy, AnyKey, AnyModifier, root);
-        for (i = 0; i < LENGTH(keys); i++)
-            if ((code = XKeysymToKeycode(dpy, keys[i].keysym)))
-                for (j = 0; j < LENGTH(modifiers); j++)
-                    XGrabKey(dpy, code, keys[i].mod | modifiers[j], root,
-                        True, GrabModeAsync, GrabModeAsync);
-    }
-}
-
-void
-incnmaster(const Arg *arg)
-{
-    unsigned int i;
-    selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
-    for(i=0; i<LENGTH(tags); ++i)
-        if(selmon->tagset[selmon->seltags] & 1<<i)
-            selmon->pertag->nmasters[i+1] = selmon->nmaster;
-    
-    if(selmon->pertag->curtag == 0)
-    {
-        selmon->pertag->nmasters[0] = selmon->nmaster;
-    }
-    arrange(selmon);
-}
-
-#ifdef XINERAMA
-static int
-isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info)
-{
-    while (n--)
-        if (unique[n].x_org == info->x_org && unique[n].y_org == info->y_org
-        && unique[n].width == info->width && unique[n].height == info->height)
-            return 0;
-    return 1;
-}
-#endif /* XINERAMA */
-
-void
-keypress(XEvent *e)
-{
-    unsigned int i;
-    KeySym keysym;
-    XKeyEvent *ev;
-
-    ev = &e->xkey;
-    keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
-    for (i = 0; i < LENGTH(keys); i++)
-        if (keysym == keys[i].keysym
-        && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)
-        && keys[i].func)
-            keys[i].func(&(keys[i].arg));
-}
-
-void
-killclient(const Arg *arg)
-{
-    if (!selmon->sel)
-        return;
-    if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) {
-        XGrabServer(dpy);
-        XSetErrorHandler(xerrordummy);
-        XSetCloseDownMode(dpy, DestroyAll);
-        XKillClient(dpy, selmon->sel->win);
-        XSync(dpy, False);
-        XSetErrorHandler(xerror);
-        XUngrabServer(dpy);
-    }
-}
-
-void
-manage(Window w, XWindowAttributes *wa)
-{
-    Client *c, *t = NULL;
-    Window trans = None;
-    XWindowChanges wc;
-
-    c = ecalloc(1, sizeof(Client));
-    c->win = w;
-    /* geometry */
-    c->x = c->oldx = wa->x;
-    c->y = c->oldy = wa->y;
-    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))) {
-        c->mon = t->mon;
-        c->tags = t->tags;
-    } else {
-        c->mon = selmon;
-        applyrules(c);
-    }
-
-    if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
-        c->x = c->mon->mx + c->mon->mw - WIDTH(c);
-    if (c->y + HEIGHT(c) > c->mon->my + c->mon->mh)
-        c->y = c->mon->my + c->mon->mh - HEIGHT(c);
-    c->x = MAX(c->x, c->mon->mx);
-    /* only fix client y-offset, if the client center might cover the bar */
-    c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx)
-        && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
-    c->bw = borderpx;
-
-    wc.border_width = c->bw;
-    XConfigureWindow(dpy, w, CWBorderWidth, &wc);
-    XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
-    configure(c); /* propagates border_width, if size doesn't change */
-    updatewindowtype(c);
-    updatesizehints(c);
-    updatewmhints(c);
-    c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2;
-    c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2;
-    XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
-    grabbuttons(c, 0);
-    if (!c->isfloating)
-        c->isfloating = c->oldstate = trans != None || c->isfixed;
-    if (c->isfloating)
-        XRaiseWindow(dpy, c->win);
-    attach(c);
-    attachstack(c);
-    XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
-        (unsigned char *) &(c->win), 1);
-    XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
-    setclientstate(c, NormalState);
-    if (c->mon == selmon)
-        unfocus(selmon->sel, 0);
-    c->mon->sel = c;
-    arrange(c->mon);
-    XMapWindow(dpy, c->win);
-    focus(NULL);
-}
-
-void
-mappingnotify(XEvent *e)
-{
-    XMappingEvent *ev = &e->xmapping;
-
-    XRefreshKeyboardMapping(ev);
-    if (ev->request == MappingKeyboard)
-        grabkeys();
-}
-
-void
-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;
-    if (wa.override_redirect)
-        return;
-    if (!wintoclient(ev->window))
-        manage(ev->window, &wa);
-}
-
-void
-monocle(Monitor *m)
-{
-    unsigned int n = 0;
-    Client *c;
-
-    for (c = m->clients; c; c = c->next)
-        if (ISVISIBLE(c))
-            n++;
-    if (n > 0) /* override layout symbol */
-        snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
-    for (c = nexttiled(m->clients); c; c = nexttiled(c->next))
-        resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, 0);
-}
-
-void
-motionnotify(XEvent *e)
-{
-    static Monitor *mon = NULL;
-    Monitor *m;
-    XMotionEvent *ev = &e->xmotion;
-
-    if (ev->window != root)
-        return;
-    if ((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) {
-        unfocus(selmon->sel, 1);
-        selmon = m;
-        focus(NULL);
-    }
-    mon = m;
-}
-
-void
-movemouse(const Arg *arg)
-{
-    int x, y, ocx, ocy, nx, ny;
-    Client *c;
-    Monitor *m;
-    XEvent ev;
-    Time lasttime = 0;
-
-    if (!(c = selmon->sel))
-        return;
-    if (c->isfullscreen) /* no support moving fullscreen windows by mouse */
-        return;
-    restack(selmon);
-    ocx = c->x;
-    ocy = c->y;
-    if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
-        None, cursor[CurMove]->cursor, CurrentTime) != GrabSuccess)
-        return;
-    if (!getrootptr(&x, &y))
-        return;
-    do {
-        XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
-        switch(ev.type) {
-        case ConfigureRequest:
-        case Expose:
-        case MapRequest:
-            handler[ev.type](&ev);
-            break;
-        case MotionNotify:
-            if ((ev.xmotion.time - lasttime) <= (1000 / 60))
-                continue;
-            lasttime = ev.xmotion.time;
-
-            nx = ocx + (ev.xmotion.x - x);
-            ny = ocy + (ev.xmotion.y - y);
-            if (abs(selmon->wx - nx) < snap)
-                nx = selmon->wx;
-            else if (abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap)
-                nx = selmon->wx + selmon->ww - WIDTH(c);
-            if (abs(selmon->wy - ny) < snap)
-                ny = selmon->wy;
-            else if (abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap)
-                ny = selmon->wy + selmon->wh - HEIGHT(c);
-            if (!c->isfloating && selmon->lt[selmon->sellt]->arrange
-            && (abs(nx - c->x) > snap || abs(ny - c->y) > snap))
-                togglefloating(NULL);
-            if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
-                resize(c, nx, ny, c->w, c->h, 1);
-            break;
-        }
-    } while (ev.type != ButtonRelease);
-    XUngrabPointer(dpy, CurrentTime);
-    if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) {
-        sendmon(c, m);
-        selmon = m;
-        focus(NULL);
-    }
-}
-
-Client *
-nexttiled(Client *c)
-{
-    for (; c && (c->isfloating || !ISVISIBLE(c)); c = c->next);
-    return c;
-}
-
-void
-pop(Client *c)
-{
-    detach(c);
-    attach(c);
-    focus(c);
-    arrange(c->mon);
-}
-
-void
-propertynotify(XEvent *e)
-{
-    Client *c;
-    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)
-        return; /* ignore */
-    else if ((c = wintoclient(ev->window))) {
-        switch(ev->atom) {
-        default: break;
-        case XA_WM_TRANSIENT_FOR:
-            if (!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) &&
-                (c->isfloating = (wintoclient(trans)) != NULL))
-                arrange(c->mon);
-            break;
-        case XA_WM_NORMAL_HINTS:
-            updatesizehints(c);
-            break;
-        case XA_WM_HINTS:
-            updatewmhints(c);
-            drawbars();
-            break;
-        }
-        if (ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
-            updatetitle(c);
-            if (c == c->mon->sel)
-                drawbar(c->mon);
-        }
-        if (ev->atom == netatom[NetWMWindowType])
-            updatewindowtype(c);
-    }
-}
-
-void
-quit(const Arg *arg)
-{
-    running = 0;
-}
-
-Monitor *
-recttomon(int x, int y, int w, int h)
-{
-    Monitor *m, *r = selmon;
-    int a, area = 0;
-
-    for (m = mons; m; m = m->next)
-        if ((a = INTERSECT(x, y, w, h, m)) > area) {
-            area = a;
-            r = m;
-        }
-    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)
-{
-    if (applysizehints(c, &x, &y, &w, &h, interact))
-        resizeclient(c, x, y, w, h);
-}
-
-void
-resizebarwin(Monitor *m) {
-    unsigned int w = m->ww;
-    if (showsystray && m == systraytomon(m) && !systrayonleft)
-        w -= getsystraywidth();
-    XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh);
-}
-
-void
-resizeclient(Client *c, int x, int y, int w, int h)
-{
-    XWindowChanges wc;
-
-    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;
-    if (c->isfloating)
-        wc.border_width = c->floatborderpx;
-    else
-        wc.border_width = c->bw;
-    XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
-    configure(c);
-    XSync(dpy, False);
-}
-
-void
-resizemouse(const Arg *arg)
-{
-    int ocx, ocy, nw, nh;
-    Client *c;
-    Monitor *m;
-    XEvent ev;
-    Time lasttime = 0;
-
-    if (!(c = selmon->sel))
-        return;
-    if (c->isfullscreen) /* no support resizing fullscreen windows by mouse */
-        return;
-    restack(selmon);
-    ocx = c->x;
-    ocy = c->y;
-    if (XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
-        None, cursor[CurResize]->cursor, CurrentTime) != GrabSuccess)
-        return;
-    XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
-    do {
-        XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev);
-        switch(ev.type) {
-        case ConfigureRequest:
-        case Expose:
-        case MapRequest:
-            handler[ev.type](&ev);
-            break;
-        case MotionNotify:
-            if ((ev.xmotion.time - lasttime) <= (1000 / 60))
-                continue;
-            lasttime = ev.xmotion.time;
-
-            nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1);
-            nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1);
-            if (c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww
-            && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh)
-            {
-                if (!c->isfloating && selmon->lt[selmon->sellt]->arrange
-                && (abs(nw - c->w) > snap || abs(nh - c->h) > snap))
-                    togglefloating(NULL);
-            }
-            if (!selmon->lt[selmon->sellt]->arrange || c->isfloating)
-                resize(c, c->x, c->y, nw, nh, 1);
-            break;
-        }
-    } while (ev.type != ButtonRelease);
-    XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1);
-    XUngrabPointer(dpy, CurrentTime);
-    while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
-    if ((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) {
-        sendmon(c, m);
-        selmon = m;
-        focus(NULL);
-    }
-}
-
-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)
-{
-    Client *c;
-    XEvent ev;
-    XWindowChanges wc;
-
-    drawbar(m);
-    if (!m->sel)
-        return;
-    if (m->sel->isfloating || !m->lt[m->sellt]->arrange)
-        XRaiseWindow(dpy, m->sel->win);
-    if (m->lt[m->sellt]->arrange) {
-        wc.stack_mode = Below;
-        wc.sibling = m->barwin;
-        for (c = m->stack; c; c = c->snext)
-            if (!c->isfloating && ISVISIBLE(c)) {
-                XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc);
-                wc.sibling = c->win;
-            }
-    }
-    XSync(dpy, False);
-    while (XCheckMaskEvent(dpy, EnterWindowMask, &ev));
-}
-
-void
-run(void)
-{
-    XEvent ev;
-    /* main event loop */
-    XSync(dpy, False);
-    while (running && !XNextEvent(dpy, &ev))
-        if (handler[ev.type])
-            handler[ev.type](&ev); /* call handler */
-}
-
-void
-runautostart(void)
-{
-    char *pathpfx;
-    char *path;
-    char *xdgdatahome;
-    char *home;
-    struct stat sb;
-
-    if ((home = getenv("HOME")) == NULL)
-        /* this is almost impossible */
-        return;
-
-    /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm,
-     * otherwise use ~/.local/share/dwm as autostart script directory
-     */
-    xdgdatahome = getenv("XDG_DATA_HOME");
-    if (xdgdatahome != NULL && *xdgdatahome != '\0') {
-        /* space for path segments, separators and nul */
-        pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2);
-
-        if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) {
-            free(pathpfx);
-            return;
-        }
-    } else {
-        /* space for path segments, separators and nul */
-        pathpfx = ecalloc(1, strlen(home) + strlen(localshare)
-                             + strlen(dwmdir) + 3);
-
-        if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) {
-            free(pathpfx);
-            return;
-        }
-    }
-
-    /* check if the autostart script directory exists */
-    if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) {
-        /* the XDG conformant path does not exist or is no directory
-         * so we try ~/.dwm instead
-         */
-        char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3);
-        if(pathpfx_new == NULL) {
-            free(pathpfx);
-            return;
-        }
-        pathpfx = pathpfx_new;
-
-        if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) {
-            free(pathpfx);
-            return;
-        }
-    }
-
-    /* try the blocking script first */
-    path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2);
-    if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) {
-        free(path);
-        free(pathpfx);
-    }
-
-    if (access(path, X_OK) == 0)
-        system(path);
-
-    /* now the non-blocking script */
-    if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) {
-        free(path);
-        free(pathpfx);
-    }
-
-    if (access(path, X_OK) == 0)
-        system(strcat(path, " &"));
-
-    free(pathpfx);
-    free(path);
-}
-
-void
-scan(void)
-{
-    unsigned int i, num;
-    Window d1, d2, *wins = NULL;
-    XWindowAttributes wa;
-
-    if (XQueryTree(dpy, root, &d1, &d2, &wins, &num)) {
-        for (i = 0; i < num; i++) {
-            if (!XGetWindowAttributes(dpy, wins[i], &wa)
-            || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
-                continue;
-            if (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
-                manage(wins[i], &wa);
-        }
-        for (i = 0; i < num; i++) { /* now the transients */
-            if (!XGetWindowAttributes(dpy, wins[i], &wa))
-                continue;
-            if (XGetTransientForHint(dpy, wins[i], &d1)
-            && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState))
-                manage(wins[i], &wa);
-        }
-        if (wins)
-            XFree(wins);
-    }
-}
-
-void
-sendmon(Client *c, Monitor *m)
-{
-    if (c->mon == m)
-        return;
-    unfocus(c, 1);
-    detach(c);
-    detachstack(c);
-    c->mon = m;
-    c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
-    attach(c);
-    attachstack(c);
-    focus(NULL);
-    arrange(NULL);
-}
-
-void
-setclientstate(Client *c, long state)
-{
-    long data[] = { state, None };
-
-    XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
-        PropModeReplace, (unsigned char *)data, 2);
-}
-
-int
-sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4)
-{
-    int n;
-    Atom *protocols, mt;
-    int exists = 0;
-    XEvent ev;
-
-    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 = w;
-        ev.xclient.message_type = mt;
-        ev.xclient.format = 32;
-        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;
-}
-
-void
-setfocus(Client *c)
-{
-    if (!c->neverfocus) {
-        XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
-        XChangeProperty(dpy, root, netatom[NetActiveWindow],
-            XA_WINDOW, 32, PropModeReplace,
-            (unsigned char *) &(c->win), 1);
-    }
-    sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0);
-}
-
-void
-setfullscreen(Client *c, int fullscreen)
-{
-    if (fullscreen && !c->isfullscreen) {
-        XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
-            PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
-        c->isfullscreen = 1;
-        c->oldstate = c->isfloating;
-        c->oldbw = c->bw;
-        c->bw = 0;
-        c->isfloating = 1;
-        resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh);
-        XRaiseWindow(dpy, c->win);
-    } else if (!fullscreen && c->isfullscreen){
-        XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32,
-            PropModeReplace, (unsigned char*)0, 0);
-        c->isfullscreen = 0;
-        c->isfloating = c->oldstate;
-        c->bw = c->oldbw;
-        c->x = c->oldx;
-        c->y = c->oldy;
-        c->w = c->oldw;
-        c->h = c->oldh;
-        resizeclient(c, c->x, c->y, c->w, c->h);
-        arrange(c->mon);
-    }
-}
-
-void
-setlayout(const Arg *arg)
-{
-    unsigned int i;
-    if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
-        selmon->sellt ^= 1;
-    if (arg && arg->v)
-        selmon->lt[selmon->sellt] = (Layout *)arg->v;
-    strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
-
-    for(i=0; i<LENGTH(tags); ++i)
-        if(selmon->tagset[selmon->seltags] & 1<<i)
-        {
-            selmon->pertag->ltidxs[i+1][selmon->sellt] = selmon->lt[selmon->sellt]; 
-            selmon->pertag->sellts[i+1] = selmon->sellt;
-        }
-    
-    if(selmon->pertag->curtag == 0)
-    {
-        selmon->pertag->ltidxs[0][selmon->sellt] = selmon->lt[selmon->sellt]; 
-        selmon->pertag->sellts[0] = selmon->sellt;
-    }
-
-    if (selmon->sel)
-        arrange(selmon);
-    else
-        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)
-{
-    float f;
-    unsigned int i;
-
-    if (!arg || !selmon->lt[selmon->sellt]->arrange)
-        return;
-    f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
-    if (arg->f == 0.0)
-        f = mfact;
-    if (f < 0.05 || f > 0.95)
-        return;
-    selmon->mfact = f;
-    for(i=0; i<LENGTH(tags); ++i)
-        if(selmon->tagset[selmon->seltags] & 1<<i)
-            selmon->pertag->mfacts[i+1] = f;
-
-    if(selmon->pertag->curtag == 0)
-    {
-        selmon->pertag->mfacts[0] = f;
-    }
-    arrange(selmon);
-}
-
-void
-setup(void)
-{
-    int i;
-    XSetWindowAttributes wa;
-    Atom utf8string;
-
-    /* clean up any zombies immediately */
-    sigchld(0);
-
-    /* init screen */
-    screen = DefaultScreen(dpy);
-    sw = DisplayWidth(dpy, screen);
-    sh = DisplayHeight(dpy, screen);
-    root = RootWindow(dpy, screen);
-    drw = drw_create(dpy, screen, root, sw, sh);
-    if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
-        die("no fonts could be loaded.");
-    lrpad = drw->fonts->h;
-    bh = drw->fonts->h + 2;
-    updategeom();
-    /* init atoms */
-    utf8string = XInternAtom(dpy, "UTF8_STRING", False);
-    wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
-    wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
-    wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
-    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);
-    netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
-    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);
-    cursor[CurMove] = drw_cur_create(drw, XC_fleur);
-    /* init appearance */
-    scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
-    for (i = 0; i < LENGTH(colors); i++)
-        scheme[i] = drw_scm_create(drw, colors[i], 3);
-        /* scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3); */
-    /* init system tray */
-    updatesystray();
-    /* init bars */
-    updatebars();
-    updatestatus();
-    /* supporting window for NetWMCheck */
-    wmcheckwin = XCreateSimpleWindow(dpy, root, 0, 0, 1, 1, 0, 0, 0);
-    XChangeProperty(dpy, wmcheckwin, netatom[NetWMCheck], XA_WINDOW, 32,
-        PropModeReplace, (unsigned char *) &wmcheckwin, 1);
-    XChangeProperty(dpy, wmcheckwin, netatom[NetWMName], utf8string, 8,
-        PropModeReplace, (unsigned char *) "dwm", 3);
-    XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32,
-        PropModeReplace, (unsigned char *) &wmcheckwin, 1);
-    /* EWMH support per view */
-    XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
-        PropModeReplace, (unsigned char *) netatom, NetLast);
-    XDeleteProperty(dpy, root, netatom[NetClientList]);
-    /* select events */
-    wa.cursor = cursor[CurNormal]->cursor;
-    wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask
-        |ButtonPressMask|PointerMotionMask|EnterWindowMask
-        |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask;
-    XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa);
-    XSelectInput(dpy, root, wa.event_mask);
-    grabkeys();
-    focus(NULL);
-}
-
-
-void
-seturgent(Client *c, int urg)
-{
-    XWMHints *wmh;
-
-    c->isurgent = urg;
-    if (!(wmh = XGetWMHints(dpy, c->win)))
-        return;
-    wmh->flags = urg ? (wmh->flags | XUrgencyHint) : (wmh->flags & ~XUrgencyHint);
-    XSetWMHints(dpy, c->win, wmh);
-    XFree(wmh);
-}
-
-void
-showhide(Client *c)
-{
-    if (!c)
-        return;
-    if (ISVISIBLE(c)) {
-        /* show clients top down */
-        XMoveWindow(dpy, c->win, c->x, c->y);
-        if ((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen)
-            resize(c, c->x, c->y, c->w, c->h, 0);
-        showhide(c->snext);
-    } else {
-        /* hide clients bottom up */
-        showhide(c->snext);
-        XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y);
-    }
-}
-
-void
-sigchld(int unused)
-{
-    if (signal(SIGCHLD, sigchld) == SIG_ERR)
-        die("can't install SIGCHLD handler:");
-    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)
-{
-    if (arg->v == dmenucmd)
-        dmenumon[0] = '0' + selmon->num;
-    else if (arg->v == statuscmd) {
-        statuscmd[2] = statuscmds[statuscmdn];
-        setenv("BUTTON", lastbutton, 1);
-    }
-    if (fork() == 0) {
-        if (dpy)
-            close(ConnectionNumber(dpy));
-        setsid();
-        execvp(((char **)arg->v)[0], (char **)arg->v);
-        fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
-        perror(" failed");
-        exit(EXIT_SUCCESS);
-    }
-}
-
-void
-tag(const Arg *arg)
-{
-    if (selmon->sel && arg->ui & TAGMASK) {
-        selmon->sel->tags = arg->ui & TAGMASK;
-        focus(NULL);
-        arrange(selmon);
-    }
-}
-
-void
-tagmon(const Arg *arg)
-{
-    if (!selmon->sel || !mons->next)
-        return;
-    sendmon(selmon->sel, dirtomon(arg->i));
-}
-/*
-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++) {
-        if (n < m->nmaster)
-            mfacts += c->cfact;
-        else
-            sfacts += c->cfact;
-    }
-    if (n == 0)
-        return;
-
-    if (n > m->nmaster)
-        mw = m->nmaster ? m->ww * m->mfact : 0;
-    else
-        mw = m->ww;
-    for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-        if (i < m->nmaster) {
-            h = (m->wh - my) * (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) * (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;
-        }
-}
-*/
-void
-togglebar(const Arg *arg)
-{
-    unsigned int i;
-    selmon->showbar = !selmon->showbar;
-    for(i=0; i<LENGTH(tags); ++i)
-        if(selmon->tagset[selmon->seltags] & 1<<i)
-            selmon->pertag->showbars[i+1] = selmon->showbar;
-
-    if(selmon->pertag->curtag == 0)
-    {
-        selmon->pertag->showbars[0] = selmon->showbar;
-    }
-    updatebarpos(selmon);
-    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);
-}
-
-void
-togglefloating(const Arg *arg)
-{
-    if (!selmon->sel)
-        return;
-    if (selmon->sel->isfullscreen) /* no support for fullscreen windows */
-        return;
-    selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed;
-    if (selmon->sel->isfloating)
-        resize(selmon->sel, selmon->sel->x, selmon->sel->y,
-            selmon->sel->w, selmon->sel->h, 0);
-    arrange(selmon);
-}
-
-void
-toggletag(const Arg *arg)
-{
-    unsigned int newtags;
-
-    if (!selmon->sel)
-        return;
-    newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
-    if (newtags) {
-        selmon->sel->tags = newtags;
-        focus(NULL);
-        arrange(selmon);
-    }
-}
-
-void
-toggleview(const Arg *arg)
-{
-    unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
-    int i;
-
-    if (newtagset) {
-        selmon->tagset[selmon->seltags] = newtagset;
-
-        if (newtagset == ~0) {
-            selmon->pertag->prevtag = selmon->pertag->curtag;
-            selmon->pertag->curtag = 0;
-        }
-
-        /* test if the user did not select the same tag */
-        if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
-            selmon->pertag->prevtag = selmon->pertag->curtag;
-            for (i = 0; !(newtagset & 1 << i); i++) ;
-            selmon->pertag->curtag = i + 1;
-        }
-
-        /* apply settings for this view */
-        selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
-        selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
-        selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
-        selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
-        selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
-
-        if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
-            togglebar(NULL);
-
-        focus(NULL);
-        arrange(selmon);
-    }
-}
-
-void
-unfocus(Client *c, int setfocus)
-{
-    if (!c)
-        return;
-    grabbuttons(c, 0);
-    XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel);
-    if (setfocus) {
-        XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
-        XDeleteProperty(dpy, root, netatom[NetActiveWindow]);
-    }
-}
-
-void
-unmanage(Client *c, int destroyed)
-{
-    Monitor *m = c->mon;
-    XWindowChanges wc;
-
-    detach(c);
-    detachstack(c);
-    if (!destroyed) {
-        wc.border_width = c->oldbw;
-        XGrabServer(dpy); /* avoid race conditions */
-        XSetErrorHandler(xerrordummy);
-        XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
-        XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
-        setclientstate(c, WithdrawnState);
-        XSync(dpy, False);
-        XSetErrorHandler(xerror);
-        XUngrabServer(dpy);
-    }
-    free(c);
-    focus(NULL);
-    updateclientlist();
-    arrange(m);
-}
-
-void
-unmapnotify(XEvent *e)
-{
-    Client *c;
-    XUnmapEvent *ev = &e->xunmap;
-
-    if ((c = wintoclient(ev->window))) {
-        if (ev->send_event)
-            setclientstate(c, WithdrawnState);
-        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,
-        /* .background_pixel = 0, */
-        /* .border_pixel = 0, */
-        /* .colormap = cmap, */
-        .background_pixmap = ParentRelative,
-        .event_mask = ButtonPressMask|ExposureMask
-    };
-    XClassHint ch = {"dwm", "dwm"};
-    for (m = mons; m; m = m->next) {
-        if (m->barwin)
-            continue;
-        w = m->ww;
-        if (showsystray && m == systraytomon(m))
-            w -= getsystraywidth();
-
-        /* m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth, */
-        /*                           InputOutput, visual, */
-        /*                           CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa); */
-        m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
-                CopyFromParent, DefaultVisual(dpy, screen),
-                CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
-        XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
-        if (showsystray && m == systraytomon(m))
-            XMapRaised(dpy, systray->win);
-        XMapRaised(dpy, m->barwin);
-        XSetClassHint(dpy, m->barwin, &ch);
-    }
-}
-
-void
-updatebarpos(Monitor *m)
-{
-    m->wy = m->my;
-    m->wh = m->mh;
-    if (m->showbar) {
-        m->wh -= bh;
-        m->by = m->topbar ? m->wy : m->wy + m->wh;
-        m->wy = m->topbar ? m->wy + bh : m->wy;
-    } else
-        m->by = -bh;
-}
-
-void
-updateclientlist()
-{
-    Client *c;
-    Monitor *m;
-
-    XDeleteProperty(dpy, root, netatom[NetClientList]);
-    for (m = mons; m; m = m->next)
-        for (c = m->clients; c; c = c->next)
-            XChangeProperty(dpy, root, netatom[NetClientList],
-                XA_WINDOW, 32, PropModeAppend,
-                (unsigned char *) &(c->win), 1);
-}
-
-int
-updategeom(void)
-{
-    int dirty = 0;
-
-#ifdef XINERAMA
-    if (XineramaIsActive(dpy)) {
-        int i, j, n, nn;
-        Client *c;
-        Monitor *m;
-        XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
-        XineramaScreenInfo *unique = NULL;
-
-        for (n = 0, m = mons; m; m = m->next, n++);
-        /* only consider unique geometries as separate screens */
-        unique = ecalloc(nn, sizeof(XineramaScreenInfo));
-        for (i = 0, j = 0; i < nn; i++)
-            if (isuniquegeom(unique, j, &info[i]))
-                memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo));
-        XFree(info);
-        nn = j;
-        if (n <= nn) { /* new monitors available */
-            for (i = 0; i < (nn - n); 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);
-                }
-        } else { /* less monitors available nn < n */
-            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);
-            }
-        }
-        free(unique);
-    } else
-#endif /* XINERAMA */
-    { /* default monitor setup */
-        if (!mons)
-            mons = createmon();
-        if (mons->mw != sw || mons->mh != sh) {
-            dirty = 1;
-            mons->mw = mons->ww = sw;
-            mons->mh = mons->wh = sh;
-            updatebarpos(mons);
-        }
-    }
-    if (dirty) {
-        selmon = mons;
-        selmon = wintomon(root);
-    }
-    return dirty;
-}
-
-void
-updatenumlockmask(void)
-{
-    unsigned int i, j;
-    XModifierKeymap *modmap;
-
-    numlockmask = 0;
-    modmap = XGetModifierMapping(dpy);
-    for (i = 0; i < 8; i++)
-        for (j = 0; j < modmap->max_keypermod; j++)
-            if (modmap->modifiermap[i * modmap->max_keypermod + j]
-                == XKeysymToKeycode(dpy, XK_Num_Lock))
-                numlockmask = (1 << i);
-    XFreeModifiermap(modmap);
-}
-
-void
-updatesizehints(Client *c)
-{
-    long msize;
-    XSizeHints size;
-
-    if (!XGetWMNormalHints(dpy, c->win, &size, &msize))
-        /* size is uninitialized, ensure that size.flags aren't used */
-        size.flags = PSize;
-    if (size.flags & PBaseSize) {
-        c->basew = size.base_width;
-        c->baseh = size.base_height;
-    } else if (size.flags & PMinSize) {
-        c->basew = size.min_width;
-        c->baseh = size.min_height;
-    } else
-        c->basew = c->baseh = 0;
-    if (size.flags & PResizeInc) {
-        c->incw = size.width_inc;
-        c->inch = size.height_inc;
-    } else
-        c->incw = c->inch = 0;
-    if (size.flags & PMaxSize) {
-        c->maxw = size.max_width;
-        c->maxh = size.max_height;
-    } else
-        c->maxw = c->maxh = 0;
-    if (size.flags & PMinSize) {
-        c->minw = size.min_width;
-        c->minh = size.min_height;
-    } else if (size.flags & PBaseSize) {
-        c->minw = size.base_width;
-        c->minh = size.base_height;
-    } else
-        c->minw = c->minh = 0;
-    if (size.flags & PAspect) {
-        c->mina = (float)size.min_aspect.y / size.min_aspect.x;
-        c->maxa = (float)size.max_aspect.x / size.max_aspect.y;
-    } else
-        c->maxa = c->mina = 0.0;
-    c->isfixed = (c->maxw && c->maxh && c->maxw == c->minw && c->maxh == c->minh);
-}
-
-void
-updatestatus(void)
-{
-    if (!gettextprop(root, XA_WM_NAME, rawstext, sizeof(rawstext)))
-        strcpy(stext, "dwm-"VERSION);
-    else
-        copyvalidchars(stext, rawstext);
-    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 sw = TEXTW(stext) - lrpad + systrayspacing;
-    unsigned int w = 1;
-
-    if (!showsystray)
-        return;
-    if (systrayonleft)
-        x -= sw;
-    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);*/
-     XFillRectangle(dpy, systray->win, XCreateGC(dpy, root, 0 , NULL), 0, 0, w, bh);
-    XSync(dpy, False);
-}
-
-void
-updatetitle(Client *c)
-{
-    if (!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name))
-        gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name);
-    if (c->name[0] == '\0') /* hack to mark broken clients */
-        strcpy(c->name, broken);
-}
-
-void
-updatewindowtype(Client *c)
-{
-    Atom state = getatomprop(c, netatom[NetWMState]);
-    Atom wtype = getatomprop(c, netatom[NetWMWindowType]);
-
-    if (state == netatom[NetWMFullscreen])
-        setfullscreen(c, 1);
-    if (wtype == netatom[NetWMWindowTypeDialog])
-        c->isfloating = 1;
-}
-
-void
-updatewmhints(Client *c)
-{
-    XWMHints *wmh;
-
-    if ((wmh = XGetWMHints(dpy, c->win))) {
-        if (c == selmon->sel && wmh->flags & XUrgencyHint) {
-            wmh->flags &= ~XUrgencyHint;
-            XSetWMHints(dpy, c->win, wmh);
-        } else
-            c->isurgent = (wmh->flags & XUrgencyHint) ? 1 : 0;
-        if (wmh->flags & InputHint)
-            c->neverfocus = !wmh->input;
-        else
-            c->neverfocus = 0;
-        XFree(wmh);
-    }
-}
-
-void
-view(const Arg *arg)
-{
-    int i;
-    unsigned int tmptag;
-
-    if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
-        return;
-    selmon->seltags ^= 1; /* toggle sel tagset */
-    if (arg->ui & TAGMASK) {
-        selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-        selmon->pertag->prevtag = selmon->pertag->curtag;
-
-        if (arg->ui == ~0)
-            selmon->pertag->curtag = 0;
-        else {
-            for (i = 0; !(arg->ui & 1 << i); i++) ;
-            selmon->pertag->curtag = i + 1;
-        }
-    } else {
-        tmptag = selmon->pertag->prevtag;
-        selmon->pertag->prevtag = selmon->pertag->curtag;
-        selmon->pertag->curtag = tmptag;
-    }
-
-    selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
-    selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
-    selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
-    selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
-    selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
-
-    if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
-        togglebar(NULL);
-
-    focus(NULL);
-    arrange(selmon);
-}
-
-Client *
-wintoclient(Window w)
-{
-    Client *c;
-    Monitor *m;
-
-    for (m = mons; m; m = m->next)
-        for (c = m->clients; c; c = c->next)
-            if (c->win == w)
-                return c;
-    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)
-{
-    int x, y;
-    Client *c;
-    Monitor *m;
-
-    if (w == root && getrootptr(&x, &y))
-        return recttomon(x, y, 1, 1);
-    for (m = mons; m; m = m->next)
-        if (w == m->barwin)
-            return m;
-    if ((c = wintoclient(w)))
-        return c->mon;
-    return selmon;
-}
-
-/* There's no way to check accesses to destroyed windows, thus those cases are
- * ignored (especially on UnmapNotify's). Other types of errors call Xlibs
- * default error handler, which may call exit. */
-int
-xerror(Display *dpy, XErrorEvent *ee)
-{
-    if (ee->error_code == BadWindow
-    || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch)
-    || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable)
-    || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable)
-    || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable)
-    || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch)
-    || (ee->request_code == X_GrabButton && ee->error_code == BadAccess)
-    || (ee->request_code == X_GrabKey && ee->error_code == BadAccess)
-    || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable))
-        return 0;
-    fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n",
-        ee->request_code, ee->error_code);
-    return xerrorxlib(dpy, ee); /* may call exit */
-}
-
-int
-xerrordummy(Display *dpy, XErrorEvent *ee)
-{
-    return 0;
-}
-
-/* Startup Error handler to check if another window manager
- * is already running. */
-int
-xerrorstart(Display *dpy, XErrorEvent *ee)
-{
-    die("dwm: another window manager is already running");
-    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)
-{
-    Client *c = selmon->sel;
-
-    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);
-}
-
-int
-main(int argc, char *argv[])
-{
-    if (argc == 2 && !strcmp("-v", argv[1]))
-        die("dwm-"VERSION);
-    else if (argc != 1)
-        die("usage: dwm [-v]");
-    if (!setlocale(LC_CTYPE, "") || !XSupportsLocale())
-        fputs("warning: no locale support\n", stderr);
-    if (!(dpy = XOpenDisplay(NULL)))
-        die("dwm: cannot open display");
-    checkotherwm();
-    setup();
-#ifdef __OpenBSD__
-    if (pledge("stdio rpath proc exec", NULL) == -1)
-        die("pledge");
-#endif /* __OpenBSD__ */
-    scan();
-    runautostart();
-    run();
-    cleanup();
-    XCloseDisplay(dpy);
-    return EXIT_SUCCESS;
-}
diff --git a/.config/dwm/dwm.o b/.config/dwm/dwm.o
Binary files differ.
diff --git a/.config/dwm/dwm.png b/.config/dwm/dwm.png
Binary files differ.
diff --git a/.config/dwm/gaplessgrid.c b/.config/dwm/gaplessgrid.c
@@ -1,35 +0,0 @@
-void
-gaplessgrid(Monitor *m) {
-    unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch;
-    Client *c;
-
-    for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) ;
-    if(n == 0)
-        return;
-
-    /* grid dimensions */
-    for(cols = 0; cols <= n/2; cols++)
-        if(cols*cols >= n)
-            break;
-    if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
-        cols = 2;
-    rows = n/cols;
-
-    /* window geometries */
-    cw = cols ? m->ww / cols : m->ww;
-    cn = 0; /* current column number */
-    rn = 0; /* current row number */
-    for(i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
-        if(i/rows + 1 > cols - n%cols)
-            rows = n/cols + 1;
-        ch = rows ? m->wh / rows : m->wh;
-        cx = m->wx + cn*cw;
-        cy = m->wy + rn*ch;
-        resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw, False);
-        rn++;
-        if(rn >= rows) {
-            rn = 0;
-            cn++;
-        }
-    }
-}
diff --git a/.config/dwm/patches/dwm-alpha-20201019-61bb8b2.diff b/.config/dwm/patches/dwm-alpha-20201019-61bb8b2.diff
@@ -1,289 +0,0 @@
-From 51f9c34480b984e261a738e5295f518b42c2f29c Mon Sep 17 00:00:00 2001
-From: Petrus Karell <pk@petruskarell.fi>
-Date: Mon, 19 Oct 2020 19:15:24 +0300
-Subject: [PATCH] Allow dwm to have translucent bars, while keeping all
- the  text on it opaque, just like the alpha-patch for st. Updated for 61bb8b2
-
----
- config.def.h |  7 ++++++
- config.mk    |  2 +-
- drw.c        | 26 ++++++++++++-----------
- drw.h        |  9 +++++---
- dwm.c        | 60 ++++++++++++++++++++++++++++++++++++++++++++++------
- 5 files changed, 82 insertions(+), 22 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..4f68fe8 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -12,11 +12,18 @@ 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 unsigned int baralpha = 0xd0;
-+static const unsigned int borderalpha = OPAQUE;
- static const char *colors[][3]      = {
-     /*               fg         bg         border   */
-     [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
-     [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
- };
-+static const unsigned int alphas[][3]      = {
-+    /*               fg      bg        border     */
-+    [SchemeNorm] = { OPAQUE, baralpha, borderalpha },
-+    [SchemeSel]  = { OPAQUE, baralpha, borderalpha },
-+};
- 
- /* tagging */
- static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
-diff --git a/config.mk b/config.mk
-index 7084c33..21b5404 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} -lXrender
- 
- # flags
- CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
-diff --git a/drw.c b/drw.c
-index 4cdbcbe..fe3aadd 100644
---- a/drw.c
-+++ b/drw.c
-@@ -61,7 +61,7 @@ utf8decode(const char *c, long *u, size_t clen)
- }
- 
- Drw *
--drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
-+drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap)
- {
-     Drw *drw = ecalloc(1, sizeof(Drw));
- 
-@@ -70,8 +70,11 @@ drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h
-     drw->root = root;
-     drw->w = w;
-     drw->h = h;
--    drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
--    drw->gc = XCreateGC(dpy, root, 0, NULL);
-+    drw->visual = visual;
-+    drw->depth = depth;
-+    drw->cmap = cmap;
-+    drw->drawable = XCreatePixmap(dpy, root, w, h, depth);
-+    drw->gc = XCreateGC(dpy, drw->drawable, 0, NULL);
-     XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
- 
-     return drw;
-@@ -87,7 +90,7 @@ drw_resize(Drw *drw, unsigned int w, unsigned int h)
-     drw->h = h;
-     if (drw->drawable)
-         XFreePixmap(drw->dpy, drw->drawable);
--    drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
-+    drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, drw->depth);
- }
- 
- void
-@@ -194,21 +197,22 @@ drw_fontset_free(Fnt *font)
- }
- 
- void
--drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
-+drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha)
- {
-     if (!drw || !dest || !clrname)
-         return;
- 
--    if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
--                           DefaultColormap(drw->dpy, drw->screen),
-+    if (!XftColorAllocName(drw->dpy, drw->visual, drw->cmap,
-                            clrname, dest))
-         die("error, cannot allocate color '%s'", clrname);
-+
-+    dest->pixel = (dest->pixel & 0x00ffffffU) | (alpha << 24);
- }
- 
- /* 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, const char *clrnames[], const unsigned int alphas[], size_t clrcount)
- {
-     size_t i;
-     Clr *ret;
-@@ -218,7 +222,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
-         return NULL;
- 
-     for (i = 0; i < clrcount; i++)
--        drw_clr_create(drw, &ret[i], clrnames[i]);
-+        drw_clr_create(drw, &ret[i], clrnames[i], alphas[i]);
-     return ret;
- }
- 
-@@ -274,9 +278,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
-     } else {
-         XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
-         XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
--        d = XftDrawCreate(drw->dpy, drw->drawable,
--                          DefaultVisual(drw->dpy, drw->screen),
--                          DefaultColormap(drw->dpy, drw->screen));
-+        d = XftDrawCreate(drw->dpy, drw->drawable, drw->visual, drw->cmap);
-         x += lpad;
-         w -= lpad;
-     }
-diff --git a/drw.h b/drw.h
-index 4bcd5ad..a56f523 100644
---- a/drw.h
-+++ b/drw.h
-@@ -20,6 +20,9 @@ typedef struct {
-     Display *dpy;
-     int screen;
-     Window root;
-+    Visual *visual;
-+    unsigned int depth;
-+    Colormap cmap;
-     Drawable drawable;
-     GC gc;
-     Clr *scheme;
-@@ -27,7 +30,7 @@ typedef struct {
- } Drw;
- 
- /* Drawable abstraction */
--Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
-+Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h, Visual *visual, unsigned int depth, Colormap cmap);
- void drw_resize(Drw *drw, unsigned int w, unsigned int h);
- void drw_free(Drw *drw);
- 
-@@ -38,8 +41,8 @@ unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
- void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
- 
- /* 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);
-+void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha);
-+Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount);
- 
- /* Cursor abstraction */
- Cur *drw_cur_create(Drw *drw, int shape);
-diff --git a/dwm.c b/dwm.c
-index 664c527..d8005c7 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -57,6 +57,8 @@
- #define TAGMASK                 ((1 << LENGTH(tags)) - 1)
- #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad)
- 
-+#define OPAQUE                  0xffU
-+
- /* enums */
- enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
- enum { SchemeNorm, SchemeSel }; /* color schemes */
-@@ -233,6 +235,7 @@ static Monitor *wintomon(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 xinitvisual();
- static void zoom(const Arg *arg);
- 
- /* variables */
-@@ -269,6 +272,11 @@ static Drw *drw;
- static Monitor *mons, *selmon;
- static Window root, wmcheckwin;
- 
-+static int useargb = 0;
-+static Visual *visual;
-+static int depth;
-+static Colormap cmap;
-+
- /* configuration, allows nested code to access above variables */
- #include "config.h"
- 
-@@ -1542,7 +1550,8 @@ setup(void)
-     sw = DisplayWidth(dpy, screen);
-     sh = DisplayHeight(dpy, screen);
-     root = RootWindow(dpy, screen);
--    drw = drw_create(dpy, screen, root, sw, sh);
-+    xinitvisual();
-+    drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap);
-     if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
-         die("no fonts could be loaded.");
-     lrpad = drw->fonts->h;
-@@ -1570,7 +1579,7 @@ setup(void)
-     /* init appearance */
-     scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
-     for (i = 0; i < LENGTH(colors); i++)
--        scheme[i] = drw_scm_create(drw, colors[i], 3);
-+        scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3);
-     /* init bars */
-     updatebars();
-     updatestatus();
-@@ -1807,16 +1816,18 @@ updatebars(void)
-     Monitor *m;
-     XSetWindowAttributes wa = {
-         .override_redirect = True,
--        .background_pixmap = ParentRelative,
-+        .background_pixel = 0,
-+        .border_pixel = 0,
-+        .colormap = cmap,
-         .event_mask = ButtonPressMask|ExposureMask
-     };
-     XClassHint ch = {"dwm", "dwm"};
-     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),
--                CopyFromParent, DefaultVisual(dpy, screen),
--                CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
-+        m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth,
-+                                  InputOutput, visual,
-+                                  CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
-         XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
-         XMapRaised(dpy, m->barwin);
-         XSetClassHint(dpy, m->barwin, &ch);
-@@ -2113,6 +2124,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
-     return -1;
- }
- 
-+void
-+xinitvisual()
-+{
-+    XVisualInfo *infos;
-+    XRenderPictFormat *fmt;
-+    int nitems;
-+    int i;
-+
-+    XVisualInfo tpl = {
-+        .screen = screen,
-+        .depth = 32,
-+        .class = TrueColor
-+    };
-+    long masks = VisualScreenMask | VisualDepthMask | VisualClassMask;
-+
-+    infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
-+    visual = NULL;
-+    for(i = 0; i < nitems; i ++) {
-+        fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
-+        if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
-+            visual = infos[i].visual;
-+            depth = infos[i].depth;
-+            cmap = XCreateColormap(dpy, root, visual, AllocNone);
-+            useargb = 1;
-+            break;
-+        }
-+    }
-+
-+    XFree(infos);
-+
-+    if (! visual) {
-+        visual = DefaultVisual(dpy, screen);
-+        depth = DefaultDepth(dpy, screen);
-+        cmap = DefaultColormap(dpy, screen);
-+    }
-+}
-+
- void
- zoom(const Arg *arg)
- {
--- 
-2.28.0
-
diff --git a/.config/dwm/patches/dwm-alwayscenter-20200625-f04cac6.diff b/.config/dwm/patches/dwm-alwayscenter-20200625-f04cac6.diff
@@ -1,12 +0,0 @@
-diff -up dwm/dwm.c dwmmod/dwm.c
---- dwm/dwm.c    2020-06-25 00:21:30.383692180 -0300
-+++ dwmmod/dwm.c    2020-06-25 00:20:35.643692330 -0300
-@@ -1057,6 +1057,8 @@ manage(Window w, XWindowAttributes *wa)
-     updatewindowtype(c);
-     updatesizehints(c);
-     updatewmhints(c);
-+    c->x = c->mon->mx + (c->mon->mw - WIDTH(c)) / 2;
-+    c->y = c->mon->my + (c->mon->mh - HEIGHT(c)) / 2;
-     XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask);
-     grabbuttons(c, 0);
-     if (!c->isfloating)
diff --git a/.config/dwm/patches/dwm-autostart-20210120-cb3f58a.diff b/.config/dwm/patches/dwm-autostart-20210120-cb3f58a.diff
@@ -1,179 +0,0 @@
-From 37e970479dc5d40e57fc0cbfeaa5e39941483237 Mon Sep 17 00:00:00 2001
-From: Gan Ainm <gan.ainm.riomhphost@gmail.com>
-Date: Wed, 10 Jun 2020 10:59:02 +0000
-Subject: [PATCH] dwm-xdgautostart-6.2.diff
-
-===================================================================
----
- dwm.1 | 23 +++++++++++++++++
- dwm.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 105 insertions(+)
-
-diff --git a/dwm.1 b/dwm.1
-index 13b3729..9533aa6 100644
---- a/dwm.1
-+++ b/dwm.1
-@@ -30,6 +30,14 @@ 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
- dwm draws a small border around windows to indicate the focus state.
-+.P
-+On start, dwm can start additional programs that may be specified in two special
-+shell scripts (see the FILES section below), autostart_blocking.sh and
-+autostart.sh.  The former is executed first and dwm will wait for its
-+termination before starting.  The latter is executed in the background before
-+dwm enters its handler loop.
-+.P
-+Either of these files may be omitted.
- .SH OPTIONS
- .TP
- .B \-v
-@@ -152,6 +160,21 @@ Toggles focused window between floating and tiled state.
- .TP
- .B Mod1\-Button3
- Resize focused window while dragging. Tiled windows will be toggled to the floating state.
-+.SH FILES
-+The files containing programs to be started along with dwm are searched for in
-+the following directories:
-+.IP "1. $XDG_DATA_HOME/dwm"
-+.IP "2. $HOME/.local/share/dwm"
-+.IP "3. $HOME/.dwm"
-+.P
-+The first existing directory is scanned for any of the autostart files below.
-+.TP 15
-+autostart.sh
-+This file is started as a shell background process before dwm enters its handler
-+loop.
-+.TP 15
-+autostart_blocking.sh
-+This file is started before any autostart.sh; dwm waits for its termination.
- .SH CUSTOMIZATION
- dwm is customized by creating a custom config.h and (re)compiling the source
- code. This keeps it fast, secure and simple.
-diff --git a/dwm.c b/dwm.c
-index 4465af1..2156b49 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -29,6 +29,7 @@
- #include <string.h>
- #include <unistd.h>
- #include <sys/types.h>
-+#include <sys/stat.h>
- #include <sys/wait.h>
- #include <X11/cursorfont.h>
- #include <X11/keysym.h>
-@@ -193,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);
-@@ -235,7 +237,11 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee);
- static void zoom(const Arg *arg);
- 
- /* variables */
-+static const char autostartblocksh[] = "autostart_blocking.sh";
-+static const char autostartsh[] = "autostart.sh";
- static const char broken[] = "broken";
-+static const char dwmdir[] = "dwm";
-+static const char localshare[] = ".local/share";
- static char stext[256];
- static int screen;
- static int sw, sh;           /* X display screen geometry width, height */
-@@ -1380,6 +1386,83 @@ run(void)
-             handler[ev.type](&ev); /* call handler */
- }
- 
-+void
-+runautostart(void)
-+{
-+    char *pathpfx;
-+    char *path;
-+    char *xdgdatahome;
-+    char *home;
-+    struct stat sb;
-+
-+    if ((home = getenv("HOME")) == NULL)
-+        /* this is almost impossible */
-+        return;
-+
-+    /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm,
-+     * otherwise use ~/.local/share/dwm as autostart script directory
-+     */
-+    xdgdatahome = getenv("XDG_DATA_HOME");
-+    if (xdgdatahome != NULL && *xdgdatahome != '\0') {
-+        /* space for path segments, separators and nul */
-+        pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2);
-+
-+        if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) {
-+            free(pathpfx);
-+            return;
-+        }
-+    } else {
-+        /* space for path segments, separators and nul */
-+        pathpfx = ecalloc(1, strlen(home) + strlen(localshare)
-+                             + strlen(dwmdir) + 3);
-+
-+        if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) {
-+            free(pathpfx);
-+            return;
-+        }
-+    }
-+
-+    /* check if the autostart script directory exists */
-+    if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) {
-+        /* the XDG conformant path does not exist or is no directory
-+         * so we try ~/.dwm instead
-+         */
-+        char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3);
-+        if(pathpfx_new == NULL) {
-+            free(pathpfx);
-+            return;
-+        }
-+        pathpfx = pathpfx_new;
-+
-+        if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) {
-+            free(pathpfx);
-+            return;
-+        }
-+    }
-+
-+    /* try the blocking script first */
-+    path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2);
-+    if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) {
-+        free(path);
-+        free(pathpfx);
-+    }
-+
-+    if (access(path, X_OK) == 0)
-+        system(path);
-+
-+    /* now the non-blocking script */
-+    if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) {
-+        free(path);
-+        free(pathpfx);
-+    }
-+
-+    if (access(path, X_OK) == 0)
-+        system(strcat(path, " &"));
-+
-+    free(pathpfx);
-+    free(path);
-+}
-+
- void
- scan(void)
- {
-@@ -2142,6 +2223,7 @@ main(int argc, char *argv[])
-         die("pledge");
- #endif /* __OpenBSD__ */
-     scan();
-+    runautostart();
-     run();
-     cleanup();
-     XCloseDisplay(dpy);
--- 
-2.27.0
-
diff --git a/.config/dwm/patches/dwm-cfacts-vanitygaps-6.2_combo.diff b/.config/dwm/patches/dwm-cfacts-vanitygaps-6.2_combo.diff
@@ -1,1110 +0,0 @@
-From 1f9992ae1a745a86294a555051ea17ba4ef5ce5f Mon Sep 17 00:00:00 2001
-From: bakkeby <bakkeby@gmail.com>
-Date: Mon, 6 Apr 2020 12:04:55 +0200
-Subject: [PATCH 1/2] Adding cfacts patch which provides the ability to assign
- different weights to clients in their respective stack in tiled layout.
-
-Refer to https://dwm.suckless.org/patches/cfacts/
----
- config.def.h |  3 +++
- dwm.c        | 35 ++++++++++++++++++++++++++++++++---
- 2 files changed, 35 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 4465af1..5592c57 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;
-@@ -200,6 +201,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);
-@@ -1029,6 +1031,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))) {
-@@ -1511,6 +1514,24 @@ 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)
-@@ -1674,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;
- 
-@@ -1686,13 +1713,15 @@ 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);
-             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);
-             ty += HEIGHT(c);
-+            sfacts -= c->cfact;
-         }
- }
- 
--- 
-2.19.1
-
-
-From 051e4de72079bb0b8e50d2faa61b9a0ef36434b5 Mon Sep 17 00:00:00 2001
-From: bakkeby <bakkeby@gmail.com>
-Date: Fri, 8 May 2020 16:51:00 +0200
-Subject: [PATCH 2/2] vanitygaps - adds gaps to layouts
-
-This patch differentiates between inner and outer gaps as well as
-horizontal and vertical gaps.
-
-The logic of these layouts also aims to be pixel perfect by ensuring
-an even split of the available space and re-distributing the remainder
-among the available clients.
----
- config.def.h |  38 ++-
- dwm.c        |  43 +--
- vanitygaps.c | 822 +++++++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 867 insertions(+), 36 deletions(-)
- create mode 100644 vanitygaps.c
-
-diff --git a/config.def.h b/config.def.h
-index 83910c1..91a9cfc 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -3,6 +3,11 @@
- /* appearance */
- static const unsigned int borderpx  = 1;        /* border pixel of windows */
- static const unsigned int snap      = 32;       /* snap pixel */
-+static const unsigned int gappih    = 20;       /* horiz inner gap between windows */
-+static const unsigned int gappiv    = 10;       /* vert inner gap between windows */
-+static const unsigned int gappoh    = 10;       /* horiz outer gap between windows and screen edge */
-+static const unsigned int gappov    = 30;       /* vert outer gap between windows and screen edge */
-+static       int smartgaps          = 0;        /* 1 means no outer gap when there is only one window */
- static const int showbar            = 1;        /* 0 means no bar */
- static const int topbar             = 1;        /* 0 means bottom bar */
- static const char *fonts[]          = { "monospace:size=10" };
-@@ -36,11 +41,26 @@ static const float mfact     = 0.55; /* factor of master area size [0.05..0.95]
- static const int nmaster     = 1;    /* number of clients in master area */
- static const int resizehints = 1;    /* 1 means respect size hints in tiled resizals */
- 
-+#define FORCE_VSPLIT 1  /* nrowgrid layout: force two clients to always split vertically */
-+#include "vanitygaps.c"
-+
- static const Layout layouts[] = {
-     /* symbol     arrange function */
-     { "[]=",      tile },    /* first entry is default */
--    { "><>",      NULL },    /* no layout function means floating behavior */
-     { "[M]",      monocle },
-+    { "[@]",      spiral },
-+    { "[\\]",     dwindle },
-+    { "H[]",      deck },
-+    { "TTT",      bstack },
-+    { "===",      bstackhoriz },
-+    { "HHH",      grid },
-+    { "###",      nrowgrid },
-+    { "---",      horizgrid },
-+    { ":::",      gaplessgrid },
-+    { "|M|",      centeredmaster },
-+    { ">M>",      centeredfloatingmaster },
-+    { "><>",      NULL },    /* no layout function means floating behavior */
-+    { NULL,       NULL },
- };
- 
- /* key definitions */
-@@ -74,6 +94,22 @@ static Key keys[] = {
-     { MODKEY|ShiftMask,             XK_l,      setcfact,       {.f = -0.25} },
-     { MODKEY|ShiftMask,             XK_o,      setcfact,       {.f =  0.00} },
-     { MODKEY,                       XK_Return, zoom,           {0} },
-+    { MODKEY|Mod4Mask,              XK_u,      incrgaps,       {.i = +1 } },
-+    { MODKEY|Mod4Mask|ShiftMask,    XK_u,      incrgaps,       {.i = -1 } },
-+    { MODKEY|Mod4Mask,              XK_i,      incrigaps,      {.i = +1 } },
-+    { MODKEY|Mod4Mask|ShiftMask,    XK_i,      incrigaps,      {.i = -1 } },
-+    { MODKEY|Mod4Mask,              XK_o,      incrogaps,      {.i = +1 } },
-+    { MODKEY|Mod4Mask|ShiftMask,    XK_o,      incrogaps,      {.i = -1 } },
-+    { MODKEY|Mod4Mask,              XK_6,      incrihgaps,     {.i = +1 } },
-+    { MODKEY|Mod4Mask|ShiftMask,    XK_6,      incrihgaps,     {.i = -1 } },
-+    { MODKEY|Mod4Mask,              XK_7,      incrivgaps,     {.i = +1 } },
-+    { MODKEY|Mod4Mask|ShiftMask,    XK_7,      incrivgaps,     {.i = -1 } },
-+    { MODKEY|Mod4Mask,              XK_8,      incrohgaps,     {.i = +1 } },
-+    { MODKEY|Mod4Mask|ShiftMask,    XK_8,      incrohgaps,     {.i = -1 } },
-+    { MODKEY|Mod4Mask,              XK_9,      incrovgaps,     {.i = +1 } },
-+    { MODKEY|Mod4Mask|ShiftMask,    XK_9,      incrovgaps,     {.i = -1 } },
-+    { MODKEY|Mod4Mask,              XK_0,      togglegaps,     {0} },
-+    { MODKEY|Mod4Mask|ShiftMask,    XK_0,      defaultgaps,    {0} },
-     { MODKEY,                       XK_Tab,    view,           {0} },
-     { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
-     { MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
-diff --git a/dwm.c b/dwm.c
-index 5592c57..7d503cb 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -120,6 +120,10 @@ struct Monitor {
-     int by;               /* bar geometry */
-     int mx, my, mw, mh;   /* screen size */
-     int wx, wy, ww, wh;   /* window area  */
-+    int gappih;           /* horizontal gap between windows */
-+    int gappiv;           /* vertical gap between windows */
-+    int gappoh;           /* horizontal outer gaps */
-+    int gappov;           /* vertical outer gaps */
-     unsigned int seltags;
-     unsigned int sellt;
-     unsigned int tagset[2];
-@@ -210,7 +214,6 @@ static void sigchld(int unused);
- static void spawn(const Arg *arg);
- static void tag(const Arg *arg);
- static void tagmon(const Arg *arg);
--static void tile(Monitor *);
- static void togglebar(const Arg *arg);
- static void togglefloating(const Arg *arg);
- static void toggletag(const Arg *arg);
-@@ -640,6 +643,10 @@ createmon(void)
-     m->nmaster = nmaster;
-     m->showbar = showbar;
-     m->topbar = topbar;
-+    m->gappih = gappih;
-+    m->gappiv = gappiv;
-+    m->gappoh = gappoh;
-+    m->gappov = gappov;
-     m->lt[0] = &layouts[0];
-     m->lt[1] = &layouts[1 % LENGTH(layouts)];
-     strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-@@ -1691,40 +1698,6 @@ tagmon(const Arg *arg)
-     sendmon(selmon->sel, dirtomon(arg->i));
- }
- 
--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++) {
--        if (n < m->nmaster)
--            mfacts += c->cfact;
--        else
--            sfacts += c->cfact;
--    }
--    if (n == 0)
--        return;
--
--    if (n > m->nmaster)
--        mw = m->nmaster ? m->ww * m->mfact : 0;
--    else
--        mw = m->ww;
--    for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
--        if (i < m->nmaster) {
--            h = (m->wh - my) * (c->cfact / mfacts);
--            resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
--            my += HEIGHT(c);
--            mfacts -= c->cfact;
--        } else {
--            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);
--            ty += HEIGHT(c);
--            sfacts -= c->cfact;
--        }
--}
--
- void
- togglebar(const Arg *arg)
- {
-diff --git a/vanitygaps.c b/vanitygaps.c
-new file mode 100644
-index 0000000..1a816b6
---- /dev/null
-+++ b/vanitygaps.c
-@@ -0,0 +1,822 @@
-+/* Key binding functions */
-+static void defaultgaps(const Arg *arg);
-+static void incrgaps(const Arg *arg);
-+static void incrigaps(const Arg *arg);
-+static void incrogaps(const Arg *arg);
-+static void incrohgaps(const Arg *arg);
-+static void incrovgaps(const Arg *arg);
-+static void incrihgaps(const Arg *arg);
-+static void incrivgaps(const Arg *arg);
-+static void togglegaps(const Arg *arg);
-+/* Layouts (delete the ones you do not need) */
-+static void bstack(Monitor *m);
-+static void bstackhoriz(Monitor *m);
-+static void centeredmaster(Monitor *m);
-+static void centeredfloatingmaster(Monitor *m);
-+static void deck(Monitor *m);
-+static void dwindle(Monitor *m);
-+static void fibonacci(Monitor *m, int s);
-+static void grid(Monitor *m);
-+static void nrowgrid(Monitor *m);
-+static void spiral(Monitor *m);
-+static void tile(Monitor *m);
-+/* Internals */
-+static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc);
-+static void getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr);
-+static void setgaps(int oh, int ov, int ih, int iv);
-+
-+/* Settings */
-+#if !PERTAG_PATCH
-+static int enablegaps = 1;
-+#endif // PERTAG_PATCH
-+
-+void
-+setgaps(int oh, int ov, int ih, int iv)
-+{
-+    if (oh < 0) oh = 0;
-+    if (ov < 0) ov = 0;
-+    if (ih < 0) ih = 0;
-+    if (iv < 0) iv = 0;
-+
-+    selmon->gappoh = oh;
-+    selmon->gappov = ov;
-+    selmon->gappih = ih;
-+    selmon->gappiv = iv;
-+    arrange(selmon);
-+}
-+
-+void
-+togglegaps(const Arg *arg)
-+{
-+    #if PERTAG_PATCH
-+    selmon->pertag->enablegaps[selmon->pertag->curtag] = !selmon->pertag->enablegaps[selmon->pertag->curtag];
-+    #else
-+    enablegaps = !enablegaps;
-+    #endif // PERTAG_PATCH
-+    arrange(NULL);
-+}
-+
-+void
-+defaultgaps(const Arg *arg)
-+{
-+    setgaps(gappoh, gappov, gappih, gappiv);
-+}
-+
-+void
-+incrgaps(const Arg *arg)
-+{
-+    setgaps(
-+        selmon->gappoh + arg->i,
-+        selmon->gappov + arg->i,
-+        selmon->gappih + arg->i,
-+        selmon->gappiv + arg->i
-+    );
-+}
-+
-+void
-+incrigaps(const Arg *arg)
-+{
-+    setgaps(
-+        selmon->gappoh,
-+        selmon->gappov,
-+        selmon->gappih + arg->i,
-+        selmon->gappiv + arg->i
-+    );
-+}
-+
-+void
-+incrogaps(const Arg *arg)
-+{
-+    setgaps(
-+        selmon->gappoh + arg->i,
-+        selmon->gappov + arg->i,
-+        selmon->gappih,
-+        selmon->gappiv
-+    );
-+}
-+
-+void
-+incrohgaps(const Arg *arg)
-+{
-+    setgaps(
-+        selmon->gappoh + arg->i,
-+        selmon->gappov,
-+        selmon->gappih,
-+        selmon->gappiv
-+    );
-+}
-+
-+void
-+incrovgaps(const Arg *arg)
-+{
-+    setgaps(
-+        selmon->gappoh,
-+        selmon->gappov + arg->i,
-+        selmon->gappih,
-+        selmon->gappiv
-+    );
-+}
-+
-+void
-+incrihgaps(const Arg *arg)
-+{
-+    setgaps(
-+        selmon->gappoh,
-+        selmon->gappov,
-+        selmon->gappih + arg->i,
-+        selmon->gappiv
-+    );
-+}
-+
-+void
-+incrivgaps(const Arg *arg)
-+{
-+    setgaps(
-+        selmon->gappoh,
-+        selmon->gappov,
-+        selmon->gappih,
-+        selmon->gappiv + arg->i
-+    );
-+}
-+
-+void
-+getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc)
-+{
-+    unsigned int n, oe, ie;
-+    #if PERTAG_PATCH
-+    oe = ie = selmon->pertag->enablegaps[selmon->pertag->curtag];
-+    #else
-+    oe = ie = enablegaps;
-+    #endif // PERTAG_PATCH
-+    Client *c;
-+
-+    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
-+    if (smartgaps && n == 1) {
-+        oe = 0; // outer gaps disabled when only one client
-+    }
-+
-+    *oh = m->gappoh*oe; // outer horizontal gap
-+    *ov = m->gappov*oe; // outer vertical gap
-+    *ih = m->gappih*ie; // inner horizontal gap
-+    *iv = m->gappiv*ie; // inner vertical gap
-+    *nc = n;            // number of clients
-+}
-+
-+void
-+getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr)
-+{
-+    unsigned int n;
-+    float mfacts = 0, sfacts = 0;
-+    int mtotal = 0, stotal = 0;
-+    Client *c;
-+
-+    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
-+        if (n < m->nmaster)
-+            mfacts += c->cfact;
-+        else
-+            sfacts += c->cfact;
-+
-+    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
-+        if (n < m->nmaster)
-+            mtotal += msize * (c->cfact / mfacts);
-+        else
-+            stotal += ssize * (c->cfact / sfacts);
-+
-+    *mf = mfacts; // total factor of master area
-+    *sf = sfacts; // total factor of stack area
-+    *mr = msize - mtotal; // the remainder (rest) of pixels after a cfacts master split
-+    *sr = ssize - stotal; // the remainder (rest) of pixels after a cfacts stack split
-+}
-+
-+/***
-+ * Layouts
-+ */
-+
-+/*
-+ * Bottomstack layout + gaps
-+ * https://dwm.suckless.org/patches/bottomstack/
-+ */
-+static void
-+bstack(Monitor *m)
-+{
-+    unsigned int i, n;
-+    int oh, ov, ih, iv;
-+    int mx = 0, my = 0, mh = 0, mw = 0;
-+    int sx = 0, sy = 0, sh = 0, sw = 0;
-+    float mfacts, sfacts;
-+    int mrest, srest;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    sx = mx = m->wx + ov;
-+    sy = my = m->wy + oh;
-+    sh = mh = m->wh - 2*oh;
-+    mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
-+    sw = m->ww - 2*ov - iv * (n - m->nmaster - 1);
-+
-+    if (m->nmaster && n > m->nmaster) {
-+        sh = (mh - ih) * (1 - m->mfact);
-+        mh = mh - ih - sh;
-+        sx = mx;
-+        sy = my + mh + ih;
-+    }
-+
-+    getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
-+        if (i < m->nmaster) {
-+            resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
-+            mx += WIDTH(c) + iv;
-+        } else {
-+            resize(c, sx, sy, sw * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
-+            sx += WIDTH(c) + iv;
-+        }
-+    }
-+}
-+
-+static void
-+bstackhoriz(Monitor *m)
-+{
-+    unsigned int i, n;
-+    int oh, ov, ih, iv;
-+    int mx = 0, my = 0, mh = 0, mw = 0;
-+    int sx = 0, sy = 0, sh = 0, sw = 0;
-+    float mfacts, sfacts;
-+    int mrest, srest;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    sx = mx = m->wx + ov;
-+    sy = my = m->wy + oh;
-+    mh = m->wh - 2*oh;
-+    sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
-+    mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
-+    sw = m->ww - 2*ov;
-+
-+    if (m->nmaster && n > m->nmaster) {
-+        sh = (mh - ih) * (1 - m->mfact);
-+        mh = mh - ih - sh;
-+        sy = my + mh + ih;
-+        sh = m->wh - mh - 2*oh - ih * (n - m->nmaster);
-+    }
-+
-+    getfacts(m, mw, sh, &mfacts, &sfacts, &mrest, &srest);
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
-+        if (i < m->nmaster) {
-+            resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
-+            mx += WIDTH(c) + iv;
-+        } else {
-+            resize(c, sx, sy, sw - (2*c->bw), sh * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0);
-+            sy += HEIGHT(c) + ih;
-+        }
-+    }
-+}
-+
-+/*
-+ * Centred master layout + gaps
-+ * https://dwm.suckless.org/patches/centeredmaster/
-+ */
-+void
-+centeredmaster(Monitor *m)
-+{
-+    unsigned int i, n;
-+    int oh, ov, ih, iv;
-+    int mx = 0, my = 0, mh = 0, mw = 0;
-+    int lx = 0, ly = 0, lw = 0, lh = 0;
-+    int rx = 0, ry = 0, rw = 0, rh = 0;
-+    float mfacts = 0, lfacts = 0, rfacts = 0;
-+    int mtotal = 0, ltotal = 0, rtotal = 0;
-+    int mrest = 0, lrest = 0, rrest = 0;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    /* initialize areas */
-+    mx = m->wx + ov;
-+    my = m->wy + oh;
-+    mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1);
-+    mw = m->ww - 2*ov;
-+    lh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - 1);
-+    rh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1));
-+
-+    if (m->nmaster && n > m->nmaster) {
-+        /* go mfact box in the center if more than nmaster clients */
-+        if (n - m->nmaster > 1) {
-+            /* ||<-S->|<---M--->|<-S->|| */
-+            mw = (m->ww - 2*ov - 2*iv) * m->mfact;
-+            lw = (m->ww - mw - 2*ov - 2*iv) / 2;
-+            rw = (m->ww - mw - 2*ov - 2*iv) - lw;
-+            mx += lw + iv;
-+        } else {
-+            /* ||<---M--->|<-S->|| */
-+            mw = (mw - iv) * m->mfact;
-+            lw = 0;
-+            rw = m->ww - mw - iv - 2*ov;
-+        }
-+        lx = m->wx + ov;
-+        ly = m->wy + oh;
-+        rx = mx + mw + iv;
-+        ry = m->wy + oh;
-+    }
-+
-+    /* calculate facts */
-+    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
-+        if (!m->nmaster || n < m->nmaster)
-+            mfacts += c->cfact;
-+        else if ((n - m->nmaster) % 2)
-+            lfacts += c->cfact; // total factor of left hand stack area
-+        else
-+            rfacts += c->cfact; // total factor of right hand stack area
-+    }
-+
-+    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
-+        if (!m->nmaster || n < m->nmaster)
-+            mtotal += mh * (c->cfact / mfacts);
-+        else if ((n - m->nmaster) % 2)
-+            ltotal += lh * (c->cfact / lfacts);
-+        else
-+            rtotal += rh * (c->cfact / rfacts);
-+
-+    mrest = mh - mtotal;
-+    lrest = lh - ltotal;
-+    rrest = rh - rtotal;
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
-+        if (!m->nmaster || i < m->nmaster) {
-+            /* nmaster clients are stacked vertically, in the center of the screen */
-+            resize(c, mx, my, mw - (2*c->bw), mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
-+            my += HEIGHT(c) + ih;
-+        } else {
-+            /* stack clients are stacked vertically */
-+            if ((i - m->nmaster) % 2 ) {
-+                resize(c, lx, ly, lw - (2*c->bw), lh * (c->cfact / lfacts) + ((i - 2*m->nmaster) < 2*lrest ? 1 : 0) - (2*c->bw), 0);
-+                ly += HEIGHT(c) + ih;
-+            } else {
-+                resize(c, rx, ry, rw - (2*c->bw), rh * (c->cfact / rfacts) + ((i - 2*m->nmaster) < 2*rrest ? 1 : 0) - (2*c->bw), 0);
-+                ry += HEIGHT(c) + ih;
-+            }
-+        }
-+    }
-+}
-+
-+void
-+centeredfloatingmaster(Monitor *m)
-+{
-+    unsigned int i, n;
-+    float mfacts, sfacts;
-+    float mivf = 1.0; // master inner vertical gap factor
-+    int oh, ov, ih, iv, mrest, srest;
-+    int mx = 0, my = 0, mh = 0, mw = 0;
-+    int sx = 0, sy = 0, sh = 0, sw = 0;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    sx = mx = m->wx + ov;
-+    sy = my = m->wy + oh;
-+    sh = mh = m->wh - 2*oh;
-+    mw = m->ww - 2*ov - iv*(n - 1);
-+    sw = m->ww - 2*ov - iv*(n - m->nmaster - 1);
-+
-+    if (m->nmaster && n > m->nmaster) {
-+        mivf = 0.8;
-+        /* go mfact box in the center if more than nmaster clients */
-+        if (m->ww > m->wh) {
-+            mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmaster) - 1);
-+            mh = m->wh * 0.9;
-+        } else {
-+            mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) - 1);
-+            mh = m->wh * m->mfact;
-+        }
-+        mx = m->wx + (m->ww - mw) / 2;
-+        my = m->wy + (m->wh - mh - 2*oh) / 2;
-+
-+        sx = m->wx + ov;
-+        sy = m->wy + oh;
-+        sh = m->wh - 2*oh;
-+    }
-+
-+    getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-+        if (i < m->nmaster) {
-+            /* nmaster clients are stacked horizontally, in the center of the screen */
-+            resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
-+            mx += WIDTH(c) + iv*mivf;
-+        } else {
-+            /* stack clients are stacked horizontally */
-+            resize(c, sx, sy, sw * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
-+            sx += WIDTH(c) + iv;
-+        }
-+}
-+
-+/*
-+ * Deck layout + gaps
-+ * https://dwm.suckless.org/patches/deck/
-+ */
-+void
-+deck(Monitor *m)
-+{
-+    unsigned int i, n;
-+    int oh, ov, ih, iv;
-+    int mx = 0, my = 0, mh = 0, mw = 0;
-+    int sx = 0, sy = 0, sh = 0, sw = 0;
-+    float mfacts, sfacts;
-+    int mrest, srest;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    sx = mx = m->wx + ov;
-+    sy = my = m->wy + oh;
-+    sh = mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
-+    sw = mw = m->ww - 2*ov;
-+
-+    if (m->nmaster && n > m->nmaster) {
-+        sw = (mw - iv) * (1 - m->mfact);
-+        mw = mw - iv - sw;
-+        sx = mx + mw + iv;
-+        sh = m->wh - 2*oh;
-+    }
-+
-+    getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
-+
-+    if (n - m->nmaster > 0) /* override layout symbol */
-+        snprintf(m->ltsymbol, sizeof m->ltsymbol, "D %d", n - m->nmaster);
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-+        if (i < m->nmaster) {
-+            resize(c, mx, my, mw - (2*c->bw), mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
-+            my += HEIGHT(c) + ih;
-+        } else {
-+            resize(c, sx, sy, sw - (2*c->bw), sh - (2*c->bw), 0);
-+        }
-+}
-+
-+/*
-+ * Fibonacci layout + gaps
-+ * https://dwm.suckless.org/patches/fibonacci/
-+ */
-+void
-+fibonacci(Monitor *m, int s)
-+{
-+    unsigned int i, n;
-+    int nx, ny, nw, nh;
-+    int oh, ov, ih, iv;
-+    int nv, hrest = 0, wrest = 0, r = 1;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    nx = m->wx + ov;
-+    ny = m->wy + oh;
-+    nw = m->ww - 2*ov;
-+    nh = m->wh - 2*oh;
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
-+        if (r) {
-+            if ((i % 2 && (nh - ih) / 2 <= (bh + 2*c->bw))
-+               || (!(i % 2) && (nw - iv) / 2 <= (bh + 2*c->bw))) {
-+                r = 0;
-+            }
-+            if (r && i < n - 1) {
-+                if (i % 2) {
-+                    nv = (nh - ih) / 2;
-+                    hrest = nh - 2*nv - ih;
-+                    nh = nv;
-+                } else {
-+                    nv = (nw - iv) / 2;
-+                    wrest = nw - 2*nv - iv;
-+                    nw = nv;
-+                }
-+
-+                if ((i % 4) == 2 && !s)
-+                    nx += nw + iv;
-+                else if ((i % 4) == 3 && !s)
-+                    ny += nh + ih;
-+            }
-+
-+            if ((i % 4) == 0) {
-+                if (s) {
-+                    ny += nh + ih;
-+                    nh += hrest;
-+                }
-+                else {
-+                    nh -= hrest;
-+                    ny -= nh + ih;
-+                }
-+            }
-+            else if ((i % 4) == 1) {
-+                nx += nw + iv;
-+                nw += wrest;
-+            }
-+            else if ((i % 4) == 2) {
-+                ny += nh + ih;
-+                nh += hrest;
-+                if (i < n - 1)
-+                    nw += wrest;
-+            }
-+            else if ((i % 4) == 3) {
-+                if (s) {
-+                    nx += nw + iv;
-+                    nw -= wrest;
-+                } else {
-+                    nw -= wrest;
-+                    nx -= nw + iv;
-+                    nh += hrest;
-+                }
-+            }
-+            if (i == 0)    {
-+                if (n != 1) {
-+                    nw = (m->ww - iv - 2*ov) - (m->ww - iv - 2*ov) * (1 - m->mfact);
-+                    wrest = 0;
-+                }
-+                ny = m->wy + oh;
-+            }
-+            else if (i == 1)
-+                nw = m->ww - nw - iv - 2*ov;
-+            i++;
-+        }
-+
-+        resize(c, nx, ny, nw - (2*c->bw), nh - (2*c->bw), False);
-+    }
-+}
-+
-+void
-+dwindle(Monitor *m)
-+{
-+    fibonacci(m, 1);
-+}
-+
-+void
-+spiral(Monitor *m)
-+{
-+    fibonacci(m, 0);
-+}
-+
-+/*
-+ * Gappless grid layout + gaps (ironically)
-+ * https://dwm.suckless.org/patches/gaplessgrid/
-+ */
-+void
-+gaplessgrid(Monitor *m)
-+{
-+    unsigned int i, n;
-+    int x, y, cols, rows, ch, cw, cn, rn, rrest, crest; // counters
-+    int oh, ov, ih, iv;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    /* grid dimensions */
-+    for (cols = 0; cols <= n/2; cols++)
-+        if (cols*cols >= n)
-+            break;
-+    if (n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
-+        cols = 2;
-+    rows = n/cols;
-+    cn = rn = 0; // reset column no, row no, client count
-+
-+    ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
-+    cw = (m->ww - 2*ov - iv * (cols - 1)) / cols;
-+    rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
-+    crest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
-+    x = m->wx + ov;
-+    y = m->wy + oh;
-+
-+    for (i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
-+        if (i/rows + 1 > cols - n%cols) {
-+            rows = n/cols + 1;
-+            ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
-+            rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
-+        }
-+        resize(c,
-+            x,
-+            y + rn*(ch + ih) + MIN(rn, rrest),
-+            cw + (cn < crest ? 1 : 0) - 2*c->bw,
-+            ch + (rn < rrest ? 1 : 0) - 2*c->bw,
-+            0);
-+        rn++;
-+        if (rn >= rows) {
-+            rn = 0;
-+            x += cw + ih + (cn < crest ? 1 : 0);
-+            cn++;
-+        }
-+    }
-+}
-+
-+/*
-+ * Gridmode layout + gaps
-+ * https://dwm.suckless.org/patches/gridmode/
-+ */
-+void
-+grid(Monitor *m)
-+{
-+    unsigned int i, n;
-+    int cx, cy, cw, ch, cc, cr, chrest, cwrest, cols, rows;
-+    int oh, ov, ih, iv;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+
-+    /* grid dimensions */
-+    for (rows = 0; rows <= n/2; rows++)
-+        if (rows*rows >= n)
-+            break;
-+    cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
-+
-+    /* window geoms (cell height/width) */
-+    ch = (m->wh - 2*oh - ih * (rows - 1)) / (rows ? rows : 1);
-+    cw = (m->ww - 2*ov - iv * (cols - 1)) / (cols ? cols : 1);
-+    chrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
-+    cwrest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
-+        cc = i / rows;
-+        cr = i % rows;
-+        cx = m->wx + ov + cc * (cw + iv) + MIN(cc, cwrest);
-+        cy = m->wy + oh + cr * (ch + ih) + MIN(cr, chrest);
-+        resize(c, cx, cy, cw + (cc < cwrest ? 1 : 0) - 2*c->bw, ch + (cr < chrest ? 1 : 0) - 2*c->bw, False);
-+    }
-+}
-+
-+/*
-+ * Horizontal grid layout + gaps
-+ * https://dwm.suckless.org/patches/horizgrid/
-+ */
-+void
-+horizgrid(Monitor *m) {
-+    Client *c;
-+    unsigned int n, i;
-+    int oh, ov, ih, iv;
-+    int mx = 0, my = 0, mh = 0, mw = 0;
-+    int sx = 0, sy = 0, sh = 0, sw = 0;
-+    int ntop, nbottom = 1;
-+    float mfacts = 0, sfacts = 0;
-+    int mrest, srest, mtotal = 0, stotal = 0;
-+
-+    /* Count windows */
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    if (n <= 2)
-+        ntop = n;
-+    else {
-+        ntop = n / 2;
-+        nbottom = n - ntop;
-+    }
-+    sx = mx = m->wx + ov;
-+    sy = my = m->wy + oh;
-+    sh = mh = m->wh - 2*oh;
-+    sw = mw = m->ww - 2*ov;
-+
-+    if (n > ntop) {
-+        sh = (mh - ih) / 2;
-+        mh = mh - ih - sh;
-+        sy = my + mh + ih;
-+        mw = m->ww - 2*ov - iv * (ntop - 1);
-+        sw = m->ww - 2*ov - iv * (nbottom - 1);
-+    }
-+
-+    /* calculate facts */
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-+        if (i < ntop)
-+            mfacts += c->cfact;
-+        else
-+            sfacts += c->cfact;
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-+        if (i < ntop)
-+            mtotal += mh * (c->cfact / mfacts);
-+        else
-+            stotal += sw * (c->cfact / sfacts);
-+
-+    mrest = mh - mtotal;
-+    srest = sw - stotal;
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-+        if (i < ntop) {
-+            resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
-+            mx += WIDTH(c) + iv;
-+        } else {
-+            resize(c, sx, sy, sw * (c->cfact / sfacts) + ((i - ntop) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
-+            sx += WIDTH(c) + iv;
-+        }
-+}
-+
-+/*
-+ * nrowgrid layout + gaps
-+ * https://dwm.suckless.org/patches/nrowgrid/
-+ */
-+void
-+nrowgrid(Monitor *m)
-+{
-+    unsigned int n;
-+    int ri = 0, ci = 0;  /* counters */
-+    int oh, ov, ih, iv;                         /* vanitygap settings */
-+    unsigned int cx, cy, cw, ch;                /* client geometry */
-+    unsigned int uw = 0, uh = 0, uc = 0;        /* utilization trackers */
-+    unsigned int cols, rows = m->nmaster + 1;
-+    Client *c;
-+
-+    /* count clients */
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+
-+    /* nothing to do here */
-+    if (n == 0)
-+        return;
-+
-+    /* force 2 clients to always split vertically */
-+    if (FORCE_VSPLIT && n == 2)
-+        rows = 1;
-+
-+    /* never allow empty rows */
-+    if (n < rows)
-+        rows = n;
-+
-+    /* define first row */
-+    cols = n / rows;
-+    uc = cols;
-+    cy = m->wy + oh;
-+    ch = (m->wh - 2*oh - ih*(rows - 1)) / rows;
-+    uh = ch;
-+
-+    for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++) {
-+        if (ci == cols) {
-+            uw = 0;
-+            ci = 0;
-+            ri++;
-+
-+            /* next row */
-+            cols = (n - uc) / (rows - ri);
-+            uc += cols;
-+            cy = m->wy + oh + uh + ih;
-+            uh += ch + ih;
-+        }
-+
-+        cx = m->wx + ov + uw;
-+        cw = (m->ww - 2*ov - uw) / (cols - ci);
-+        uw += cw + iv;
-+
-+        resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0);
-+    }
-+}
-+
-+/*
-+ * Default tile layout + gaps
-+ */
-+static void
-+tile(Monitor *m)
-+{
-+    unsigned int i, n;
-+    int oh, ov, ih, iv;
-+    int mx = 0, my = 0, mh = 0, mw = 0;
-+    int sx = 0, sy = 0, sh = 0, sw = 0;
-+    float mfacts, sfacts;
-+    int mrest, srest;
-+    Client *c;
-+
-+    getgaps(m, &oh, &ov, &ih, &iv, &n);
-+    if (n == 0)
-+        return;
-+
-+    sx = mx = m->wx + ov;
-+    sy = my = m->wy + oh;
-+    mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
-+    sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
-+    sw = mw = m->ww - 2*ov;
-+
-+    if (m->nmaster && n > m->nmaster) {
-+        sw = (mw - iv) * (1 - m->mfact);
-+        mw = mw - iv - sw;
-+        sx = mx + mw + iv;
-+    }
-+
-+    getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
-+
-+    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-+        if (i < m->nmaster) {
-+            resize(c, mx, my, mw - (2*c->bw), mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
-+            my += HEIGHT(c) + ih;
-+        } else {
-+            resize(c, sx, sy, sw - (2*c->bw), sh * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0);
-+            sy += HEIGHT(c) + ih;
-+        }
-+}
-\ No newline at end of file
--- 
-2.19.1
-
diff --git a/.config/dwm/patches/dwm-combo-6.1.diff b/.config/dwm/patches/dwm-combo-6.1.diff
@@ -1,75 +0,0 @@
-diff --git a/dwm.c b/dwm.c
-index 0362114..40b7a99 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -234,6 +234,11 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee);
- static int xerrorstart(Display *dpy, XErrorEvent *ee);
- static void zoom(const Arg *arg);
- 
-+static void keyrelease(XEvent *e);
-+static void combotag(const Arg *arg);
-+static void comboview(const Arg *arg);
-+
-+
- /* variables */
- static const char broken[] = "broken";
- static char stext[256];
-@@ -244,6 +249,7 @@ static int (*xerrorxlib)(Display *, XErrorEvent *);
- static unsigned int numlockmask = 0;
- static void (*handler[LASTEvent]) (XEvent *) = {
-     [ButtonPress] = buttonpress,
-+    [ButtonRelease] = keyrelease,
-     [ClientMessage] = clientmessage,
-     [ConfigureRequest] = configurerequest,
-     [ConfigureNotify] = configurenotify,
-@@ -251,6 +257,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
-     [EnterNotify] = enternotify,
-     [Expose] = expose,
-     [FocusIn] = focusin,
-+    [KeyRelease] = keyrelease,
-     [KeyPress] = keypress,
-     [MappingNotify] = mappingnotify,
-     [MapRequest] = maprequest,
-@@ -274,6 +281,42 @@ static Window root;
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
- 
- /* function implementations */
-+static int combo = 0;
-+
-+void
-+keyrelease(XEvent *e) {
-+    combo = 0;
-+}
-+
-+void
-+combotag(const Arg *arg) {
-+    if(selmon->sel && arg->ui & TAGMASK) {
-+        if (combo) {
-+            selmon->sel->tags |= arg->ui & TAGMASK;
-+        } else {
-+            combo = 1;
-+            selmon->sel->tags = arg->ui & TAGMASK;
-+        }
-+        focus(NULL);
-+        arrange(selmon);
-+    }
-+}
-+
-+void
-+comboview(const Arg *arg) {
-+    unsigned newtags = arg->ui & TAGMASK;
-+    if (combo) {
-+        selmon->tagset[selmon->seltags] |= newtags;
-+    } else {
-+        selmon->seltags ^= 1;    /*toggle tagset*/
-+        combo = 1;
-+        if (newtags)
-+            selmon->tagset[selmon->seltags] = newtags;
-+    }
-+    focus(NULL);
-+    arrange(selmon);
-+}
-+
- void
- applyrules(Client *c)
- {
diff --git a/.config/dwm/patches/dwm-defaulttransparency-r1521.diff b/.config/dwm/patches/dwm-defaulttransparency-r1521.diff
@@ -1,73 +0,0 @@
-diff -r 53d98940cb04 config.def.h
---- a/config.def.h    Fri Jun 04 11:41:16 2010 +0100
-+++ b/config.def.h    Sun Jun 06 22:48:32 2010 +0200
-@@ -12,14 +12,16 @@
- static const unsigned int snap      = 32;       /* snap pixel */
- static const Bool showbar           = True;     /* False means no bar */
- static const Bool topbar            = True;     /* False means bottom bar */
-+static const double defaultopacity  = 0.75;
-@@ -52,6 +54,9 @@
-     /* modifier                     key        function        argument */
-     { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
-     { MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
-+    { MODKEY|ShiftMask,        XK_s,       spawn,       SHCMD("transset-df -a --dec .1") },
-+    { MODKEY|ShiftMask,        XK_d,       spawn,       SHCMD("transset-df -a --inc .1") },
-+    { MODKEY|ShiftMask,        XK_f,       spawn,       SHCMD("transset-df -a .75") },
-     { MODKEY,                       XK_b,      togglebar,      {0} },
-     { MODKEY,                       XK_j,      focusstack,     {.i = +1 } },
-     { MODKEY,                       XK_k,      focusstack,     {.i = -1 } },
-diff -r 53d98940cb04 dwm.c
---- a/dwm.c    Fri Jun 04 11:41:16 2010 +0100
-+++ b/dwm.c    Sun Jun 06 22:48:32 2010 +0200
-@@ -58,7 +58,7 @@
- enum { CurNormal, CurResize, CurMove, CurLast };        /* cursor */
- enum { ColBorder, ColFG, ColBG, ColLast };              /* color */
- enum { NetSupported, NetWMName, NetWMState,
--       NetWMFullscreen, NetLast };                      /* EWMH atoms */
-+       NetWMFullscreen, NetLast, NetWMWindowsOpacity }; /* EWMH atoms */
- enum { WMProtocols, WMDelete, WMState, WMLast };        /* default atoms */
- enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
-        ClkClientWin, ClkRootWin, ClkLast };             /* clicks */
-@@ -179,6 +179,7 @@
- static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
- static void enternotify(XEvent *e);
- static void expose(XEvent *e);
-+static void opacity(Client *c, double opacity);
- static void focus(Client *c);
- static void focusin(XEvent *e);
- static void focusmon(const Arg *arg);
-@@ -816,6 +817,18 @@
- }
- 
- void
-+opacity(Client *c, double opacity)
-+{
-+    if(opacity >= 0 && opacity <= 1) {
-+        unsigned long real_opacity[] = { opacity * 0xffffffff };
-+        XChangeProperty(dpy, c->win, netatom[NetWMWindowsOpacity], XA_CARDINAL,
-+                32, PropModeReplace, (unsigned char *)real_opacity,
-+                1);
-+    } else
-+        XDeleteProperty(dpy, c->win, netatom[NetWMWindowsOpacity]);
-+}
-+
-+void
- focus(Client *c) {
-     if(!c || !ISVISIBLE(c))
-         for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext);
-@@ -1104,6 +1117,7 @@
-     *c = cz;
-     c->win = w;
-     updatetitle(c);
-+    opacity(c, defaultopacity);
-     if(XGetTransientForHint(dpy, w, &trans))
-         t = wintoclient(trans);
-     if(t) {
-@@ -1539,6 +1553,7 @@
-     netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
-     netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
-     netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False);
-+    netatom[NetWMWindowsOpacity] = XInternAtom(dpy, "_NET_WM_WINDOW_OPACITY", False);
-     /* init cursors */
-     cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
-     cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
diff --git a/.config/dwm/patches/dwm-fixborders-6.2.diff b/.config/dwm/patches/dwm-fixborders-6.2.diff
@@ -1,27 +0,0 @@
-From 1529909466206016f2101457bbf37c67195714c8 Mon Sep 17 00:00:00 2001
-From: Jakub Leszczak <szatan@gecc.xyz>
-Date: Fri, 22 Nov 2019 10:46:53 +0800
-Subject: [PATCH] Fix transparent borders
-
-When terminal has transparency then its borders also become transparent.
-Fix it by removing transparency from any pixels drawn.
----
- drw.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/drw.c b/drw.c
-index 8fd1ca4..490a592 100644
---- a/drw.c
-+++ b/drw.c
-@@ -202,6 +202,8 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
-                            DefaultColormap(drw->dpy, drw->screen),
-                            clrname, dest))
-         die("error, cannot allocate color '%s'", clrname);
-+
-+    dest->pixel |= 0xff << 24;
- }
- 
- /* Wrapper to create color schemes. The caller has to call free(3) on the
--- 
-2.26.2
-
diff --git a/.config/dwm/patches/dwm-floatrules-6.2.diff b/.config/dwm/patches/dwm-floatrules-6.2.diff
@@ -1,64 +0,0 @@
-diff -u dwm/config.def.h dwmnew/config.def.h
---- dwm/config.def.h    2020-03-01 19:10:06.676821764 +1300
-+++ dwmnew/config.def.h    2020-03-01 19:29:26.276901430 +1300
-@@ -26,9 +26,9 @@
-      *    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   monitor    float x,y,w,h         floatborderpx*/
-+    { "Gimp",     NULL,       NULL,       0,            1,           -1,        50,50,500,500,        5 },
-+    { "Firefox",  NULL,       NULL,       1 << 8,       0,           -1,        50,50,500,500,        5 },
- };
- 
- /* layout(s) */
-Only in dwmnew: config.h
-Only in dwmnew: drw.o
-diff -u dwm/dwm.c dwmnew/dwm.c
---- dwm/dwm.c    2020-03-01 19:10:06.680155097 +1300
-+++ dwmnew/dwm.c    2020-03-01 19:28:26.793564016 +1300
-@@ -93,6 +93,7 @@
-     int bw, oldbw;
-     unsigned int tags;
-     int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
-+    int floatborderpx;
-     Client *next;
-     Client *snext;
-     Monitor *mon;
-@@ -139,6 +140,8 @@
-     unsigned int tags;
-     int isfloating;
-     int monitor;
-+    int floatx, floaty, floatw, floath;
-+    int floatborderpx;
- } Rule;
- 
- /* function declarations */
-@@ -299,6 +302,13 @@
-         {
-             c->isfloating = r->isfloating;
-             c->tags |= r->tags;
-+            c->floatborderpx = r->floatborderpx;
-+            if (r->isfloating) {
-+                c->x = r->floatx;
-+                c->y = r->floaty;
-+                c->w = r->floatw;
-+                c->h = r->floath;
-+            }
-             for (m = mons; m && m->num != r->monitor; m = m->next);
-             if (m)
-                 c->mon = m;
-@@ -1281,7 +1291,10 @@
-     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;
-+    if (c->isfloating)
-+        wc.border_width = c->floatborderpx;
-+    else
-+        wc.border_width = c->bw;
-     XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
-     configure(c);
-     XSync(dpy, False);
diff --git a/.config/dwm/patches/dwm-fullgaps-20200508-7b77734.diff b/.config/dwm/patches/dwm-fullgaps-20200508-7b77734.diff
@@ -1,138 +0,0 @@
-From 7b7773458c072e4b24d6ea32d0364a8e402e4a43 Mon Sep 17 00:00:00 2001
-From: swy7ch <swy7ch@protonmail.com>
-Date: Fri, 8 May 2020 19:07:24 +0200
-Subject: [PATCH] [PATCH] update dwm-fullgaps patch to be used with tile layout
- update
-
-the recent tile layout changes in commit HEAD~1 (f09418b) broke the
-patch
-
-this patch adapt the new `if` statements to take gaps into account
-
-this patch also provides manpage entries for the keybindings
----
- config.def.h |  4 ++++
- dwm.1        | 10 ++++++++++
- dwm.c        | 33 +++++++++++++++++++++++----------
- 3 files changed, 37 insertions(+), 10 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..38d2f6c 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     = 5;        /* 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 */
-@@ -84,6 +85,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_minus,  setgaps,        {.i = -1 } },
-+    { MODKEY,                       XK_equal,  setgaps,        {.i = +1 } },
-+    { MODKEY|ShiftMask,             XK_equal,  setgaps,        {.i = 0  } },
-     TAGKEYS(                        XK_1,                      0)
-     TAGKEYS(                        XK_2,                      1)
-     TAGKEYS(                        XK_3,                      2)
-diff --git a/dwm.1 b/dwm.1
-index 13b3729..0202d96 100644
---- a/dwm.1
-+++ b/dwm.1
-@@ -140,6 +140,16 @@ View all windows with any tag.
- .B Mod1\-Control\-[1..n]
- Add/remove all windows with nth tag to/from the view.
- .TP
-+.B Mod1\--
-+Decrease the gaps around windows.
-+.TP
-+.B Mod1\-=
-+Increase the gaps around windows.
-+.TP
-+.B Mod1\-Shift-=
-+Reset the gaps around windows to
-+.BR 0 .
-+.TP
- .B Mod1\-Shift\-q
- Quit dwm.
- .SS Mouse commands
-diff --git a/dwm.c b/dwm.c
-index 9fd0286..45a58f3 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -119,6 +119,7 @@ struct Monitor {
-     int by;               /* bar geometry */
-     int mx, my, mw, mh;   /* screen size */
-     int wx, wy, ww, wh;   /* window area  */
-+    int gappx;            /* gaps between windows */
-     unsigned int seltags;
-     unsigned int sellt;
-     unsigned int tagset[2];
-@@ -200,6 +201,7 @@ static void sendmon(Client *c, Monitor *m);
- static void setclientstate(Client *c, long state);
- static void setfocus(Client *c);
- static void setfullscreen(Client *c, int fullscreen);
-+static void setgaps(const Arg *arg);
- static void setlayout(const Arg *arg);
- static void setmfact(const Arg *arg);
- static void setup(void);
-@@ -639,6 +641,7 @@ createmon(void)
-     m->nmaster = nmaster;
-     m->showbar = showbar;
-     m->topbar = topbar;
-+    m->gappx = gappx;
-     m->lt[0] = &layouts[0];
-     m->lt[1] = &layouts[1 % LENGTH(layouts)];
-     strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-@@ -1498,6 +1501,16 @@ setfullscreen(Client *c, int fullscreen)
-     }
- }
- 
-+void
-+setgaps(const Arg *arg)
-+{
-+    if ((arg->i == 0) || (selmon->gappx + arg->i < 0))
-+        selmon->gappx = 0;
-+    else
-+        selmon->gappx += arg->i;
-+    arrange(selmon);
-+}
-+
- void
- setlayout(const Arg *arg)
- {
-@@ -1684,18 +1697,18 @@ tile(Monitor *m)
-     if (n > m->nmaster)
-         mw = m->nmaster ? m->ww * m->mfact : 0;
-     else
--        mw = m->ww;
--    for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-+        mw = m->ww - m->gappx;
-+    for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-         if (i < m->nmaster) {
--            h = (m->wh - my) / (MIN(n, m->nmaster) - i);
--            resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0);
--            if (my + HEIGHT(c) < m->wh)
--                my += HEIGHT(c);
-+            h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx;
-+            resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0);
-+            if (my + HEIGHT(c) + m->gappx < m->wh)
-+                my += HEIGHT(c) + m->gappx;
-         } else {
--            h = (m->wh - ty) / (n - i);
--            resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0);
--            if (ty + HEIGHT(c) < m->wh)
--                ty += HEIGHT(c);
-+            h = (m->wh - ty) / (n - i) - m->gappx;
-+            resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0);
-+            if (ty + HEIGHT(c) + m->gappx < m->wh)
-+                ty += HEIGHT(c) + m->gappx;
-         }
- }
- 
--- 
-2.26.2
-
diff --git a/.config/dwm/patches/dwm-gaplessgrid-20160731-56a31dc.diff b/.config/dwm/patches/dwm-gaplessgrid-20160731-56a31dc.diff
@@ -1,43 +0,0 @@
-URL: http://dwm.suckless.org/patches/gapless_grid
-Add gapless grid layout.
-
-Index: dwm/gaplessgrid.c
-===================================================================
---- /dev/null
-+++ dwm/gaplessgrid.c
-@@ -0,0 +1,35 @@
-+void
-+gaplessgrid(Monitor *m) {
-+    unsigned int n, cols, rows, cn, rn, i, cx, cy, cw, ch;
-+    Client *c;
-+
-+    for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) ;
-+    if(n == 0)
-+        return;
-+
-+    /* grid dimensions */
-+    for(cols = 0; cols <= n/2; cols++)
-+        if(cols*cols >= n)
-+            break;
-+    if(n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
-+        cols = 2;
-+    rows = n/cols;
-+
-+    /* window geometries */
-+    cw = cols ? m->ww / cols : m->ww;
-+    cn = 0; /* current column number */
-+    rn = 0; /* current row number */
-+    for(i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
-+        if(i/rows + 1 > cols - n%cols)
-+            rows = n/cols + 1;
-+        ch = rows ? m->wh / rows : m->wh;
-+        cx = m->wx + cn*cw;
-+        cy = m->wy + rn*ch;
-+        resize(c, cx, cy, cw - 2 * c->bw, ch - 2 * c->bw, False);
-+        rn++;
-+        if(rn >= rows) {
-+            rn = 0;
-+            cn++;
-+        }
-+    }
-+}
diff --git a/.config/dwm/patches/dwm-gridmode-20170909-ceac8c9.diff b/.config/dwm/patches/dwm-gridmode-20170909-ceac8c9.diff
@@ -1,73 +0,0 @@
-From b04bb473cf9818277d33a591f7fe2dfae96afaaf Mon Sep 17 00:00:00 2001
-From: Joshua Haase <hahj87@gmail.com>
-Date: Mon, 15 Aug 2016 17:06:18 -0500
-Subject: [PATCH] Apply modified gridmode patch.
-
----
- config.def.h |  3 +++
- layouts.c    | 27 +++++++++++++++++++++++++++
- 2 files changed, 30 insertions(+)
- create mode 100644 layouts.c
-
-diff --git a/config.def.h b/config.def.h
-index a9ac303..30b7c4a 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -36,11 +36,13 @@ 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 */
- 
-+#include "layouts.c"
- static const Layout layouts[] = {
-     /* symbol     arrange function */
-     { "[]=",      tile },    /* first entry is default */
-     { "><>",      NULL },    /* no layout function means floating behavior */
-     { "[M]",      monocle },
-+    { "HHH",      grid },
- };
- 
- /* key definitions */
-@@ -76,6 +78,7 @@ static Key keys[] = {
-     { MODKEY,                       XK_t,      setlayout,      {.v = &layouts[0]} },
-     { MODKEY,                       XK_f,      setlayout,      {.v = &layouts[1]} },
-     { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
-+    { MODKEY,                       XK_g,      setlayout,      {.v = &layouts[3]} },
-     { MODKEY,                       XK_space,  setlayout,      {0} },
-     { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
-     { MODKEY,                       XK_0,      view,           {.ui = ~0 } },
-diff --git a/layouts.c b/layouts.c
-new file mode 100644
-index 0000000..d26acf3
---- /dev/null
-+++ b/layouts.c
-@@ -0,0 +1,27 @@
-+void
-+grid(Monitor *m) {
-+    unsigned int i, n, cx, cy, cw, ch, aw, ah, cols, rows;
-+    Client *c;
-+
-+    for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next))
-+        n++;
-+
-+    /* grid dimensions */
-+    for(rows = 0; rows <= n/2; rows++)
-+        if(rows*rows >= n)
-+            break;
-+    cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
-+
-+    /* window geoms (cell height/width) */
-+    ch = m->wh / (rows ? rows : 1);
-+    cw = m->ww / (cols ? cols : 1);
-+    for(i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
-+        cx = m->wx + (i / rows) * cw;
-+        cy = m->wy + (i % rows) * ch;
-+        /* adjust height/width of last row/column's windows */
-+        ah = ((i + 1) % rows == 0) ? m->wh - ch * rows : 0;
-+        aw = (i >= rows * (cols - 1)) ? m->ww - cw * cols : 0;
-+        resize(c, cx, cy, cw - 2 * c->bw + aw, ch - 2 * c->bw + ah, False);
-+        i++;
-+    }
-+}
--- 
-2.14.1
-
diff --git a/.config/dwm/patches/dwm-pertag-perseltag-6.2.diff b/.config/dwm/patches/dwm-pertag-perseltag-6.2.diff
@@ -1,224 +0,0 @@
-diff -up a/dwm.c b/dwm.c
---- a/dwm.c    2020-05-23 00:20:34.877944603 +0200
-+++ b/dwm.c    2020-06-22 12:49:55.298859682 +0200
-@@ -111,6 +111,7 @@ typedef struct {
-     void (*arrange)(Monitor *);
- } Layout;
- 
-+typedef struct Pertag Pertag;
- struct Monitor {
-     char ltsymbol[16];
-     float mfact;
-@@ -130,6 +131,7 @@ struct Monitor {
-     Monitor *next;
-     Window barwin;
-     const Layout *lt[2];
-+    Pertag *pertag;
- };
- 
- typedef struct {
-@@ -271,6 +273,15 @@ static Window root, wmcheckwin;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
- 
-+struct Pertag {
-+    unsigned int curtag, prevtag; /* current and previous tag */
-+    int nmasters[LENGTH(tags) + 1]; /* number of windows in master area */
-+    float mfacts[LENGTH(tags) + 1]; /* mfacts per tag */
-+    unsigned int sellts[LENGTH(tags) + 1]; /* selected layouts */
-+    const Layout *ltidxs[LENGTH(tags) + 1][2]; /* matrix of tags and layouts indexes  */
-+    int showbars[LENGTH(tags) + 1]; /* display bar for the current tag */
-+};
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
- 
-@@ -631,6 +642,7 @@ Monitor *
- createmon(void)
- {
-     Monitor *m;
-+    unsigned int i;
- 
-     m = ecalloc(1, sizeof(Monitor));
-     m->tagset[0] = m->tagset[1] = 1;
-@@ -641,6 +653,20 @@ createmon(void)
-     m->lt[0] = &layouts[0];
-     m->lt[1] = &layouts[1 % LENGTH(layouts)];
-     strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
-+    m->pertag = ecalloc(1, sizeof(Pertag));
-+    m->pertag->curtag = m->pertag->prevtag = 1;
-+
-+    for (i = 0; i <= LENGTH(tags); i++) {
-+        m->pertag->nmasters[i] = m->nmaster;
-+        m->pertag->mfacts[i] = m->mfact;
-+
-+        m->pertag->ltidxs[i][0] = m->lt[0];
-+        m->pertag->ltidxs[i][1] = m->lt[1];
-+        m->pertag->sellts[i] = m->sellt;
-+
-+        m->pertag->showbars[i] = m->showbar;
-+    }
-+
-     return m;
- }
- 
-@@ -966,7 +992,16 @@ grabkeys(void)
- void
- incnmaster(const Arg *arg)
- {
-+    unsigned int i;
-     selmon->nmaster = MAX(selmon->nmaster + arg->i, 0);
-+    for(i=0; i<LENGTH(tags); ++i)
-+        if(selmon->tagset[selmon->seltags] & 1<<i)
-+            selmon->pertag->nmasters[i+1] = selmon->nmaster;
-+    
-+    if(selmon->pertag->curtag == 0)
-+    {
-+        selmon->pertag->nmasters[0] = selmon->nmaster;
-+    }
-     arrange(selmon);
- }
- 
-@@ -1500,11 +1535,26 @@ setfullscreen(Client *c, int fullscreen)
- void
- setlayout(const Arg *arg)
- {
-+    unsigned int i;
-     if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
-         selmon->sellt ^= 1;
-     if (arg && arg->v)
-         selmon->lt[selmon->sellt] = (Layout *)arg->v;
-     strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
-+
-+    for(i=0; i<LENGTH(tags); ++i)
-+        if(selmon->tagset[selmon->seltags] & 1<<i)
-+        {
-+            selmon->pertag->ltidxs[i+1][selmon->sellt] = selmon->lt[selmon->sellt]; 
-+            selmon->pertag->sellts[i+1] = selmon->sellt;
-+        }
-+    
-+    if(selmon->pertag->curtag == 0)
-+    {
-+        selmon->pertag->ltidxs[0][selmon->sellt] = selmon->lt[selmon->sellt]; 
-+        selmon->pertag->sellts[0] = selmon->sellt;
-+    }
-+
-     if (selmon->sel)
-         arrange(selmon);
-     else
-@@ -1516,13 +1566,24 @@ void
- setmfact(const Arg *arg)
- {
-     float f;
-+    unsigned int i;
- 
-     if (!arg || !selmon->lt[selmon->sellt]->arrange)
-         return;
-     f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0;
--    if (f < 0.1 || f > 0.9)
-+    if (arg->f == 0.0)
-+        f = mfact;
-+    if (f < 0.05 || f > 0.95)
-         return;
-     selmon->mfact = f;
-+    for(i=0; i<LENGTH(tags); ++i)
-+        if(selmon->tagset[selmon->seltags] & 1<<i)
-+            selmon->pertag->mfacts[i+1] = f;
-+
-+    if(selmon->pertag->curtag == 0)
-+    {
-+        selmon->pertag->mfacts[0] = f;
-+    }
-     arrange(selmon);
- }
- 
-@@ -1699,7 +1760,16 @@ tile(Monitor *m)
- void
- togglebar(const Arg *arg)
- {
-+    unsigned int i;
-     selmon->showbar = !selmon->showbar;
-+    for(i=0; i<LENGTH(tags); ++i)
-+        if(selmon->tagset[selmon->seltags] & 1<<i)
-+            selmon->pertag->showbars[i+1] = selmon->showbar;
-+
-+    if(selmon->pertag->curtag == 0)
-+    {
-+        selmon->pertag->showbars[0] = selmon->showbar;
-+    }
-     updatebarpos(selmon);
-     XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh);
-     arrange(selmon);
-@@ -1738,9 +1808,33 @@ void
- toggleview(const Arg *arg)
- {
-     unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK);
-+    int i;
- 
-     if (newtagset) {
-         selmon->tagset[selmon->seltags] = newtagset;
-+
-+        if (newtagset == ~0) {
-+            selmon->pertag->prevtag = selmon->pertag->curtag;
-+            selmon->pertag->curtag = 0;
-+        }
-+
-+        /* test if the user did not select the same tag */
-+        if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) {
-+            selmon->pertag->prevtag = selmon->pertag->curtag;
-+            for (i = 0; !(newtagset & 1 << i); i++) ;
-+            selmon->pertag->curtag = i + 1;
-+        }
-+
-+        /* apply settings for this view */
-+        selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
-+        selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
-+        selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
-+        selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
-+        selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
-+
-+        if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
-+            togglebar(NULL);
-+
-         focus(NULL);
-         arrange(selmon);
-     }
-@@ -2035,11 +2129,37 @@ updatewmhints(Client *c)
- void
- view(const Arg *arg)
- {
-+    int i;
-+    unsigned int tmptag;
-+
-     if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
-         return;
-     selmon->seltags ^= 1; /* toggle sel tagset */
--    if (arg->ui & TAGMASK)
-+    if (arg->ui & TAGMASK) {
-         selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-+        selmon->pertag->prevtag = selmon->pertag->curtag;
-+
-+        if (arg->ui == ~0)
-+            selmon->pertag->curtag = 0;
-+        else {
-+            for (i = 0; !(arg->ui & 1 << i); i++) ;
-+            selmon->pertag->curtag = i + 1;
-+        }
-+    } else {
-+        tmptag = selmon->pertag->prevtag;
-+        selmon->pertag->prevtag = selmon->pertag->curtag;
-+        selmon->pertag->curtag = tmptag;
-+    }
-+
-+    selmon->nmaster = selmon->pertag->nmasters[selmon->pertag->curtag];
-+    selmon->mfact = selmon->pertag->mfacts[selmon->pertag->curtag];
-+    selmon->sellt = selmon->pertag->sellts[selmon->pertag->curtag];
-+    selmon->lt[selmon->sellt] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt];
-+    selmon->lt[selmon->sellt^1] = selmon->pertag->ltidxs[selmon->pertag->curtag][selmon->sellt^1];
-+
-+    if (selmon->showbar != selmon->pertag->showbars[selmon->pertag->curtag])
-+        togglebar(NULL);
-+
-     focus(NULL);
-     arrange(selmon);
- }
diff --git a/.config/dwm/patches/dwm-statuscmd-20210405-67d76bd.diff b/.config/dwm/patches/dwm-statuscmd-20210405-67d76bd.diff
@@ -1,208 +0,0 @@
-From f58c7e4fd05ec13383518ccd51663167d45e92d0 Mon Sep 17 00:00:00 2001
-From: Daniel Bylinka <daniel.bylinka@gmail.com>
-Date: Fri, 2 Apr 2021 19:02:58 +0200
-Subject: [PATCH] [statuscmd] Signal mouse button and click location to status
- monitor
-
----
- config.def.h |   6 +++-
- dwm.c        | 100 ++++++++++++++++++++++++++++++++++++++++++++++++---
- 2 files changed, 100 insertions(+), 6 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..154a59b 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -54,6 +54,8 @@ static const Layout layouts[] = {
- /* helper for spawning shell commands in the pre dwm-5.0 fashion */
- #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
- 
-+#define STATUSBAR "dwmblocks"
-+
- /* 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 };
-@@ -103,7 +105,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,        sigstatusbar,   {.i = 1} },
-+    { ClkStatusText,        0,              Button2,        sigstatusbar,   {.i = 2} },
-+    { ClkStatusText,        0,              Button3,        sigstatusbar,   {.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 b0b3466..d871457 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -172,6 +172,7 @@ 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 pid_t getstatusbarpid();
- static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
- static void grabbuttons(Client *c, int focused);
- static void grabkeys(void);
-@@ -206,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 sigstatusbar(const Arg *arg);
- static void spawn(const Arg *arg);
- static void tag(const Arg *arg);
- static void tagmon(const Arg *arg);
-@@ -238,6 +240,9 @@ static void zoom(const Arg *arg);
- /* variables */
- static const char broken[] = "broken";
- static char stext[256];
-+static int statusw;
-+static int statussig;
-+static pid_t statuspid = -1;
- static int screen;
- static int sw, sh;           /* X display screen geometry width, height */
- static int bh, blw = 0;      /* bar geometry */
-@@ -422,6 +427,7 @@ buttonpress(XEvent *e)
-     Client *c;
-     Monitor *m;
-     XButtonPressedEvent *ev = &e->xbutton;
-+    char *text, *s, ch;
- 
-     click = ClkRootWin;
-     /* focus monitor if necessary */
-@@ -440,9 +446,23 @@ buttonpress(XEvent *e)
-             arg.ui = 1 << i;
-         } else if (ev->x < x + blw)
-             click = ClkLtSymbol;
--        else if (ev->x > selmon->ww - (int)TEXTW(stext))
-+        else if (ev->x > selmon->ww - statusw) {
-+            x = selmon->ww - statusw;
-             click = ClkStatusText;
--        else
-+            statussig = 0;
-+            for (text = s = stext; *s && x <= ev->x; s++) {
-+                if ((unsigned char)(*s) < ' ') {
-+                    ch = *s;
-+                    *s = '\0';
-+                    x += TEXTW(text) - lrpad;
-+                    *s = ch;
-+                    text = s + 1;
-+                    if (x >= ev->x)
-+                        break;
-+                    statussig = ch;
-+                }
-+            }
-+        } else
-             click = ClkWinTitle;
-     } else if ((c = wintoclient(ev->window))) {
-         focus(c);
-@@ -704,9 +724,24 @@ drawbar(Monitor *m)
- 
-     /* draw status first so it can be overdrawn by tags later */
-     if (m == selmon) { /* status is only drawn on selected monitor */
-+        char *text, *s, ch;
-         drw_setscheme(drw, scheme[SchemeNorm]);
--        tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
--        drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
-+
-+        x = 0;
-+        for (text = s = stext; *s; s++) {
-+            if ((unsigned char)(*s) < ' ') {
-+                ch = *s;
-+                *s = '\0';
-+                tw = TEXTW(text) - lrpad;
-+                drw_text(drw, m->ww - statusw + x, 0, tw, bh, 0, text, 0);
-+                x += tw;
-+                *s = ch;
-+                text = s + 1;
-+            }
-+        }
-+        tw = TEXTW(text) - lrpad + 2;
-+        drw_text(drw, m->ww - statusw + x, 0, tw, bh, 0, text, 0);
-+        tw = statusw;
-     }
- 
-     for (c = m->clients; c; c = c->next) {
-@@ -872,6 +907,30 @@ getatomprop(Client *c, Atom prop)
-     return atom;
- }
- 
-+pid_t
-+getstatusbarpid()
-+{
-+    char buf[32], *str = buf, *c;
-+    FILE *fp;
-+
-+    if (statuspid > 0) {
-+        snprintf(buf, sizeof(buf), "/proc/%u/cmdline", statuspid);
-+        if ((fp = fopen(buf, "r"))) {
-+            fgets(buf, sizeof(buf), fp);
-+            while ((c = strchr(str, '/')))
-+                str = c + 1;
-+            fclose(fp);
-+            if (!strcmp(str, STATUSBAR))
-+                return statuspid;
-+        }
-+    }
-+    if (!(fp = popen("pidof -s "STATUSBAR, "r")))
-+        return -1;
-+    fgets(buf, sizeof(buf), fp);
-+    pclose(fp);
-+    return strtol(buf, NULL, 10);
-+}
-+
- int
- getrootptr(int *x, int *y)
- {
-@@ -1637,6 +1696,20 @@ sigchld(int unused)
-     while (0 < waitpid(-1, NULL, WNOHANG));
- }
- 
-+void
-+sigstatusbar(const Arg *arg)
-+{
-+    union sigval sv;
-+
-+    if (!statussig)
-+        return;
-+    sv.sival_int = arg->i;
-+    if ((statuspid = getstatusbarpid()) <= 0)
-+        return;
-+
-+    sigqueue(statuspid, SIGRTMIN+statussig, sv);
-+}
-+
- void
- spawn(const Arg *arg)
- {
-@@ -1990,8 +2063,25 @@ updatesizehints(Client *c)
- void
- updatestatus(void)
- {
--    if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
-+    if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) {
-         strcpy(stext, "dwm-"VERSION);
-+        statusw = TEXTW(stext) - lrpad + 2;
-+    } else {
-+        char *text, *s, ch;
-+
-+        statusw  = 0;
-+        for (text = s = stext; *s; s++) {
-+            if ((unsigned char)(*s) < ' ') {
-+                ch = *s;
-+                *s = '\0';
-+                statusw += TEXTW(text) - lrpad;
-+                *s = ch;
-+                text = s + 1;
-+            }
-+        }
-+        statusw += TEXTW(text) - lrpad + 2;
-+
-+    }
-     drawbar(selmon);
- }
- 
--- 
-2.31.0
-
diff --git a/.config/dwm/patches/dwm-statuscmd-6.2.diff b/.config/dwm/patches/dwm-statuscmd-6.2.diff
@@ -1,142 +0,0 @@
-From 2761ad72b4b8a80e434e7eba1a24676119ab666d Mon Sep 17 00:00:00 2001
-From: Daniel Bylinka <daniel.bylinka@gmail.com>
-Date: Sat, 18 Apr 2020 01:41:03 +0200
-Subject: [PATCH] statuscmd: run shell commands based on mouse button and
- position when clicking statusbar
-
----
- config.def.h |  8 +++++++-
- dwm.c        | 47 ++++++++++++++++++++++++++++++++++++++++++++---
- 2 files changed, 51 insertions(+), 4 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..5cd7efa 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -59,6 +59,10 @@ 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 };
- 
-+/* commands spawned when clicking statusbar, the mouse button pressed is exported as BUTTON */
-+static char *statuscmds[] = { "notify-send Mouse$BUTTON" };
-+static char *statuscmd[] = { "/bin/sh", "-c", NULL, NULL };
-+
- static Key keys[] = {
-     /* modifier                     key        function        argument */
-     { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
-@@ -103,7 +107,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,        spawn,          {.v = statuscmd } },
-+    { ClkStatusText,        0,              Button2,        spawn,          {.v = statuscmd } },
-+    { ClkStatusText,        0,              Button3,        spawn,          {.v = statuscmd } },
-     { 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..d35d173 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);
-@@ -237,6 +238,9 @@ static void zoom(const Arg *arg);
- /* variables */
- static const char broken[] = "broken";
- static char stext[256];
-+static char rawstext[256];
-+static int statuscmdn;
-+static char lastbutton[] = "-";
- static int screen;
- static int sw, sh;           /* X display screen geometry width, height */
- static int bh, blw = 0;      /* bar geometry */
-@@ -421,6 +425,7 @@ buttonpress(XEvent *e)
-     Client *c;
-     Monitor *m;
-     XButtonPressedEvent *ev = &e->xbutton;
-+    *lastbutton = '0' + ev->button;
- 
-     click = ClkRootWin;
-     /* focus monitor if necessary */
-@@ -439,9 +444,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;
-+            statuscmdn = 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;
-+                    if (ch <= LENGTH(statuscmds)) statuscmdn = ch - 1;
-+                }
-+            }
-+        } else
-             click = ClkWinTitle;
-     } else if ((c = wintoclient(ev->window))) {
-         focus(c);
-@@ -627,6 +649,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)
- {
-@@ -1641,6 +1676,10 @@ spawn(const Arg *arg)
- {
-     if (arg->v == dmenucmd)
-         dmenumon[0] = '0' + selmon->num;
-+    else if (arg->v == statuscmd) {
-+        statuscmd[2] = statuscmds[statuscmdn];
-+        setenv("BUTTON", lastbutton, 1);
-+    }
-     if (fork() == 0) {
-         if (dpy)
-             close(ConnectionNumber(dpy));
-@@ -1987,8 +2026,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);
- }
- 
--- 
-2.26.1
-
diff --git a/.config/dwm/patches/dwm-statuscmd-signal-6.2.diff b/.config/dwm/patches/dwm-statuscmd-signal-6.2.diff
@@ -1,157 +0,0 @@
-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/.config/dwm/patches/dwm-sticky-6.1.diff b/.config/dwm/patches/dwm-sticky-6.1.diff
@@ -1,58 +0,0 @@
-diff --git a/config.def.h b/config.def.h
-index 7054c06..9b5d5b8 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -76,6 +76,7 @@ static Key keys[] = {
-     { MODKEY,                       XK_m,      setlayout,      {.v = &layouts[2]} },
-     { MODKEY,                       XK_space,  setlayout,      {0} },
-     { MODKEY|ShiftMask,             XK_space,  togglefloating, {0} },
-+    { MODKEY,                       XK_s,      togglesticky,   {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 0362114..0ef5c7f 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -49,7 +49,7 @@
- #define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
- #define INTERSECT(x,y,w,h,m)    (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
-                                * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
--#define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags]))
-+#define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky)
- #define LENGTH(X)               (sizeof X / sizeof X[0])
- #define MOUSEMASK               (BUTTONMASK|PointerMotionMask)
- #define WIDTH(X)                ((X)->w + 2 * (X)->bw)
-@@ -92,7 +92,7 @@ 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, issticky;
-     Client *next;
-     Client *snext;
-     Monitor *mon;
-@@ -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 togglesticky(const Arg *arg);
- static void toggletag(const Arg *arg);
- static void toggleview(const Arg *arg);
- static void unfocus(Client *c, int setfocus);
-@@ -1713,6 +1714,15 @@ togglefloating(const Arg *arg)
- }
- 
- void
-+togglesticky(const Arg *arg)
-+{
-+    if (!selmon->sel)
-+        return;
-+    selmon->sel->issticky = !selmon->sel->issticky;
-+    arrange(selmon);
-+}
-+
-+void
- toggletag(const Arg *arg)
- {
-     unsigned int newtags;
diff --git a/.config/dwm/patches/dwm-systray-20210217-61bb8b2.diff b/.config/dwm/patches/dwm-systray-20210217-61bb8b2.diff
@@ -1,754 +0,0 @@
-From 54948f3b69824de6eba41d281ff72c08131451a8 Mon Sep 17 00:00:00 2001
-From: Hritik Vijay <hr1t1k@protonmail.com>
-Date: Wed, 17 Feb 2021 19:30:25 +0530
-Subject: [PATCH] [Patch] Systray for dwm
-
-This patch adds an option for systray placement via `systrayleft`.
-
-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 |   6 +-
- dwm.c        | 406 +++++++++++++++++++++++++++++++++++++++++++++++----
- 2 files changed, 385 insertions(+), 27 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..9e74de2 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -3,6 +3,11 @@
- /* 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 systrayonleft = 0;       /* 0: systray in the right corner, >0: systray on left of status text */
-+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" };
-@@ -112,4 +117,3 @@ static Button buttons[] = {
-     { ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
-     { ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
- };
--
-diff --git a/dwm.c b/dwm.c
-index 664c527..f0d50ee 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);
-@@ -172,6 +196,7 @@ 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);
-@@ -189,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);
-@@ -207,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 *);
-@@ -224,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;
-@@ -258,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;
-@@ -440,7 +475,7 @@ buttonpress(XEvent *e)
-             arg.ui = 1 << i;
-         } else if (ev->x < x + blw)
-             click = ClkLtSymbol;
--        else if (ev->x > selmon->ww - (int)TEXTW(stext))
-+        else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth())
-             click = ClkStatusText;
-         else
-             click = ClkWinTitle;
-@@ -483,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++)
-@@ -513,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]) {
-@@ -568,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);
-@@ -653,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
-@@ -696,19 +789,23 @@ dirtomon(int dir)
- void
- drawbar(Monitor *m)
- {
--    int x, w, tw = 0;
-+    int x, w, tw = 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) && !systrayonleft)
-+        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]);
--        tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
--        drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
-+        tw = TEXTW(stext) - lrpad + 2; /* 2px padding */
-+        drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0);
-     }
- 
-+    resizebarwin(m);
-     for (c = m->clients; c; c = c->next) {
-         occ |= c->tags;
-         if (c->isurgent)
-@@ -729,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 - tw - x) > bh) {
-+    if ((w = m->ww - tw - 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);
-@@ -740,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
-@@ -777,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
-@@ -863,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;
-@@ -900,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)
- {
-@@ -1004,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);
-@@ -1092,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;
-@@ -1216,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)
-@@ -1266,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)
- {
-@@ -1273,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) && !systrayonleft)
-+        w -= getsystraywidth();
-+    XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh);
-+}
-+
- void
- resizeclient(Client *c, int x, int y, int w, int h)
- {
-@@ -1345,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)
- {
-@@ -1434,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;
- }
-@@ -1467,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
-@@ -1556,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);
-@@ -1563,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);
-@@ -1571,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();
-@@ -1704,7 +1891,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);
- }
- 
-@@ -1799,11 +1997,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,
-@@ -1814,10 +2019,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);
-     }
-@@ -1993,6 +2203,124 @@ 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 sw = TEXTW(stext) - lrpad + systrayspacing;
-+    unsigned int w = 1;
-+
-+    if (!showsystray)
-+        return;
-+    if (systrayonleft)
-+        x -= sw;
-+    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
-@@ -2060,6 +2388,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)
- {
-@@ -2113,6 +2451,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.30.1
-
diff --git a/.config/dwm/patches/dwm-systray-20210418-67d76bd.diff b/.config/dwm/patches/dwm-systray-20210418-67d76bd.diff
@@ -1,754 +0,0 @@
-From b9d4791ea3bdfcf3f750e133047345edebea0a70 Mon Sep 17 00:00:00 2001
-From: Hritik Vijay <hr1t1k@protonmail.com>
-Date: Wed, 17 Feb 2021 19:30:25 +0530
-Subject: [PATCH] System tray for dwm
-
-This patch adds an option for systray placement via `systrayleft`.
-
-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 |   6 +-
- dwm.c        | 406 +++++++++++++++++++++++++++++++++++++++++++++++----
- 2 files changed, 385 insertions(+), 27 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..9e74de2 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -3,6 +3,11 @@
- /* 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 systrayonleft = 0;       /* 0: systray in the right corner, >0: systray on left of status text */
-+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" };
-@@ -112,4 +117,3 @@ static Button buttons[] = {
-     { ClkTagBar,            MODKEY,         Button1,        tag,            {0} },
-     { ClkTagBar,            MODKEY,         Button3,        toggletag,      {0} },
- };
--
-diff --git a/dwm.c b/dwm.c
-index b0b3466..1e2a32d 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);
-@@ -172,6 +196,7 @@ 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);
-@@ -189,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);
-@@ -207,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 *);
-@@ -224,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;
-@@ -258,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;
-@@ -440,7 +475,7 @@ buttonpress(XEvent *e)
-             arg.ui = 1 << i;
-         } else if (ev->x < x + blw)
-             click = ClkLtSymbol;
--        else if (ev->x > selmon->ww - (int)TEXTW(stext))
-+        else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth())
-             click = ClkStatusText;
-         else
-             click = ClkWinTitle;
-@@ -483,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++)
-@@ -513,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]) {
-@@ -568,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);
-@@ -653,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
-@@ -696,19 +789,23 @@ dirtomon(int dir)
- void
- drawbar(Monitor *m)
- {
--    int x, w, tw = 0;
-+    int x, w, tw = 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) && !systrayonleft)
-+        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]);
--        tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
--        drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
-+        tw = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */
-+        drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0);
-     }
- 
-+    resizebarwin(m);
-     for (c = m->clients; c; c = c->next) {
-         occ |= c->tags;
-         if (c->isurgent)
-@@ -729,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 - tw - x) > bh) {
-+    if ((w = m->ww - tw - 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);
-@@ -740,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
-@@ -777,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
-@@ -863,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;
-@@ -900,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)
- {
-@@ -1004,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);
-@@ -1092,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;
-@@ -1216,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)
-@@ -1266,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)
- {
-@@ -1273,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) && !systrayonleft)
-+        w -= getsystraywidth();
-+    XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh);
-+}
-+
- void
- resizeclient(Client *c, int x, int y, int w, int h)
- {
-@@ -1345,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)
- {
-@@ -1434,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;
- }
-@@ -1467,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
-@@ -1556,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);
-@@ -1563,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);
-@@ -1571,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();
-@@ -1704,7 +1891,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);
- }
- 
-@@ -1799,11 +1997,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,
-@@ -1814,10 +2019,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);
-     }
-@@ -1993,6 +2203,124 @@ 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 sw = TEXTW(stext) - lrpad + systrayspacing;
-+    unsigned int w = 1;
-+
-+    if (!showsystray)
-+        return;
-+    if (systrayonleft)
-+        x -= sw + lrpad / 2;
-+    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
-@@ -2060,6 +2388,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)
- {
-@@ -2113,6 +2451,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.31.0
-
diff --git a/.config/dwm/patches/dwm-titlecolor-20190206-6.2.diff b/.config/dwm/patches/dwm-titlecolor-20190206-6.2.diff
@@ -1,46 +0,0 @@
-From b15016b717c88eb378d87703dcf2169b6059047c Mon Sep 17 00:00:00 2001
-From: knary <theknary@gmail.com>
-Date: Wed, 6 Feb 2019 21:44:19 -0500
-Subject: [PATCH] Adds title bar color scheme, seperating it from SchemeSel.
-
----
- config.def.h | 1 +
- dwm.c        | 4 ++--
- 2 files changed, 3 insertions(+), 2 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..48e7ace 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -16,6 +16,7 @@ static const char *colors[][3]      = {
-     /*               fg         bg         border   */
-     [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
-     [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
-+    [SchemeTitle]  = { col_gray4, col_cyan,  col_cyan  },
- };
- 
- /* tagging */
-diff --git a/dwm.c b/dwm.c
-index 4465af1..216e1f3 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, SchemeTitle }; /* color schemes */
- enum { NetSupported, NetWMName, NetWMState, NetWMCheck,
-        NetWMFullscreen, NetActiveWindow, NetWMWindowType,
-        NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */
-@@ -730,7 +730,7 @@ drawbar(Monitor *m)
- 
-     if ((w = m->ww - sw - x) > bh) {
-         if (m->sel) {
--            drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
-+            drw_setscheme(drw, scheme[m == selmon ? SchemeTitle : SchemeNorm]);
-             drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
-             if (m->sel->isfloating)
-                 drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
--- 
-2.20.1
diff --git a/.config/dwm/patches/dwmblocks-statuscmd.diff b/.config/dwm/patches/dwmblocks-statuscmd.diff
@@ -1,80 +0,0 @@
-diff --git a/dwmblocks.c b/dwmblocks.c
-index 2f3b774..ba7dbb5 100644
---- a/dwmblocks.c
-+++ b/dwmblocks.c
-@@ -14,6 +14,7 @@ typedef struct {
-     unsigned int signal;
- } Block;
- void sighandler(int num);
-+void buttonhandler(int sig, siginfo_t *si, void *ucontext);
- void getcmds(int time);
- #ifndef __OpenBSD__
- void getsigcmds(int signal);
-@@ -33,15 +34,32 @@ static int screen;
- static Window root;
- static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0};
- static char statusstr[2][256];
-+static char button[] = "\0";
- static int statusContinue = 1;
- static void (*writestatus) () = setroot;
- 
- //opens process *cmd and stores output in *output
- void getcmd(const Block *block, char *output)
- {
-+    if (block->signal)
-+    {
-+        output[0] = block->signal;
-+        output++;
-+    }
-     strcpy(output, block->icon);
-     char *cmd = block->command;
--    FILE *cmdf = popen(cmd,"r");
-+    FILE *cmdf;
-+    if (*button)
-+    {
-+        setenv("BUTTON", button, 1);
-+        cmdf = popen(cmd,"r");
-+        *button = '\0';
-+        unsetenv("BUTTON");
-+    }
-+    else
-+    {
-+        cmdf = popen(cmd,"r");
-+    }
-     if (!cmdf)
-         return;
-     char c;
-@@ -79,12 +97,18 @@ void getsigcmds(int signal)
- 
- void setupsignals()
- {
-+    struct sigaction sa;
-     for(int i = 0; i < LENGTH(blocks); i++)
-     {      
-         if (blocks[i].signal > 0)
-+        {
-             signal(SIGRTMIN+blocks[i].signal, sighandler);
-+            sigaddset(&sa.sa_mask, SIGRTMIN+blocks[i].signal); // ignore signal when handling SIGUSR1
-+        }
-     }
--
-+    sa.sa_sigaction = buttonhandler;
-+    sa.sa_flags = SA_SIGINFO;
-+    sigaction(SIGUSR1, &sa, NULL);
- }
- #endif
- 
-@@ -143,6 +167,13 @@ void sighandler(int signum)
-     getsigcmds(signum-SIGRTMIN);
-     writestatus();
- }
-+
-+void buttonhandler(int sig, siginfo_t *si, void *ucontext)
-+{
-+    *button = '0' + si->si_value.sival_int & 0xff;
-+    getsigcmds(si->si_value.sival_int >> 8);
-+    writestatus();
-+}
- #endif
- 
- void termhandler(int signum)
diff --git a/.config/dwm/transient.c b/.config/dwm/transient.c
@@ -1,42 +0,0 @@
-/* cc transient.c -o transient -lX11 */
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-
-int main(void) {
-    Display *d;
-    Window r, f, t = None;
-    XSizeHints h;
-    XEvent e;
-
-    d = XOpenDisplay(NULL);
-    if (!d)
-        exit(1);
-    r = DefaultRootWindow(d);
-
-    f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0);
-    h.min_width = h.max_width = h.min_height = h.max_height = 400;
-    h.flags = PMinSize | PMaxSize;
-    XSetWMNormalHints(d, f, &h);
-    XStoreName(d, f, "floating");
-    XMapWindow(d, f);
-
-    XSelectInput(d, f, ExposureMask);
-    while (1) {
-        XNextEvent(d, &e);
-
-        if (t == None) {
-            sleep(5);
-            t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0);
-            XSetTransientForHint(d, t, f);
-            XStoreName(d, t, "transient");
-            XMapWindow(d, t);
-            XSelectInput(d, t, ExposureMask);
-        }
-    }
-
-    XCloseDisplay(d);
-    exit(0);
-}
diff --git a/.config/dwm/util.c b/.config/dwm/util.c
@@ -1,35 +0,0 @@
-/* See LICENSE file for copyright and license details. */
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "util.h"
-
-void *
-ecalloc(size_t nmemb, size_t size)
-{
-    void *p;
-
-    if (!(p = calloc(nmemb, size)))
-        die("calloc:");
-    return p;
-}
-
-void
-die(const char *fmt, ...) {
-    va_list ap;
-
-    va_start(ap, fmt);
-    vfprintf(stderr, fmt, ap);
-    va_end(ap);
-
-    if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
-        fputc(' ', stderr);
-        perror(NULL);
-    } else {
-        fputc('\n', stderr);
-    }
-
-    exit(1);
-}
diff --git a/.config/dwm/util.h b/.config/dwm/util.h
@@ -1,8 +0,0 @@
-/* See LICENSE file for copyright and license details. */
-
-#define MAX(A, B)               ((A) > (B) ? (A) : (B))
-#define MIN(A, B)               ((A) < (B) ? (A) : (B))
-#define BETWEEN(X, A, B)        ((A) <= (X) && (X) <= (B))
-
-void die(const char *fmt, ...);
-void *ecalloc(size_t nmemb, size_t size);
diff --git a/.config/dwm/util.o b/.config/dwm/util.o
Binary files differ.
diff --git a/.config/dwm/vanitygaps.c b/.config/dwm/vanitygaps.c
@@ -1,822 +0,0 @@
-/* Key binding functions */
-static void defaultgaps(const Arg *arg);
-static void incrgaps(const Arg *arg);
-static void incrigaps(const Arg *arg);
-static void incrogaps(const Arg *arg);
-static void incrohgaps(const Arg *arg);
-static void incrovgaps(const Arg *arg);
-static void incrihgaps(const Arg *arg);
-static void incrivgaps(const Arg *arg);
-static void togglegaps(const Arg *arg);
-/* Layouts (delete the ones you do not need) */
-static void bstack(Monitor *m);
-static void bstackhoriz(Monitor *m);
-static void centeredmaster(Monitor *m);
-static void centeredfloatingmaster(Monitor *m);
-static void deck(Monitor *m);
-static void dwindle(Monitor *m);
-static void fibonacci(Monitor *m, int s);
-static void grid(Monitor *m);
-static void nrowgrid(Monitor *m);
-static void spiral(Monitor *m);
-static void tile(Monitor *m);
-/* Internals */
-static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc);
-static void getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr);
-static void setgaps(int oh, int ov, int ih, int iv);
-
-/* Settings */
-#if !PERTAG_PATCH
-static int enablegaps = 1;
-#endif // PERTAG_PATCH
-
-void
-setgaps(int oh, int ov, int ih, int iv)
-{
-    if (oh < 0) oh = 0;
-    if (ov < 0) ov = 0;
-    if (ih < 0) ih = 0;
-    if (iv < 0) iv = 0;
-
-    selmon->gappoh = oh;
-    selmon->gappov = ov;
-    selmon->gappih = ih;
-    selmon->gappiv = iv;
-    arrange(selmon);
-}
-
-void
-togglegaps(const Arg *arg)
-{
-    #if PERTAG_PATCH
-    selmon->pertag->enablegaps[selmon->pertag->curtag] = !selmon->pertag->enablegaps[selmon->pertag->curtag];
-    #else
-    enablegaps = !enablegaps;
-    #endif // PERTAG_PATCH
-    arrange(NULL);
-}
-
-void
-defaultgaps(const Arg *arg)
-{
-    setgaps(gappoh, gappov, gappih, gappiv);
-}
-
-void
-incrgaps(const Arg *arg)
-{
-    setgaps(
-        selmon->gappoh + arg->i,
-        selmon->gappov + arg->i,
-        selmon->gappih + arg->i,
-        selmon->gappiv + arg->i
-    );
-}
-
-void
-incrigaps(const Arg *arg)
-{
-    setgaps(
-        selmon->gappoh,
-        selmon->gappov,
-        selmon->gappih + arg->i,
-        selmon->gappiv + arg->i
-    );
-}
-
-void
-incrogaps(const Arg *arg)
-{
-    setgaps(
-        selmon->gappoh + arg->i,
-        selmon->gappov + arg->i,
-        selmon->gappih,
-        selmon->gappiv
-    );
-}
-
-void
-incrohgaps(const Arg *arg)
-{
-    setgaps(
-        selmon->gappoh + arg->i,
-        selmon->gappov,
-        selmon->gappih,
-        selmon->gappiv
-    );
-}
-
-void
-incrovgaps(const Arg *arg)
-{
-    setgaps(
-        selmon->gappoh,
-        selmon->gappov + arg->i,
-        selmon->gappih,
-        selmon->gappiv
-    );
-}
-
-void
-incrihgaps(const Arg *arg)
-{
-    setgaps(
-        selmon->gappoh,
-        selmon->gappov,
-        selmon->gappih + arg->i,
-        selmon->gappiv
-    );
-}
-
-void
-incrivgaps(const Arg *arg)
-{
-    setgaps(
-        selmon->gappoh,
-        selmon->gappov,
-        selmon->gappih,
-        selmon->gappiv + arg->i
-    );
-}
-
-void
-getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *nc)
-{
-    unsigned int n, oe, ie;
-    #if PERTAG_PATCH
-    oe = ie = selmon->pertag->enablegaps[selmon->pertag->curtag];
-    #else
-    oe = ie = enablegaps;
-    #endif // PERTAG_PATCH
-    Client *c;
-
-    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
-    if (smartgaps && n == 1) {
-        oe = 0; // outer gaps disabled when only one client
-    }
-
-    *oh = m->gappoh*oe; // outer horizontal gap
-    *ov = m->gappov*oe; // outer vertical gap
-    *ih = m->gappih*ie; // inner horizontal gap
-    *iv = m->gappiv*ie; // inner vertical gap
-    *nc = n;            // number of clients
-}
-
-void
-getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *mr, int *sr)
-{
-    unsigned int n;
-    float mfacts = 0, sfacts = 0;
-    int mtotal = 0, stotal = 0;
-    Client *c;
-
-    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
-        if (n < m->nmaster)
-            mfacts += c->cfact;
-        else
-            sfacts += c->cfact;
-
-    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
-        if (n < m->nmaster)
-            mtotal += msize * (c->cfact / mfacts);
-        else
-            stotal += ssize * (c->cfact / sfacts);
-
-    *mf = mfacts; // total factor of master area
-    *sf = sfacts; // total factor of stack area
-    *mr = msize - mtotal; // the remainder (rest) of pixels after a cfacts master split
-    *sr = ssize - stotal; // the remainder (rest) of pixels after a cfacts stack split
-}
-
-/***
- * Layouts
- */
-
-/*
- * Bottomstack layout + gaps
- * https://dwm.suckless.org/patches/bottomstack/
- */
-static void
-bstack(Monitor *m)
-{
-    unsigned int i, n;
-    int oh, ov, ih, iv;
-    int mx = 0, my = 0, mh = 0, mw = 0;
-    int sx = 0, sy = 0, sh = 0, sw = 0;
-    float mfacts, sfacts;
-    int mrest, srest;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    sx = mx = m->wx + ov;
-    sy = my = m->wy + oh;
-    sh = mh = m->wh - 2*oh;
-    mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
-    sw = m->ww - 2*ov - iv * (n - m->nmaster - 1);
-
-    if (m->nmaster && n > m->nmaster) {
-        sh = (mh - ih) * (1 - m->mfact);
-        mh = mh - ih - sh;
-        sx = mx;
-        sy = my + mh + ih;
-    }
-
-    getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
-        if (i < m->nmaster) {
-            resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
-            mx += WIDTH(c) + iv;
-        } else {
-            resize(c, sx, sy, sw * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
-            sx += WIDTH(c) + iv;
-        }
-    }
-}
-
-static void
-bstackhoriz(Monitor *m)
-{
-    unsigned int i, n;
-    int oh, ov, ih, iv;
-    int mx = 0, my = 0, mh = 0, mw = 0;
-    int sx = 0, sy = 0, sh = 0, sw = 0;
-    float mfacts, sfacts;
-    int mrest, srest;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    sx = mx = m->wx + ov;
-    sy = my = m->wy + oh;
-    mh = m->wh - 2*oh;
-    sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
-    mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
-    sw = m->ww - 2*ov;
-
-    if (m->nmaster && n > m->nmaster) {
-        sh = (mh - ih) * (1 - m->mfact);
-        mh = mh - ih - sh;
-        sy = my + mh + ih;
-        sh = m->wh - mh - 2*oh - ih * (n - m->nmaster);
-    }
-
-    getfacts(m, mw, sh, &mfacts, &sfacts, &mrest, &srest);
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
-        if (i < m->nmaster) {
-            resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
-            mx += WIDTH(c) + iv;
-        } else {
-            resize(c, sx, sy, sw - (2*c->bw), sh * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0);
-            sy += HEIGHT(c) + ih;
-        }
-    }
-}
-
-/*
- * Centred master layout + gaps
- * https://dwm.suckless.org/patches/centeredmaster/
- */
-void
-centeredmaster(Monitor *m)
-{
-    unsigned int i, n;
-    int oh, ov, ih, iv;
-    int mx = 0, my = 0, mh = 0, mw = 0;
-    int lx = 0, ly = 0, lw = 0, lh = 0;
-    int rx = 0, ry = 0, rw = 0, rh = 0;
-    float mfacts = 0, lfacts = 0, rfacts = 0;
-    int mtotal = 0, ltotal = 0, rtotal = 0;
-    int mrest = 0, lrest = 0, rrest = 0;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    /* initialize areas */
-    mx = m->wx + ov;
-    my = m->wy + oh;
-    mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)) - 1);
-    mw = m->ww - 2*ov;
-    lh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - 1);
-    rh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - ((n - m->nmaster) % 2 ? 0 : 1));
-
-    if (m->nmaster && n > m->nmaster) {
-        /* go mfact box in the center if more than nmaster clients */
-        if (n - m->nmaster > 1) {
-            /* ||<-S->|<---M--->|<-S->|| */
-            mw = (m->ww - 2*ov - 2*iv) * m->mfact;
-            lw = (m->ww - mw - 2*ov - 2*iv) / 2;
-            rw = (m->ww - mw - 2*ov - 2*iv) - lw;
-            mx += lw + iv;
-        } else {
-            /* ||<---M--->|<-S->|| */
-            mw = (mw - iv) * m->mfact;
-            lw = 0;
-            rw = m->ww - mw - iv - 2*ov;
-        }
-        lx = m->wx + ov;
-        ly = m->wy + oh;
-        rx = mx + mw + iv;
-        ry = m->wy + oh;
-    }
-
-    /* calculate facts */
-    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++) {
-        if (!m->nmaster || n < m->nmaster)
-            mfacts += c->cfact;
-        else if ((n - m->nmaster) % 2)
-            lfacts += c->cfact; // total factor of left hand stack area
-        else
-            rfacts += c->cfact; // total factor of right hand stack area
-    }
-
-    for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++)
-        if (!m->nmaster || n < m->nmaster)
-            mtotal += mh * (c->cfact / mfacts);
-        else if ((n - m->nmaster) % 2)
-            ltotal += lh * (c->cfact / lfacts);
-        else
-            rtotal += rh * (c->cfact / rfacts);
-
-    mrest = mh - mtotal;
-    lrest = lh - ltotal;
-    rrest = rh - rtotal;
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
-        if (!m->nmaster || i < m->nmaster) {
-            /* nmaster clients are stacked vertically, in the center of the screen */
-            resize(c, mx, my, mw - (2*c->bw), mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
-            my += HEIGHT(c) + ih;
-        } else {
-            /* stack clients are stacked vertically */
-            if ((i - m->nmaster) % 2 ) {
-                resize(c, lx, ly, lw - (2*c->bw), lh * (c->cfact / lfacts) + ((i - 2*m->nmaster) < 2*lrest ? 1 : 0) - (2*c->bw), 0);
-                ly += HEIGHT(c) + ih;
-            } else {
-                resize(c, rx, ry, rw - (2*c->bw), rh * (c->cfact / rfacts) + ((i - 2*m->nmaster) < 2*rrest ? 1 : 0) - (2*c->bw), 0);
-                ry += HEIGHT(c) + ih;
-            }
-        }
-    }
-}
-
-void
-centeredfloatingmaster(Monitor *m)
-{
-    unsigned int i, n;
-    float mfacts, sfacts;
-    float mivf = 1.0; // master inner vertical gap factor
-    int oh, ov, ih, iv, mrest, srest;
-    int mx = 0, my = 0, mh = 0, mw = 0;
-    int sx = 0, sy = 0, sh = 0, sw = 0;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    sx = mx = m->wx + ov;
-    sy = my = m->wy + oh;
-    sh = mh = m->wh - 2*oh;
-    mw = m->ww - 2*ov - iv*(n - 1);
-    sw = m->ww - 2*ov - iv*(n - m->nmaster - 1);
-
-    if (m->nmaster && n > m->nmaster) {
-        mivf = 0.8;
-        /* go mfact box in the center if more than nmaster clients */
-        if (m->ww > m->wh) {
-            mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmaster) - 1);
-            mh = m->wh * 0.9;
-        } else {
-            mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) - 1);
-            mh = m->wh * m->mfact;
-        }
-        mx = m->wx + (m->ww - mw) / 2;
-        my = m->wy + (m->wh - mh - 2*oh) / 2;
-
-        sx = m->wx + ov;
-        sy = m->wy + oh;
-        sh = m->wh - 2*oh;
-    }
-
-    getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-        if (i < m->nmaster) {
-            /* nmaster clients are stacked horizontally, in the center of the screen */
-            resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
-            mx += WIDTH(c) + iv*mivf;
-        } else {
-            /* stack clients are stacked horizontally */
-            resize(c, sx, sy, sw * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
-            sx += WIDTH(c) + iv;
-        }
-}
-
-/*
- * Deck layout + gaps
- * https://dwm.suckless.org/patches/deck/
- */
-void
-deck(Monitor *m)
-{
-    unsigned int i, n;
-    int oh, ov, ih, iv;
-    int mx = 0, my = 0, mh = 0, mw = 0;
-    int sx = 0, sy = 0, sh = 0, sw = 0;
-    float mfacts, sfacts;
-    int mrest, srest;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    sx = mx = m->wx + ov;
-    sy = my = m->wy + oh;
-    sh = mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
-    sw = mw = m->ww - 2*ov;
-
-    if (m->nmaster && n > m->nmaster) {
-        sw = (mw - iv) * (1 - m->mfact);
-        mw = mw - iv - sw;
-        sx = mx + mw + iv;
-        sh = m->wh - 2*oh;
-    }
-
-    getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
-
-    if (n - m->nmaster > 0) /* override layout symbol */
-        snprintf(m->ltsymbol, sizeof m->ltsymbol, "D %d", n - m->nmaster);
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-        if (i < m->nmaster) {
-            resize(c, mx, my, mw - (2*c->bw), mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
-            my += HEIGHT(c) + ih;
-        } else {
-            resize(c, sx, sy, sw - (2*c->bw), sh - (2*c->bw), 0);
-        }
-}
-
-/*
- * Fibonacci layout + gaps
- * https://dwm.suckless.org/patches/fibonacci/
- */
-void
-fibonacci(Monitor *m, int s)
-{
-    unsigned int i, n;
-    int nx, ny, nw, nh;
-    int oh, ov, ih, iv;
-    int nv, hrest = 0, wrest = 0, r = 1;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    nx = m->wx + ov;
-    ny = m->wy + oh;
-    nw = m->ww - 2*ov;
-    nh = m->wh - 2*oh;
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) {
-        if (r) {
-            if ((i % 2 && (nh - ih) / 2 <= (bh + 2*c->bw))
-               || (!(i % 2) && (nw - iv) / 2 <= (bh + 2*c->bw))) {
-                r = 0;
-            }
-            if (r && i < n - 1) {
-                if (i % 2) {
-                    nv = (nh - ih) / 2;
-                    hrest = nh - 2*nv - ih;
-                    nh = nv;
-                } else {
-                    nv = (nw - iv) / 2;
-                    wrest = nw - 2*nv - iv;
-                    nw = nv;
-                }
-
-                if ((i % 4) == 2 && !s)
-                    nx += nw + iv;
-                else if ((i % 4) == 3 && !s)
-                    ny += nh + ih;
-            }
-
-            if ((i % 4) == 0) {
-                if (s) {
-                    ny += nh + ih;
-                    nh += hrest;
-                }
-                else {
-                    nh -= hrest;
-                    ny -= nh + ih;
-                }
-            }
-            else if ((i % 4) == 1) {
-                nx += nw + iv;
-                nw += wrest;
-            }
-            else if ((i % 4) == 2) {
-                ny += nh + ih;
-                nh += hrest;
-                if (i < n - 1)
-                    nw += wrest;
-            }
-            else if ((i % 4) == 3) {
-                if (s) {
-                    nx += nw + iv;
-                    nw -= wrest;
-                } else {
-                    nw -= wrest;
-                    nx -= nw + iv;
-                    nh += hrest;
-                }
-            }
-            if (i == 0)    {
-                if (n != 1) {
-                    nw = (m->ww - iv - 2*ov) - (m->ww - iv - 2*ov) * (1 - m->mfact);
-                    wrest = 0;
-                }
-                ny = m->wy + oh;
-            }
-            else if (i == 1)
-                nw = m->ww - nw - iv - 2*ov;
-            i++;
-        }
-
-        resize(c, nx, ny, nw - (2*c->bw), nh - (2*c->bw), False);
-    }
-}
-
-void
-dwindle(Monitor *m)
-{
-    fibonacci(m, 1);
-}
-
-void
-spiral(Monitor *m)
-{
-    fibonacci(m, 0);
-}
-
-/*
- * Gappless grid layout + gaps (ironically)
- * https://dwm.suckless.org/patches/gaplessgrid/
- */
-void
-gaplessgrid(Monitor *m)
-{
-    unsigned int i, n;
-    int x, y, cols, rows, ch, cw, cn, rn, rrest, crest; // counters
-    int oh, ov, ih, iv;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    /* grid dimensions */
-    for (cols = 0; cols <= n/2; cols++)
-        if (cols*cols >= n)
-            break;
-    if (n == 5) /* set layout against the general calculation: not 1:2:2, but 2:3 */
-        cols = 2;
-    rows = n/cols;
-    cn = rn = 0; // reset column no, row no, client count
-
-    ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
-    cw = (m->ww - 2*ov - iv * (cols - 1)) / cols;
-    rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
-    crest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
-    x = m->wx + ov;
-    y = m->wy + oh;
-
-    for (i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c->next)) {
-        if (i/rows + 1 > cols - n%cols) {
-            rows = n/cols + 1;
-            ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
-            rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
-        }
-        resize(c,
-            x,
-            y + rn*(ch + ih) + MIN(rn, rrest),
-            cw + (cn < crest ? 1 : 0) - 2*c->bw,
-            ch + (rn < rrest ? 1 : 0) - 2*c->bw,
-            0);
-        rn++;
-        if (rn >= rows) {
-            rn = 0;
-            x += cw + ih + (cn < crest ? 1 : 0);
-            cn++;
-        }
-    }
-}
-
-/*
- * Gridmode layout + gaps
- * https://dwm.suckless.org/patches/gridmode/
- */
-void
-grid(Monitor *m)
-{
-    unsigned int i, n;
-    int cx, cy, cw, ch, cc, cr, chrest, cwrest, cols, rows;
-    int oh, ov, ih, iv;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-
-    /* grid dimensions */
-    for (rows = 0; rows <= n/2; rows++)
-        if (rows*rows >= n)
-            break;
-    cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
-
-    /* window geoms (cell height/width) */
-    ch = (m->wh - 2*oh - ih * (rows - 1)) / (rows ? rows : 1);
-    cw = (m->ww - 2*ov - iv * (cols - 1)) / (cols ? cols : 1);
-    chrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
-    cwrest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
-        cc = i / rows;
-        cr = i % rows;
-        cx = m->wx + ov + cc * (cw + iv) + MIN(cc, cwrest);
-        cy = m->wy + oh + cr * (ch + ih) + MIN(cr, chrest);
-        resize(c, cx, cy, cw + (cc < cwrest ? 1 : 0) - 2*c->bw, ch + (cr < chrest ? 1 : 0) - 2*c->bw, False);
-    }
-}
-
-/*
- * Horizontal grid layout + gaps
- * https://dwm.suckless.org/patches/horizgrid/
- */
-void
-horizgrid(Monitor *m) {
-    Client *c;
-    unsigned int n, i;
-    int oh, ov, ih, iv;
-    int mx = 0, my = 0, mh = 0, mw = 0;
-    int sx = 0, sy = 0, sh = 0, sw = 0;
-    int ntop, nbottom = 1;
-    float mfacts = 0, sfacts = 0;
-    int mrest, srest, mtotal = 0, stotal = 0;
-
-    /* Count windows */
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    if (n <= 2)
-        ntop = n;
-    else {
-        ntop = n / 2;
-        nbottom = n - ntop;
-    }
-    sx = mx = m->wx + ov;
-    sy = my = m->wy + oh;
-    sh = mh = m->wh - 2*oh;
-    sw = mw = m->ww - 2*ov;
-
-    if (n > ntop) {
-        sh = (mh - ih) / 2;
-        mh = mh - ih - sh;
-        sy = my + mh + ih;
-        mw = m->ww - 2*ov - iv * (ntop - 1);
-        sw = m->ww - 2*ov - iv * (nbottom - 1);
-    }
-
-    /* calculate facts */
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-        if (i < ntop)
-            mfacts += c->cfact;
-        else
-            sfacts += c->cfact;
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-        if (i < ntop)
-            mtotal += mh * (c->cfact / mfacts);
-        else
-            stotal += sw * (c->cfact / sfacts);
-
-    mrest = mh - mtotal;
-    srest = sw - stotal;
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-        if (i < ntop) {
-            resize(c, mx, my, mw * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), mh - (2*c->bw), 0);
-            mx += WIDTH(c) + iv;
-        } else {
-            resize(c, sx, sy, sw * (c->cfact / sfacts) + ((i - ntop) < srest ? 1 : 0) - (2*c->bw), sh - (2*c->bw), 0);
-            sx += WIDTH(c) + iv;
-        }
-}
-
-/*
- * nrowgrid layout + gaps
- * https://dwm.suckless.org/patches/nrowgrid/
- */
-void
-nrowgrid(Monitor *m)
-{
-    unsigned int n;
-    int ri = 0, ci = 0;  /* counters */
-    int oh, ov, ih, iv;                         /* vanitygap settings */
-    unsigned int cx, cy, cw, ch;                /* client geometry */
-    unsigned int uw = 0, uh = 0, uc = 0;        /* utilization trackers */
-    unsigned int cols, rows = m->nmaster + 1;
-    Client *c;
-
-    /* count clients */
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-
-    /* nothing to do here */
-    if (n == 0)
-        return;
-
-    /* force 2 clients to always split vertically */
-    if (FORCE_VSPLIT && n == 2)
-        rows = 1;
-
-    /* never allow empty rows */
-    if (n < rows)
-        rows = n;
-
-    /* define first row */
-    cols = n / rows;
-    uc = cols;
-    cy = m->wy + oh;
-    ch = (m->wh - 2*oh - ih*(rows - 1)) / rows;
-    uh = ch;
-
-    for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++) {
-        if (ci == cols) {
-            uw = 0;
-            ci = 0;
-            ri++;
-
-            /* next row */
-            cols = (n - uc) / (rows - ri);
-            uc += cols;
-            cy = m->wy + oh + uh + ih;
-            uh += ch + ih;
-        }
-
-        cx = m->wx + ov + uw;
-        cw = (m->ww - 2*ov - uw) / (cols - ci);
-        uw += cw + iv;
-
-        resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0);
-    }
-}
-
-/*
- * Default tile layout + gaps
- */
-static void
-tile(Monitor *m)
-{
-    unsigned int i, n;
-    int oh, ov, ih, iv;
-    int mx = 0, my = 0, mh = 0, mw = 0;
-    int sx = 0, sy = 0, sh = 0, sw = 0;
-    float mfacts, sfacts;
-    int mrest, srest;
-    Client *c;
-
-    getgaps(m, &oh, &ov, &ih, &iv, &n);
-    if (n == 0)
-        return;
-
-    sx = mx = m->wx + ov;
-    sy = my = m->wy + oh;
-    mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
-    sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
-    sw = mw = m->ww - 2*ov;
-
-    if (m->nmaster && n > m->nmaster) {
-        sw = (mw - iv) * (1 - m->mfact);
-        mw = mw - iv - sw;
-        sx = mx + mw + iv;
-    }
-
-    getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
-
-    for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
-        if (i < m->nmaster) {
-            resize(c, mx, my, mw - (2*c->bw), mh * (c->cfact / mfacts) + (i < mrest ? 1 : 0) - (2*c->bw), 0);
-            my += HEIGHT(c) + ih;
-        } else {
-            resize(c, sx, sy, sw - (2*c->bw), sh * (c->cfact / sfacts) + ((i - m->nmaster) < srest ? 1 : 0) - (2*c->bw), 0);
-            sy += HEIGHT(c) + ih;
-        }
-}
-\ No newline at end of file
diff --git a/.config/dwmblocks b/.config/dwmblocks
@@ -1 +0,0 @@
-Subproject commit 78925115014bea2f4ead26f0dd7f833ff301ad11
diff --git a/README.md b/README.md
@@ -9,13 +9,15 @@
 * **Editor**: vim for code and sometimes vscode to write latex papers
 * **Web Browser**: Mozilla Firefox
 * **Login Manager**: autologin on tty1 and starting Xserver from zshrc
+
 ```console
-# Starts the X server only on tty1
-if [[ -z "$DISPLAY" ]] && [[ $(tty) = /dev/tty1 ]]; then
-    startx 2> /dev/null
-logout
-fi
+    # Starts the X server only on tty1
+    if [[ -z "$DISPLAY" ]] && [[ $(tty) = /dev/tty1 ]]; then
+        startx 2> /dev/null
+        logout
+    fi
 ```
+
 * **Lockscreen**: i3lock custom [script](https://github.com/klewer-martin/scripts/blob/inspiron/lockscreen)
 * **Notifications**: Dunst is started when X starts and dunstify to send notifications
 * **Blue light filter**: redshift