summaryrefslogtreecommitdiff
path: root/patches
diff options
context:
space:
mode:
authorSaumit Dinesan <justsaumit@protonmail.com>2022-10-07 03:36:35 +0530
committerSaumit Dinesan <justsaumit@protonmail.com>2022-10-07 03:36:35 +0530
commitd2cb1d60c7eedb2b339221318c993ba35789eecf (patch)
treeb8e8e4f2b92a529fcd8d635f7146d30927f0e9bc /patches
parentb915db4f2fcb3486e3a22fbe51ac7739e01507c1 (diff)
dwm-6.3
Diffstat (limited to 'patches')
-rw-r--r--patches/01.dwm-xrdb-6.2.diff188
-rw-r--r--patches/02.dwm-restartsig-20180523-6.2.diff139
-rw-r--r--patches/03.dwm-swallow-6.2.diff412
-rw-r--r--patches/04.dwm-fullgaps-6.2.diff97
-rw-r--r--patches/05.dwm-attachbottom-6.2.diff54
-rw-r--r--patches/06.dwm-movestack-20211115-a786211.diff95
-rw-r--r--patches/07.dwm-alwayscenter-20200625-f04cac6.diff12
-rw-r--r--patches/08.dwm-systray-1.diff731
-rw-r--r--patches/09.dwm-scratchpad-6.2.diff90
-rw-r--r--patches/10.dwm-adjacenttag-skipvacant-6.2.diff161
-rw-r--r--patches/11.dwm-gridmode-20170909-ceac8c9.diff73
-rw-r--r--patches/dwm-alternativetags-6.2.diff130
-rw-r--r--patches/dwm-default-tag-apps-20210327-61bb8b2.diff123
13 files changed, 0 insertions, 2305 deletions
diff --git a/patches/01.dwm-xrdb-6.2.diff b/patches/01.dwm-xrdb-6.2.diff
deleted file mode 100644
index 4c5a53f..0000000
--- a/patches/01.dwm-xrdb-6.2.diff
+++ /dev/null
@@ -1,188 +0,0 @@
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..5db7d05 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -7,15 +7,16 @@ static const int showbar = 1; /* 0 means no bar */
- static const int topbar = 1; /* 0 means bottom bar */
- static const char *fonts[] = { "monospace:size=10" };
- static const char dmenufont[] = "monospace:size=10";
--static const char col_gray1[] = "#222222";
--static const char col_gray2[] = "#444444";
--static const char col_gray3[] = "#bbbbbb";
--static const char col_gray4[] = "#eeeeee";
--static const char col_cyan[] = "#005577";
--static const char *colors[][3] = {
-- /* fg bg border */
-- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
-- [SchemeSel] = { col_gray4, col_cyan, col_cyan },
-+static char normbgcolor[] = "#222222";
-+static char normbordercolor[] = "#444444";
-+static char normfgcolor[] = "#bbbbbb";
-+static char selfgcolor[] = "#eeeeee";
-+static char selbordercolor[] = "#005577";
-+static char selbgcolor[] = "#005577";
-+static char *colors[][3] = {
-+ /* fg bg border */
-+ [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor },
-+ [SchemeSel] = { selfgcolor, selbgcolor, selbordercolor },
- };
-
- /* tagging */
-@@ -56,7 +57,7 @@ static const Layout layouts[] = {
-
- /* commands */
- static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
--static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
-+static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbordercolor, "-sf", selfgcolor, NULL };
- static const char *termcmd[] = { "st", NULL };
-
- static Key keys[] = {
-@@ -84,6 +85,7 @@ 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_F5, xrdb, {.v = NULL } },
- TAGKEYS( XK_1, 0)
- TAGKEYS( XK_2, 1)
- TAGKEYS( XK_3, 2)
-diff --git a/drw.c b/drw.c
-index 8fd1ca4..e4968a0 100644
---- a/drw.c
-+++ b/drw.c
-@@ -207,7 +207,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
- /* Wrapper to create color schemes. The caller has to call free(3) on the
- * returned color scheme when done using it. */
- Clr *
--drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
-+drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount)
- {
- size_t i;
- Clr *ret;
-diff --git a/drw.h b/drw.h
-index 4bcd5ad..42b04ce 100644
---- a/drw.h
-+++ b/drw.h
-@@ -39,7 +39,7 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in
-
- /* Colorscheme abstraction */
- void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
--Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
-+Clr *drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount);
-
- /* Cursor abstraction */
- Cur *drw_cur_create(Drw *drw, int shape);
-diff --git a/dwm.c b/dwm.c
-index 4465af1..7fa45c5 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -35,6 +35,7 @@
- #include <X11/Xatom.h>
- #include <X11/Xlib.h>
- #include <X11/Xproto.h>
-+#include <X11/Xresource.h>
- #include <X11/Xutil.h>
- #ifdef XINERAMA
- #include <X11/extensions/Xinerama.h>
-@@ -56,6 +57,21 @@
- #define HEIGHT(X) ((X)->h + 2 * (X)->bw)
- #define TAGMASK ((1 << LENGTH(tags)) - 1)
- #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
-+#define XRDB_LOAD_COLOR(R,V) if (XrmGetResource(xrdb, R, NULL, &type, &value) == True) { \
-+ if (value.addr != NULL && strnlen(value.addr, 8) == 7 && value.addr[0] == '#') { \
-+ int i = 1; \
-+ for (; i <= 6; i++) { \
-+ if (value.addr[i] < 48) break; \
-+ if (value.addr[i] > 57 && value.addr[i] < 65) break; \
-+ if (value.addr[i] > 70 && value.addr[i] < 97) break; \
-+ if (value.addr[i] > 102) break; \
-+ } \
-+ if (i == 7) { \
-+ strncpy(V, value.addr, 7); \
-+ V[7] = '\0'; \
-+ } \
-+ } \
-+ }
-
- /* enums */
- enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
-@@ -177,6 +193,7 @@ static void grabkeys(void);
- static void incnmaster(const Arg *arg);
- static void keypress(XEvent *e);
- static void killclient(const Arg *arg);
-+static void loadxrdb(void);
- static void manage(Window w, XWindowAttributes *wa);
- static void mappingnotify(XEvent *e);
- static void maprequest(XEvent *e);
-@@ -232,6 +249,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 xrdb(const Arg *arg);
- static void zoom(const Arg *arg);
-
- /* variables */
-@@ -1014,6 +1032,37 @@ killclient(const Arg *arg)
- }
- }
-
-+void
-+loadxrdb()
-+{
-+ Display *display;
-+ char * resm;
-+ XrmDatabase xrdb;
-+ char *type;
-+ XrmValue value;
-+
-+ display = XOpenDisplay(NULL);
-+
-+ if (display != NULL) {
-+ resm = XResourceManagerString(display);
-+
-+ if (resm != NULL) {
-+ xrdb = XrmGetStringDatabase(resm);
-+
-+ if (xrdb != NULL) {
-+ XRDB_LOAD_COLOR("dwm.normbordercolor", normbordercolor);
-+ XRDB_LOAD_COLOR("dwm.normbgcolor", normbgcolor);
-+ XRDB_LOAD_COLOR("dwm.normfgcolor", normfgcolor);
-+ XRDB_LOAD_COLOR("dwm.selbordercolor", selbordercolor);
-+ XRDB_LOAD_COLOR("dwm.selbgcolor", selbgcolor);
-+ XRDB_LOAD_COLOR("dwm.selfgcolor", selfgcolor);
-+ }
-+ }
-+ }
-+
-+ XCloseDisplay(display);
-+}
-+
- void
- manage(Window w, XWindowAttributes *wa)
- {
-@@ -2110,6 +2159,17 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
- return -1;
- }
-
-+void
-+xrdb(const Arg *arg)
-+{
-+ loadxrdb();
-+ int i;
-+ for (i = 0; i < LENGTH(colors); i++)
-+ scheme[i] = drw_scm_create(drw, colors[i], 3);
-+ focus(NULL);
-+ arrange(NULL);
-+}
-+
- void
- zoom(const Arg *arg)
- {
-@@ -2136,6 +2196,8 @@ main(int argc, char *argv[])
- if (!(dpy = XOpenDisplay(NULL)))
- die("dwm: cannot open display");
- checkotherwm();
-+ XrmInitialize();
-+ loadxrdb();
- setup();
- #ifdef __OpenBSD__
- if (pledge("stdio rpath proc exec", NULL) == -1)
diff --git a/patches/02.dwm-restartsig-20180523-6.2.diff b/patches/02.dwm-restartsig-20180523-6.2.diff
deleted file mode 100644
index f1f8680..0000000
--- a/patches/02.dwm-restartsig-20180523-6.2.diff
+++ /dev/null
@@ -1,139 +0,0 @@
-From 2991f37f0aaf44b9f9b11e7893ff0af8eb88f649 Mon Sep 17 00:00:00 2001
-From: Christopher Drelich <cd@cdrakka.com>
-Date: Wed, 23 May 2018 22:50:38 -0400
-Subject: [PATCH] Modifies quit to handle restarts and adds SIGHUP and SIGTERM
- handlers.
-
-Modified quit() to restart if it receives arg .i = 1
-MOD+CTRL+SHIFT+Q was added to confid.def.h to do just that.
-
-Signal handlers were handled for SIGHUP and SIGTERM.
-If dwm receives these signals it calls quit() with
-arg .i = to 1 or 0, respectively.
-
-To restart dwm:
-MOD+CTRL+SHIFT+Q
-or
-kill -HUP dwmpid
-
-To quit dwm cleanly:
-MOD+SHIFT+Q
-or
-kill -TERM dwmpid
----
- config.def.h | 1 +
- dwm.1 | 10 ++++++++++
- dwm.c | 22 ++++++++++++++++++++++
- 3 files changed, 33 insertions(+)
-
-diff --git a/config.def.h b/config.def.h
-index a9ac303..e559429 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -94,6 +94,7 @@ static Key keys[] = {
- TAGKEYS( XK_8, 7)
- TAGKEYS( XK_9, 8)
- { MODKEY|ShiftMask, XK_q, quit, {0} },
-+ { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} },
- };
-
- /* button definitions */
-diff --git a/dwm.1 b/dwm.1
-index 13b3729..36a331c 100644
---- a/dwm.1
-+++ b/dwm.1
-@@ -142,6 +142,9 @@ Add/remove all windows with nth tag to/from the view.
- .TP
- .B Mod1\-Shift\-q
- Quit dwm.
-+.TP
-+.B Mod1\-Control\-Shift\-q
-+Restart dwm.
- .SS Mouse commands
- .TP
- .B Mod1\-Button1
-@@ -155,6 +158,13 @@ Resize focused window while dragging. Tiled windows will be toggled to the float
- .SH CUSTOMIZATION
- dwm is customized by creating a custom config.h and (re)compiling the source
- code. This keeps it fast, secure and simple.
-+.SH SIGNALS
-+.TP
-+.B SIGHUP - 1
-+Restart the dwm process.
-+.TP
-+.B SIGTERM - 15
-+Cleanly terminate the dwm process.
- .SH SEE ALSO
- .BR dmenu (1),
- .BR st (1)
-diff --git a/dwm.c b/dwm.c
-index bb95e26..286eecd 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -205,6 +205,8 @@ static void setup(void);
- static void seturgent(Client *c, int urg);
- static void showhide(Client *c);
- static void sigchld(int unused);
-+static void sighup(int unused);
-+static void sigterm(int unused);
- static void spawn(const Arg *arg);
- static void tag(const Arg *arg);
- static void tagmon(const Arg *arg);
-@@ -260,6 +262,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
- [UnmapNotify] = unmapnotify
- };
- static Atom wmatom[WMLast], netatom[NetLast];
-+static int restart = 0;
- static int running = 1;
- static Cur *cursor[CurLast];
- static Clr **scheme;
-@@ -1248,6 +1251,7 @@ propertynotify(XEvent *e)
- void
- quit(const Arg *arg)
- {
-+ if(arg->i) restart = 1;
- running = 0;
- }
-
-@@ -1536,6 +1540,9 @@ setup(void)
- /* clean up any zombies immediately */
- sigchld(0);
-
-+ signal(SIGHUP, sighup);
-+ signal(SIGTERM, sigterm);
-+
- /* init screen */
- screen = DefaultScreen(dpy);
- sw = DisplayWidth(dpy, screen);
-@@ -1637,6 +1644,20 @@ sigchld(int unused)
- }
-
- void
-+sighup(int unused)
-+{
-+ Arg a = {.i = 1};
-+ quit(&a);
-+}
-+
-+void
-+sigterm(int unused)
-+{
-+ Arg a = {.i = 0};
-+ quit(&a);
-+}
-+
-+void
- spawn(const Arg *arg)
- {
- if (arg->v == dmenucmd)
-@@ -2139,6 +2160,7 @@ main(int argc, char *argv[])
- setup();
- scan();
- run();
-+ if(restart) execvp(argv[0], argv);
- cleanup();
- XCloseDisplay(dpy);
- return EXIT_SUCCESS;
---
-2.7.4
-
diff --git a/patches/03.dwm-swallow-6.2.diff b/patches/03.dwm-swallow-6.2.diff
deleted file mode 100644
index 5324024..0000000
--- a/patches/03.dwm-swallow-6.2.diff
+++ /dev/null
@@ -1,412 +0,0 @@
-From 3904d7521ef64938b2a8b7fb06ef5a5223d3f62b Mon Sep 17 00:00:00 2001
-From: Jack Bird <jack.bird@durham.ac.uk>
-Date: Fri, 27 Aug 2021 00:04:45 +0100
-Subject: [PATCH] 6.2 swallow patch
-
----
- config.def.h | 9 +-
- config.mk | 3 +-
- dwm.c | 235 +++++++++++++++++++++++++++++++++++++++++++++++++--
- 3 files changed, 237 insertions(+), 10 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..fe51476 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -3,6 +3,7 @@
- /* appearance */
- static const unsigned int borderpx = 1; /* border pixel of windows */
- static const unsigned int snap = 32; /* snap pixel */
-+static const int swallowfloating = 0; /* 1 means swallow floating windows by default */
- static const int showbar = 1; /* 0 means no bar */
- static const int topbar = 1; /* 0 means bottom bar */
- static const char *fonts[] = { "monospace:size=10" };
-@@ -26,9 +27,11 @@ static const Rule rules[] = {
- * WM_CLASS(STRING) = instance, class
- * WM_NAME(STRING) = title
- */
-- /* class instance title tags mask isfloating monitor */
-- { "Gimp", NULL, NULL, 0, 1, -1 },
-- { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
-+ /* class instance title tags mask isfloating isterminal noswallow monitor */
-+ { "Gimp", NULL, NULL, 0, 1, 0, 0, -1 },
-+ { "Firefox", NULL, NULL, 1 << 8, 0, 0, -1, -1 },
-+ { "St", NULL, NULL, 0, 0, 1, 0, -1 },
-+ { NULL, NULL, "Event Tester", 0, 0, 0, 1, -1 }, /* xev */
- };
-
- /* layout(s) */
-diff --git a/config.mk b/config.mk
-index 6d36cb7..5d136bc 100644
---- a/config.mk
-+++ b/config.mk
-@@ -19,10 +19,11 @@ FREETYPELIBS = -lfontconfig -lXft
- FREETYPEINC = /usr/include/freetype2
- # OpenBSD (uncomment)
- #FREETYPEINC = ${X11INC}/freetype2
-+#KVMLIB = -lkvm
-
- # includes and libs
- INCS = -I${X11INC} -I${FREETYPEINC}
--LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
-+LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} -lX11-xcb -lxcb -lxcb-res ${KVMLIB}
-
- # flags
- CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
-diff --git a/dwm.c b/dwm.c
-index 4465af1..66bd0ed 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -40,6 +40,12 @@
- #include <X11/extensions/Xinerama.h>
- #endif /* XINERAMA */
- #include <X11/Xft/Xft.h>
-+#include <X11/Xlib-xcb.h>
-+#include <xcb/res.h>
-+#ifdef __OpenBSD__
-+#include <sys/sysctl.h>
-+#include <kvm.h>
-+#endif /* __OpenBSD */
-
- #include "drw.h"
- #include "util.h"
-@@ -92,9 +98,11 @@ struct Client {
- int basew, baseh, incw, inch, maxw, maxh, minw, minh;
- int bw, oldbw;
- unsigned int tags;
-- int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
-+ int isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, isterminal, noswallow;
-+ pid_t pid;
- Client *next;
- Client *snext;
-+ Client *swallowing;
- Monitor *mon;
- Window win;
- };
-@@ -138,6 +146,8 @@ typedef struct {
- const char *title;
- unsigned int tags;
- int isfloating;
-+ int isterminal;
-+ int noswallow;
- int monitor;
- } Rule;
-
-@@ -234,6 +244,12 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee);
- static int xerrorstart(Display *dpy, XErrorEvent *ee);
- static void zoom(const Arg *arg);
-
-+static pid_t getparentprocess(pid_t p);
-+static int isdescprocess(pid_t p, pid_t c);
-+static Client *swallowingclient(Window w);
-+static Client *termforwin(const Client *c);
-+static pid_t winpid(Window w);
-+
- /* variables */
- static const char broken[] = "broken";
- static char stext[256];
-@@ -268,6 +284,8 @@ static Drw *drw;
- static Monitor *mons, *selmon;
- static Window root, wmcheckwin;
-
-+static xcb_connection_t *xcon;
-+
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-
-@@ -297,6 +315,8 @@ applyrules(Client *c)
- && (!r->class || strstr(class, r->class))
- && (!r->instance || strstr(instance, r->instance)))
- {
-+ c->isterminal = r->isterminal;
-+ c->noswallow = r->noswallow;
- c->isfloating = r->isfloating;
- c->tags |= r->tags;
- for (m = mons; m && m->num != r->monitor; m = m->next);
-@@ -413,6 +433,53 @@ attachstack(Client *c)
- c->mon->stack = c;
- }
-
-+void
-+swallow(Client *p, Client *c)
-+{
-+
-+ if (c->noswallow || c->isterminal)
-+ return;
-+ if (c->noswallow && !swallowfloating && c->isfloating)
-+ return;
-+
-+ detach(c);
-+ detachstack(c);
-+
-+ setclientstate(c, WithdrawnState);
-+ XUnmapWindow(dpy, p->win);
-+
-+ p->swallowing = c;
-+ c->mon = p->mon;
-+
-+ Window w = p->win;
-+ p->win = c->win;
-+ c->win = w;
-+ updatetitle(p);
-+ XMoveResizeWindow(dpy, p->win, p->x, p->y, p->w, p->h);
-+ arrange(p->mon);
-+ configure(p);
-+ updateclientlist();
-+}
-+
-+void
-+unswallow(Client *c)
-+{
-+ c->win = c->swallowing->win;
-+
-+ free(c->swallowing);
-+ c->swallowing = NULL;
-+
-+ /* unfullscreen the client */
-+ setfullscreen(c, 0);
-+ updatetitle(c);
-+ arrange(c->mon);
-+ XMapWindow(dpy, c->win);
-+ XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
-+ setclientstate(c, NormalState);
-+ focus(NULL);
-+ arrange(c->mon);
-+}
-+
- void
- buttonpress(XEvent *e)
- {
-@@ -652,6 +719,9 @@ destroynotify(XEvent *e)
-
- if ((c = wintoclient(ev->window)))
- unmanage(c, 1);
-+
-+ else if ((c = swallowingclient(ev->window)))
-+ unmanage(c->swallowing, 1);
- }
-
- void
-@@ -1017,12 +1087,13 @@ killclient(const Arg *arg)
- void
- manage(Window w, XWindowAttributes *wa)
- {
-- Client *c, *t = NULL;
-+ Client *c, *t = NULL, *term = NULL;
- Window trans = None;
- XWindowChanges wc;
-
- c = ecalloc(1, sizeof(Client));
- c->win = w;
-+ c->pid = winpid(w);
- /* geometry */
- c->x = c->oldx = wa->x;
- c->y = c->oldy = wa->y;
-@@ -1037,6 +1108,7 @@ manage(Window w, XWindowAttributes *wa)
- } else {
- c->mon = selmon;
- applyrules(c);
-+ term = termforwin(c);
- }
-
- if (c->x + WIDTH(c) > c->mon->mx + c->mon->mw)
-@@ -1073,6 +1145,8 @@ manage(Window w, XWindowAttributes *wa)
- c->mon->sel = c;
- arrange(c->mon);
- XMapWindow(dpy, c->win);
-+ if (term)
-+ swallow(term, c);
- focus(NULL);
- }
-
-@@ -1765,6 +1839,20 @@ unmanage(Client *c, int destroyed)
- Monitor *m = c->mon;
- XWindowChanges wc;
-
-+ if (c->swallowing) {
-+ unswallow(c);
-+ return;
-+ }
-+
-+ Client *s = swallowingclient(c->win);
-+ if (s) {
-+ free(s->swallowing);
-+ s->swallowing = NULL;
-+ arrange(m);
-+ focus(NULL);
-+ return;
-+ }
-+
- detach(c);
- detachstack(c);
- if (!destroyed) {
-@@ -1779,9 +1867,12 @@ unmanage(Client *c, int destroyed)
- XUngrabServer(dpy);
- }
- free(c);
-- focus(NULL);
-- updateclientlist();
-- arrange(m);
-+
-+ if (!s) {
-+ arrange(m);
-+ focus(NULL);
-+ updateclientlist();
-+ }
- }
-
- void
-@@ -2044,6 +2135,136 @@ view(const Arg *arg)
- arrange(selmon);
- }
-
-+pid_t
-+winpid(Window w)
-+{
-+
-+ pid_t result = 0;
-+
-+#ifdef __linux__
-+ xcb_res_client_id_spec_t spec = {0};
-+ spec.client = w;
-+ spec.mask = XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID;
-+
-+ xcb_generic_error_t *e = NULL;
-+ xcb_res_query_client_ids_cookie_t c = xcb_res_query_client_ids(xcon, 1, &spec);
-+ xcb_res_query_client_ids_reply_t *r = xcb_res_query_client_ids_reply(xcon, c, &e);
-+
-+ if (!r)
-+ return (pid_t)0;
-+
-+ xcb_res_client_id_value_iterator_t i = xcb_res_query_client_ids_ids_iterator(r);
-+ for (; i.rem; xcb_res_client_id_value_next(&i)) {
-+ spec = i.data->spec;
-+ if (spec.mask & XCB_RES_CLIENT_ID_MASK_LOCAL_CLIENT_PID) {
-+ uint32_t *t = xcb_res_client_id_value_value(i.data);
-+ result = *t;
-+ break;
-+ }
-+ }
-+
-+ free(r);
-+
-+ if (result == (pid_t)-1)
-+ result = 0;
-+
-+#endif /* __linux__ */
-+
-+#ifdef __OpenBSD__
-+ Atom type;
-+ int format;
-+ unsigned long len, bytes;
-+ unsigned char *prop;
-+ pid_t ret;
-+
-+ if (XGetWindowProperty(dpy, w, XInternAtom(dpy, "_NET_WM_PID", 0), 0, 1, False, AnyPropertyType, &type, &format, &len, &bytes, &prop) != Success || !prop)
-+ return 0;
-+
-+ ret = *(pid_t*)prop;
-+ XFree(prop);
-+ result = ret;
-+
-+#endif /* __OpenBSD__ */
-+ return result;
-+}
-+
-+pid_t
-+getparentprocess(pid_t p)
-+{
-+ unsigned int v = 0;
-+
-+#ifdef __linux__
-+ FILE *f;
-+ char buf[256];
-+ snprintf(buf, sizeof(buf) - 1, "/proc/%u/stat", (unsigned)p);
-+
-+ if (!(f = fopen(buf, "r")))
-+ return 0;
-+
-+ fscanf(f, "%*u %*s %*c %u", &v);
-+ fclose(f);
-+#endif /* __linux__*/
-+
-+#ifdef __OpenBSD__
-+ int n;
-+ kvm_t *kd;
-+ struct kinfo_proc *kp;
-+
-+ kd = kvm_openfiles(NULL, NULL, NULL, KVM_NO_FILES, NULL);
-+ if (!kd)
-+ return 0;
-+
-+ kp = kvm_getprocs(kd, KERN_PROC_PID, p, sizeof(*kp), &n);
-+ v = kp->p_ppid;
-+#endif /* __OpenBSD__ */
-+
-+ return (pid_t)v;
-+}
-+
-+int
-+isdescprocess(pid_t p, pid_t c)
-+{
-+ while (p != c && c != 0)
-+ c = getparentprocess(c);
-+
-+ return (int)c;
-+}
-+
-+Client *
-+termforwin(const Client *w)
-+{
-+ Client *c;
-+ Monitor *m;
-+
-+ if (!w->pid || w->isterminal)
-+ return NULL;
-+
-+ for (m = mons; m; m = m->next) {
-+ for (c = m->clients; c; c = c->next) {
-+ if (c->isterminal && !c->swallowing && c->pid && isdescprocess(c->pid, w->pid))
-+ return c;
-+ }
-+ }
-+
-+ return NULL;
-+}
-+
-+Client *
-+swallowingclient(Window w)
-+{
-+ Client *c;
-+ Monitor *m;
-+
-+ for (m = mons; m; m = m->next) {
-+ for (c = m->clients; c; c = c->next) {
-+ if (c->swallowing && c->swallowing->win == w)
-+ return c;
-+ }
-+ }
-+
-+ return NULL;
-+}
-+
- Client *
- wintoclient(Window w)
- {
-@@ -2135,10 +2356,12 @@ main(int argc, char *argv[])
- fputs("warning: no locale support\n", stderr);
- if (!(dpy = XOpenDisplay(NULL)))
- die("dwm: cannot open display");
-+ if (!(xcon = XGetXCBConnection(dpy)))
-+ die("dwm: cannot get xcb connection\n");
- checkotherwm();
- setup();
- #ifdef __OpenBSD__
-- if (pledge("stdio rpath proc exec", NULL) == -1)
-+ if (pledge("stdio rpath proc exec ps", NULL) == -1)
- die("pledge");
- #endif /* __OpenBSD__ */
- scan();
---
-2.33.0
-
diff --git a/patches/04.dwm-fullgaps-6.2.diff b/patches/04.dwm-fullgaps-6.2.diff
deleted file mode 100644
index c09a1a9..0000000
--- a/patches/04.dwm-fullgaps-6.2.diff
+++ /dev/null
@@ -1,97 +0,0 @@
-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 = 15; /* 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.c b/dwm.c
-index 4465af1..4363627 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];
-@@ -199,6 +200,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);
-@@ -638,6 +640,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);
-@@ -1497,6 +1500,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)
- {
-@@ -1683,16 +1696,16 @@ 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);
-+ 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);
-+ ty += HEIGHT(c) + m->gappx;
- }
- }
-
---
-2.20.1
-
diff --git a/patches/05.dwm-attachbottom-6.2.diff b/patches/05.dwm-attachbottom-6.2.diff
deleted file mode 100644
index 82fa119..0000000
--- a/patches/05.dwm-attachbottom-6.2.diff
+++ /dev/null
@@ -1,54 +0,0 @@
-diff -up dwm-6.2/dwm.c dwm-6.2-attachbottom/dwm.c
---- dwm-6.2/dwm.c 2019-02-02 13:55:28.000000000 +0100
-+++ dwm-6.2-attachbottom/dwm.c 2020-12-27 10:43:35.956867775 +0100
-@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int
- static void arrange(Monitor *m);
- static void arrangemon(Monitor *m);
- static void attach(Client *c);
-+static void attachbottom(Client *c);
- static void attachstack(Client *c);
- static void buttonpress(XEvent *e);
- static void checkotherwm(void);
-@@ -407,6 +408,15 @@ attach(Client *c)
- }
-
- void
-+attachbottom(Client *c)
-+{
-+ Client **tc;
-+ c->next = NULL;
-+ for (tc = &c->mon->clients; *tc; tc = &(*tc)->next);
-+ *tc = c;
-+}
-+
-+void
- attachstack(Client *c)
- {
- c->snext = c->mon->stack;
-@@ -1062,7 +1072,7 @@ manage(Window w, XWindowAttributes *wa)
- c->isfloating = c->oldstate = trans != None || c->isfixed;
- if (c->isfloating)
- XRaiseWindow(dpy, c->win);
-- attach(c);
-+ attachbottom(c);
- attachstack(c);
- XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
- (unsigned char *) &(c->win), 1);
-@@ -1417,7 +1427,7 @@ sendmon(Client *c, Monitor *m)
- detachstack(c);
- c->mon = m;
- c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
-- attach(c);
-+ attachbottom(c);
- attachstack(c);
- focus(NULL);
- arrange(NULL);
-@@ -1897,7 +1907,7 @@ updategeom(void)
- m->clients = c->next;
- detachstack(c);
- c->mon = mons;
-- attach(c);
-+ attachbottom(c);
- attachstack(c);
- }
- if (m == selmon)
diff --git a/patches/06.dwm-movestack-20211115-a786211.diff b/patches/06.dwm-movestack-20211115-a786211.diff
deleted file mode 100644
index 134abb8..0000000
--- a/patches/06.dwm-movestack-20211115-a786211.diff
+++ /dev/null
@@ -1,95 +0,0 @@
-From 9a4037dc0ef56f91c009317e78e9e3790dafbb58 Mon Sep 17 00:00:00 2001
-From: BrunoCooper17 <BrunoCooper17@outlook.com>
-Date: Mon, 15 Nov 2021 14:04:53 -0600
-Subject: [PATCH] MoveStack patch
-
-This plugin allows you to move clients around in the stack and swap them
-with the master. It emulates the behavior off mod+shift+j and mod+shift+k
-in Xmonad. movestack(+1) will swap the client with the current focus with
-the next client. movestack(-1) will swap the client with the current focus
-with the previous client.
----
- config.def.h | 3 +++
- movestack.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 51 insertions(+)
- create mode 100644 movestack.c
-
-diff --git a/config.def.h b/config.def.h
-index a2ac963..33efa5b 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -60,6 +60,7 @@ static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn()
- static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
- static const char *termcmd[] = { "st", NULL };
-
-+#include "movestack.c"
- static Key keys[] = {
- /* modifier key function argument */
- { MODKEY, XK_p, spawn, {.v = dmenucmd } },
-@@ -71,6 +72,8 @@ 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_j, movestack, {.i = +1 } },
-+ { MODKEY|ShiftMask, XK_k, movestack, {.i = -1 } },
- { MODKEY, XK_Return, zoom, {0} },
- { MODKEY, XK_Tab, view, {0} },
- { MODKEY|ShiftMask, XK_c, killclient, {0} },
-diff --git a/movestack.c b/movestack.c
-new file mode 100644
-index 0000000..520f4ae
---- /dev/null
-+++ b/movestack.c
-@@ -0,0 +1,48 @@
-+void
-+movestack(const Arg *arg) {
-+ Client *c = NULL, *p = NULL, *pc = NULL, *i;
-+
-+ if(arg->i > 0) {
-+ /* find the client after selmon->sel */
-+ for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
-+ if(!c)
-+ for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
-+
-+ }
-+ else {
-+ /* find the client before selmon->sel */
-+ for(i = selmon->clients; i != selmon->sel; i = i->next)
-+ if(ISVISIBLE(i) && !i->isfloating)
-+ c = i;
-+ if(!c)
-+ for(; i; i = i->next)
-+ if(ISVISIBLE(i) && !i->isfloating)
-+ c = i;
-+ }
-+ /* find the client before selmon->sel and c */
-+ for(i = selmon->clients; i && (!p || !pc); i = i->next) {
-+ if(i->next == selmon->sel)
-+ p = i;
-+ if(i->next == c)
-+ pc = i;
-+ }
-+
-+ /* swap c and selmon->sel selmon->clients in the selmon->clients list */
-+ if(c && c != selmon->sel) {
-+ Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next;
-+ selmon->sel->next = c->next==selmon->sel?c:c->next;
-+ c->next = temp;
-+
-+ if(p && p != c)
-+ p->next = c;
-+ if(pc && pc != selmon->sel)
-+ pc->next = selmon->sel;
-+
-+ if(selmon->sel == selmon->clients)
-+ selmon->clients = c;
-+ else if(c == selmon->clients)
-+ selmon->clients = selmon->sel;
-+
-+ arrange(selmon);
-+ }
-+}
-\ No newline at end of file
---
-2.33.1
-
diff --git a/patches/07.dwm-alwayscenter-20200625-f04cac6.diff b/patches/07.dwm-alwayscenter-20200625-f04cac6.diff
deleted file mode 100644
index 03ea9ef..0000000
--- a/patches/07.dwm-alwayscenter-20200625-f04cac6.diff
+++ /dev/null
@@ -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/patches/08.dwm-systray-1.diff b/patches/08.dwm-systray-1.diff
deleted file mode 100644
index 50af9fe..0000000
--- a/patches/08.dwm-systray-1.diff
+++ /dev/null
@@ -1,731 +0,0 @@
-This patch was written by Salonia Matteo <saloniamatteo@protonmail.com>
-It was based on this patch: https://dwm.suckless.org/patches/systray/dwm-systray-6.2.diff
-It was modified so that dwm compiles properly, without any errors.
-
---- config.h 2020-11-21 09:37:23.971438123 +0100
-+++ config.h 2020-11-23 18:49:56.192651699 +0100
-@@ -7,6 +7,10 @@
- /* appearance */
- static unsigned int borderpx = 3; /* border pixel of windows */
- static unsigned int snap = 32; /* snap pixel */
-+static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */
-+static const unsigned int systrayspacing = 2; /* systray spacing */
-+static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/
-+static const int showsystray = 1; /* 0 means no systray */
- static unsigned int gappih = 20; /* horiz inner gap between windows */
- static unsigned int gappiv = 10; /* vert inner gap between windows */
- static unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */
-
---- dwm.c 2020-11-17 11:33:20.578878727 +0100
-+++ dwm.c 2020-11-23 18:56:39.797123619 +0100
-@@ -69,12 +69,30 @@
- #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
- #define TRUNC(X,A,B) (MAX((A), MIN((X), (B))))
-
-+#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 */
-@@ -174,6 +192,12 @@
- void *dst;
- } ResourcePref;
-
-+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);
-@@ -206,6 +230,7 @@
- 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);
-@@ -224,14 +249,17 @@
- static void pushstack(const Arg *arg);
- 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);
-@@ -251,6 +279,7 @@
- static void sighup(int unused);
- static void sigterm(int unused);
- static void spawn(const Arg *arg);
-+static Monitor *systraytomon(Monitor *m);
- static int stackpos(const Arg *arg);
- static void tag(const Arg *arg);
- static void tagmon(const Arg *arg);
-@@ -271,12 +300,16 @@
- 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);
-@@ -292,6 +325,7 @@
-
-
- /* variables */
-+static Systray *systray = NULL;
- static const char broken[] = "broken";
- static char stext[256];
- static char rawstext[256];
-@@ -317,9 +351,10 @@
- [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 restart = 0;
- static int running = 1;
- static Cur *cursor[CurLast];
-@@ -560,7 +595,7 @@
- arg.ui = 1 << i;
- } else if (ev->x < x + blw)
- click = ClkLtSymbol;
-- else if (ev->x > (x = selmon->ww - TEXTW(stext) + lrpad)) {
-+ else if (ev->x > (x = selmon->ww - TEXTW(stext) - getsystraywidth())) {
- click = ClkStatusText;
-
- char *text = rawstext;
-@@ -620,6 +655,11 @@
- 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++)
-@@ -650,9 +690,57 @@
- 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]) {
-@@ -705,7 +793,7 @@
- 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);
-@@ -807,6 +895,11 @@
-
- if ((c = wintoclient(ev->window)))
- unmanage(c, 1);
-+ else if ((c = wintosystrayicon(ev->window))) {
-+ removesystrayicon(c);
-+ resizebarwin(selmon);
-+ updatesystray();
-+ }
-
- else if ((c = swallowingclient(ev->window)))
- unmanage(c->swallowing, 1);
-@@ -853,19 +946,24 @@
- void
- drawbar(Monitor *m)
- {
-- int x, w, tw = 0;
-+ int x, w, tw, stw = 0;
- int boxs = drw->fonts->h / 9;
- int boxw = drw->fonts->h / 6 + 2;
- unsigned int i, occ = 0, urg = 0;
- Client *c;
-
-+ if(showsystray && m == systraytomon(m))
-+ stw = getsystraywidth();
-+
-+
- /* draw status first so it can be overdrawn by tags later */
- if (m == selmon) { /* status is only drawn on selected monitor */
- drw_setscheme(drw, scheme[SchemeNorm]);
-- 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 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 == 255 ? 0 : c->tags;
- if (c->isurgent)
-@@ -886,7 +984,7 @@
- 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);
-@@ -897,7 +995,7 @@
- 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
-@@ -934,8 +1032,11 @@
- 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
-@@ -1009,10 +1110,17 @@
- 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;
-@@ -1060,6 +1168,16 @@
- 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)
- {
-@@ -1164,7 +1282,7 @@
- {
- 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);
-@@ -1256,6 +1374,12 @@
- {
- 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;
-@@ -1403,6 +1527,16 @@
- 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) {
-@@ -1455,6 +1589,20 @@
- }
-
- 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))
-@@ -1462,6 +1610,14 @@
- }
-
- void
-+resizebarwin(Monitor *m) {
-+ unsigned int w = m->ww;
-+ if (showsystray && m == systraytomon(m))
-+ w -= getsystraywidth();
-+ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh);
-+}
-+
-+void
- resizeclient(Client *c, int x, int y, int w, int h)
- {
- XWindowChanges wc;
-@@ -1534,6 +1690,19 @@
- }
-
- 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;
-@@ -1627,26 +1796,36 @@
- }
-
- 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;
- }
-@@ -1660,7 +1839,7 @@
- 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
-@@ -1782,6 +1961,10 @@
- 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);
-@@ -1789,6 +1972,9 @@
- 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);
-@@ -1797,6 +1983,8 @@
- 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();
-@@ -1937,7 +2125,18 @@
- {
- 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);
- }
-
-@@ -2091,11 +2290,18 @@
- 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,
-@@ -2106,10 +2312,15 @@
- 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);
- }
-@@ -2287,6 +2498,121 @@
- 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 w = 1;
-+
-+ if (!showsystray)
-+ return;
-+ if (!systray) {
-+ /* init systray */
-+ if (!(systray = (Systray *)calloc(1, sizeof(Systray))))
-+ die("fatal: could not malloc() %u bytes\n", sizeof(Systray));
-+ systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel);
-+ wa.event_mask = ButtonPressMask | ExposureMask;
-+ wa.override_redirect = True;
-+ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
-+ XSelectInput(dpy, systray->win, SubstructureNotifyMask);
-+ XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32,
-+ PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1);
-+ XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa);
-+ XMapRaised(dpy, systray->win);
-+ XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime);
-+ if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) {
-+ sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0);
-+ XSync(dpy, False);
-+ }
-+ else {
-+ fprintf(stderr, "dwm: unable to obtain system tray.\n");
-+ free(systray);
-+ systray = NULL;
-+ return;
-+ }
-+ }
-+ for (w = 0, i = systray->icons; i; i = i->next) {
-+ /* make sure the background color stays the same */
-+ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel;
-+ XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa);
-+ XMapRaised(dpy, i->win);
-+ w += systrayspacing;
-+ i->x = w;
-+ XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h);
-+ w += i->w;
-+ if (i->mon != m)
-+ i->mon = m;
-+ }
-+ w = w ? w + systrayspacing : 1;
-+ x -= w;
-+ XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh);
-+ wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh;
-+ wc.stack_mode = Above; wc.sibling = m->barwin;
-+ XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc);
-+ XMapWindow(dpy, systray->win);
-+ XMapSubwindows(dpy, systray->win);
-+ /* redraw background */
-+ XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel);
-+ XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh);
-+ XSync(dpy, False);
- }
-
- void
-@@ -2458,6 +2784,16 @@
- 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)
- {
-@@ -2511,6 +2847,22 @@
- 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)
- {
diff --git a/patches/09.dwm-scratchpad-6.2.diff b/patches/09.dwm-scratchpad-6.2.diff
deleted file mode 100644
index 2062263..0000000
--- a/patches/09.dwm-scratchpad-6.2.diff
+++ /dev/null
@@ -1,90 +0,0 @@
-diff -up a/config.def.h b/config.def.h
---- a/config.def.h 2019-06-06 21:23:27.006661784 +0200
-+++ b/config.def.h 2019-06-20 15:05:59.083102462 +0200
-@@ -58,11 +58,14 @@ static const Layout layouts[] = {
- static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
- static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
- static const char *termcmd[] = { "st", NULL };
-+static const char scratchpadname[] = "scratchpad";
-+static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL };
-
- static Key keys[] = {
- /* modifier key function argument */
- { MODKEY, XK_p, spawn, {.v = dmenucmd } },
- { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
-+ { MODKEY, XK_grave, togglescratch, {.v = scratchpadcmd } },
- { MODKEY, XK_b, togglebar, {0} },
- { MODKEY, XK_j, focusstack, {.i = +1 } },
- { MODKEY, XK_k, focusstack, {.i = -1 } },
-diff -up a/dwm.c b/dwm.c
---- a/dwm.c 2019-06-06 21:23:27.023328450 +0200
-+++ b/dwm.c 2019-06-20 15:07:01.089767947 +0200
-@@ -213,6 +213,7 @@ static void tagmon(const Arg *arg);
- static void tile(Monitor *);
- static void togglebar(const Arg *arg);
- static void togglefloating(const Arg *arg);
-+static void togglescratch(const Arg *arg);
- static void toggletag(const Arg *arg);
- static void toggleview(const Arg *arg);
- static void unfocus(Client *c, int setfocus);
-@@ -273,6 +274,8 @@ static Window root, wmcheckwin;
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-
-+static unsigned int scratchtag = 1 << LENGTH(tags);
-+
- /* compile-time check if all tags fit into an unsigned int bit array. */
- struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
-
-@@ -1052,6 +1055,14 @@ manage(Window w, XWindowAttributes *wa)
- && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my);
- c->bw = borderpx;
-
-+ selmon->tagset[selmon->seltags] &= ~scratchtag;
-+ if (!strcmp(c->name, scratchpadname)) {
-+ c->mon->tagset[c->mon->seltags] |= c->tags = scratchtag;
-+ c->isfloating = True;
-+ c->x = c->mon->wx + (c->mon->ww / 2 - WIDTH(c) / 2);
-+ c->y = c->mon->wy + (c->mon->wh / 2 - HEIGHT(c) / 2);
-+ }
-+
- wc.border_width = c->bw;
- XConfigureWindow(dpy, w, CWBorderWidth, &wc);
- XSetWindowBorder(dpy, w, scheme[SchemeNorm][ColBorder].pixel);
-@@ -1661,6 +1672,7 @@ spawn(const Arg *arg)
- {
- if (arg->v == dmenucmd)
- dmenumon[0] = '0' + selmon->num;
-+ selmon->tagset[selmon->seltags] &= ~scratchtag;
- if (fork() == 0) {
- if (dpy)
- close(ConnectionNumber(dpy));
-@@ -1748,6 +1760,28 @@ togglefloating(const Arg *arg)
- }
-
- void
-+togglescratch(const Arg *arg)
-+{
-+ Client *c;
-+ unsigned int found = 0;
-+
-+ for (c = selmon->clients; c && !(found = c->tags & scratchtag); c = c->next);
-+ if (found) {
-+ unsigned int newtagset = selmon->tagset[selmon->seltags] ^ scratchtag;
-+ if (newtagset) {
-+ selmon->tagset[selmon->seltags] = newtagset;
-+ focus(NULL);
-+ arrange(selmon);
-+ }
-+ if (ISVISIBLE(c)) {
-+ focus(c);
-+ restack(selmon);
-+ }
-+ } else
-+ spawn(arg);
-+}
-+
-+void
- toggletag(const Arg *arg)
- {
- unsigned int newtags;
diff --git a/patches/10.dwm-adjacenttag-skipvacant-6.2.diff b/patches/10.dwm-adjacenttag-skipvacant-6.2.diff
deleted file mode 100644
index 6e39d71..0000000
--- a/patches/10.dwm-adjacenttag-skipvacant-6.2.diff
+++ /dev/null
@@ -1,161 +0,0 @@
-diff -up a/config.def.h b/config.def.h
---- a/config.def.h 2021-10-02 14:22:28.034782413 +0100
-+++ b/config.def.h 2021-10-02 14:22:28.044723532 +0100
-@@ -84,6 +84,10 @@ 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_Right, viewnext, {0} },
-+ { MODKEY, XK_Left, viewprev, {0} },
-+ { MODKEY|ShiftMask, XK_Right, tagtonext, {0} },
-+ { MODKEY|ShiftMask, XK_Left, tagtoprev, {0} },
- TAGKEYS( XK_1, 0)
- TAGKEYS( XK_2, 1)
- TAGKEYS( XK_3, 2)
-diff -up a/dwm.c b/dwm.c
---- a/dwm.c 2021-10-02 14:22:28.034782413 +0100
-+++ b/dwm.c 2021-10-02 14:27:54.599845767 +0100
-@@ -183,8 +183,10 @@ static void maprequest(XEvent *e);
- static void monocle(Monitor *m);
- static void motionnotify(XEvent *e);
- static void movemouse(const Arg *arg);
-+static unsigned int nexttag(void);
- static Client *nexttiled(Client *c);
- static void pop(Client *);
-+static unsigned int prevtag(void);
- static void propertynotify(XEvent *e);
- static void quit(const Arg *arg);
- static Monitor *recttomon(int x, int y, int w, int h);
-@@ -208,6 +210,8 @@ 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 tagtonext(const Arg *arg);
-+static void tagtoprev(const Arg *arg);
- static void tile(Monitor *);
- static void togglebar(const Arg *arg);
- static void togglefloating(const Arg *arg);
-@@ -227,6 +231,8 @@ static void updatetitle(Client *c);
- static void updatewindowtype(Client *c);
- static void updatewmhints(Client *c);
- static void view(const Arg *arg);
-+static void viewnext(const Arg *arg);
-+static void viewprev(const Arg *arg);
- static Client *wintoclient(Window w);
- static Monitor *wintomon(Window w);
- static int xerror(Display *dpy, XErrorEvent *ee);
-@@ -1192,6 +1198,29 @@ movemouse(const Arg *arg)
- }
- }
-
-+unsigned int
-+nexttag(void)
-+{
-+ unsigned int seltag = selmon->tagset[selmon->seltags];
-+ unsigned int usedtags = 0;
-+ Client *c = selmon->clients;
-+
-+ if (!c)
-+ return seltag;
-+
-+ /* skip vacant tags */
-+ do {
-+ usedtags |= c->tags;
-+ c = c->next;
-+ } while (c);
-+
-+ do {
-+ seltag = seltag == (1 << (LENGTH(tags) - 1)) ? 1 : seltag << 1;
-+ } while (!(seltag & usedtags));
-+
-+ return seltag;
-+}
-+
- Client *
- nexttiled(Client *c)
- {
-@@ -1208,6 +1237,28 @@ pop(Client *c)
- arrange(c->mon);
- }
-
-+unsigned int
-+prevtag(void)
-+{
-+ unsigned int seltag = selmon->tagset[selmon->seltags];
-+ unsigned int usedtags = 0;
-+ Client *c = selmon->clients;
-+ if (!c)
-+ return seltag;
-+
-+ /* skip vacant tags */
-+ do {
-+ usedtags |= c->tags;
-+ c = c->next;
-+ } while (c);
-+
-+ do {
-+ seltag = seltag == 1 ? (1 << (LENGTH(tags) - 1)) : seltag >> 1;
-+ } while (!(seltag & usedtags));
-+
-+ return seltag;
-+}
-+
- void
- propertynotify(XEvent *e)
- {
-@@ -1671,6 +1722,36 @@ tagmon(const Arg *arg)
- }
-
- void
-+tagtonext(const Arg *arg)
-+{
-+ unsigned int tmp;
-+
-+ if (selmon->sel == NULL)
-+ return;
-+
-+ if ((tmp = nexttag()) == selmon->tagset[selmon->seltags])
-+ return;
-+
-+ tag(&(const Arg){.ui = tmp });
-+ view(&(const Arg){.ui = tmp });
-+}
-+
-+void
-+tagtoprev(const Arg *arg)
-+{
-+ unsigned int tmp;
-+
-+ if (selmon->sel == NULL)
-+ return;
-+
-+ if ((tmp = prevtag()) == selmon->tagset[selmon->seltags])
-+ return;
-+
-+ tag(&(const Arg){.ui = tmp });
-+ view(&(const Arg){.ui = tmp });
-+}
-+
-+void
- tile(Monitor *m)
- {
- unsigned int i, n, h, mw, my, ty;
-@@ -2044,6 +2125,18 @@ view(const Arg *arg)
- arrange(selmon);
- }
-
-+void
-+viewnext(const Arg *arg)
-+{
-+ view(&(const Arg){.ui = nexttag()});
-+}
-+
-+void
-+viewprev(const Arg *arg)
-+{
-+ view(&(const Arg){.ui = prevtag()});
-+}
-+
- Client *
- wintoclient(Window w)
- {
diff --git a/patches/11.dwm-gridmode-20170909-ceac8c9.diff b/patches/11.dwm-gridmode-20170909-ceac8c9.diff
deleted file mode 100644
index feec67b..0000000
--- a/patches/11.dwm-gridmode-20170909-ceac8c9.diff
+++ /dev/null
@@ -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/patches/dwm-alternativetags-6.2.diff b/patches/dwm-alternativetags-6.2.diff
deleted file mode 100644
index 9eb8c8b..0000000
--- a/patches/dwm-alternativetags-6.2.diff
+++ /dev/null
@@ -1,130 +0,0 @@
-From b55c4bc2efa0331a6fb521d41169e8ddf8bc9b13 Mon Sep 17 00:00:00 2001
-From: Jack Bird <jack.bird@durham.ac.uk>
-Date: Sun, 29 Aug 2021 17:30:40 +0100
-Subject: [PATCH] Added momentary config option
-
----
- config.def.h | 3 +++
- dwm.c | 35 +++++++++++++++++++++++++++++++++--
- 2 files changed, 36 insertions(+), 2 deletions(-)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..4cfcef1 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -20,6 +20,8 @@ static const char *colors[][3] = {
-
- /* tagging */
- static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
-+static const char *tagsalt[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
-+static const int momentaryalttags = 0; /* 1 means alttags will show only when key is held down*/
-
- static const Rule rules[] = {
- /* xprop(1):
-@@ -84,6 +86,7 @@ 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_n, togglealttag, {0} },
- TAGKEYS( XK_1, 0)
- TAGKEYS( XK_2, 1)
- TAGKEYS( XK_3, 2)
-diff --git a/dwm.c b/dwm.c
-index 4465af1..1e6e6f3 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -130,6 +130,7 @@ struct Monitor {
- Monitor *next;
- Window barwin;
- const Layout *lt[2];
-+ unsigned int alttag;
- };
-
- typedef struct {
-@@ -176,6 +177,7 @@ static void grabbuttons(Client *c, int focused);
- static void grabkeys(void);
- static void incnmaster(const Arg *arg);
- static void keypress(XEvent *e);
-+static void keyrelease(XEvent *e);
- static void killclient(const Arg *arg);
- static void manage(Window w, XWindowAttributes *wa);
- static void mappingnotify(XEvent *e);
-@@ -209,6 +211,7 @@ static void spawn(const Arg *arg);
- static void tag(const Arg *arg);
- static void tagmon(const Arg *arg);
- static void tile(Monitor *);
-+static void togglealttag();
- static void togglebar(const Arg *arg);
- static void togglefloating(const Arg *arg);
- static void toggletag(const Arg *arg);
-@@ -253,6 +256,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
- [Expose] = expose,
- [FocusIn] = focusin,
- [KeyPress] = keypress,
-+ [KeyRelease] = keyrelease,
- [MappingNotify] = mappingnotify,
- [MapRequest] = maprequest,
- [MotionNotify] = motionnotify,
-@@ -695,7 +699,7 @@ dirtomon(int dir)
- void
- drawbar(Monitor *m)
- {
-- int x, w, sw = 0;
-+ int x, w, wdelta, sw = 0;
- int boxs = drw->fonts->h / 9;
- int boxw = drw->fonts->h / 6 + 2;
- unsigned int i, occ = 0, urg = 0;
-@@ -716,8 +720,9 @@ drawbar(Monitor *m)
- x = 0;
- for (i = 0; i < LENGTH(tags); i++) {
- w = TEXTW(tags[i]);
-+ wdelta = selmon->alttag ? abs(TEXTW(tags[i]) - TEXTW(tagsalt[i])) / 2 : 0;
- 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);
-+ drw_text(drw, x, 0, w, bh, wdelta + lrpad / 2, (selmon->alttag ? tagsalt[i] : 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,
-@@ -998,6 +1003,25 @@ keypress(XEvent *e)
- keys[i].func(&(keys[i].arg));
- }
-
-+void
-+keyrelease(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 (momentaryalttags
-+ && keys[i].func && keys[i].func == togglealttag
-+ && selmon->alttag
-+ && (keysym == keys[i].keysym
-+ || CLEANMASK(keys[i].mod) == CLEANMASK(ev->state)))
-+ keys[i].func(&(keys[i].arg));
-+}
-+
- void
- killclient(const Arg *arg)
- {
-@@ -1696,6 +1720,13 @@ tile(Monitor *m)
- }
- }
-
-+void
-+togglealttag()
-+{
-+ selmon->alttag = !selmon->alttag;
-+ drawbar(selmon);
-+}
-+
- void
- togglebar(const Arg *arg)
- {
---
-2.33.0
-
diff --git a/patches/dwm-default-tag-apps-20210327-61bb8b2.diff b/patches/dwm-default-tag-apps-20210327-61bb8b2.diff
deleted file mode 100644
index 1ab3a6a..0000000
--- a/patches/dwm-default-tag-apps-20210327-61bb8b2.diff
+++ /dev/null
@@ -1,123 +0,0 @@
-From 2666387a3f50c21b0503e9a7291f012e70e92086 Mon Sep 17 00:00:00 2001
-From: NlGHT <night@nightmusic.net>
-Date: Sat, 27 Mar 2021 12:01:26 +0100
-Subject: [PATCH] Default tag apps - set application for each tag
-Then you can use the one keybind to spawn the default application of the tag you're on.
-
----
- config.def.h | 2 ++
- dwm.c | 36 ++++++++++++++++++++++++++++++++++++
- 2 files changed, 38 insertions(+)
-
-diff --git a/config.def.h b/config.def.h
-index 1c0b587..066c7cc 100644
---- a/config.def.h
-+++ b/config.def.h
-@@ -20,6 +20,7 @@ static const char *colors[][3] = {
-
- /* tagging */
- static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
-+static const char *defaulttagapps[] = { "st", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
-
- static const Rule rules[] = {
- /* xprop(1):
-@@ -63,6 +64,7 @@ static Key keys[] = {
- /* modifier key function argument */
- { MODKEY, XK_p, spawn, {.v = dmenucmd } },
- { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
-+ { MODKEY, XK_s, spawndefault, {0} },
- { MODKEY, XK_b, togglebar, {0} },
- { MODKEY, XK_j, focusstack, {.i = +1 } },
- { MODKEY, XK_k, focusstack, {.i = -1 } },
-diff --git a/dwm.c b/dwm.c
-index 664c527..e0769ec 100644
---- a/dwm.c
-+++ b/dwm.c
-@@ -200,6 +200,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 setlasttag(int tagbit);
- static void setlayout(const Arg *arg);
- static void setmfact(const Arg *arg);
- static void setup(void);
-@@ -207,6 +208,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 void spawndefault();
- static void tag(const Arg *arg);
- static void tagmon(const Arg *arg);
- static void tile(Monitor *);
-@@ -269,6 +271,9 @@ static Drw *drw;
- static Monitor *mons, *selmon;
- static Window root, wmcheckwin;
-
-+static int lastchosentag[8];
-+static int previouschosentag[8];
-+
- /* configuration, allows nested code to access above variables */
- #include "config.h"
-
-@@ -1498,6 +1503,24 @@ setfullscreen(Client *c, int fullscreen)
- }
- }
-
-+void
-+setlasttag(int tagbit) {
-+ const int mon = selmon->num;
-+ if (tagbit > 0) {
-+ int i = 1, pos = 0;
-+ while (!(i & tagbit)) {
-+ i = i << 1;
-+ ++pos;
-+ }
-+ previouschosentag[mon] = lastchosentag[mon];
-+ lastchosentag[mon] = pos;
-+ } else {
-+ const int tempTag = lastchosentag[mon];
-+ lastchosentag[mon] = previouschosentag[mon];
-+ previouschosentag[mon] = tempTag;
-+ }
-+}
-+
- void
- setlayout(const Arg *arg)
- {
-@@ -1653,6 +1676,17 @@ spawn(const Arg *arg)
- }
- }
-
-+void
-+spawndefault()
-+{
-+ const char *app = defaulttagapps[lastchosentag[selmon->num]];
-+ if (app) {
-+ const char *defaultcmd[] = {app, NULL};
-+ Arg a = {.v = defaultcmd};
-+ spawn(&a);
-+ }
-+}
-+
- void
- tag(const Arg *arg)
- {
-@@ -1744,6 +1778,7 @@ toggleview(const Arg *arg)
-
- if (newtagset) {
- selmon->tagset[selmon->seltags] = newtagset;
-+ setlasttag(newtagset);
- focus(NULL);
- arrange(selmon);
- }
-@@ -2040,6 +2075,7 @@ view(const Arg *arg)
- {
- if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags])
- return;
-+ setlasttag(arg->ui);
- selmon->seltags ^= 1; /* toggle sel tagset */
- if (arg->ui & TAGMASK)
- selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
---
-2.31.0
-