summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLM-LCL <hello@exaltedelite.club>2024-08-31 22:10:44 +0200
committerLM-LCL <hello@exaltedelite.club>2024-08-31 22:10:44 +0200
commitc6ab166105f9585aadea8b5bd396e180e4d285b4 (patch)
tree42002c03f9918d8e58226200d4717316a60b4b0b
parent00d1bbc05e5573123de9d8d02ffb97e616f623ec (diff)
dwm-6.5
-rw-r--r--Makefile10
-rw-r--r--config.def.h53
-rw-r--r--config.h51
-rw-r--r--config.mk4
-rw-r--r--dwm.13
-rw-r--r--dwm.c87
-rw-r--r--movestack.c48
-rw-r--r--patches/dwm-alwayscenter-20200625-f04cac6.diff12
-rw-r--r--patches/dwm-attachbelow-6.2.diff96
-rw-r--r--patches/dwm-movestack-20211115-a786211.diff95
-rw-r--r--patches/dwm-systray-20230922-9f88553.diff (renamed from patches/dwm-systray-6.4.diff)79
11 files changed, 416 insertions, 122 deletions
diff --git a/Makefile b/Makefile
index 77bcbc0..ffa69b4 100644
--- a/Makefile
+++ b/Makefile
@@ -6,13 +6,7 @@ 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}"
+all: dwm
.c.o:
${CC} -c ${CFLAGS} $<
@@ -48,4 +42,4 @@ uninstall:
rm -f ${DESTDIR}${PREFIX}/bin/dwm\
${DESTDIR}${MANPREFIX}/man1/dwm.1
-.PHONY: all options clean dist install uninstall
+.PHONY: all clean dist install uninstall
diff --git a/config.def.h b/config.def.h
index ef4400a..ec547a7 100644
--- a/config.def.h
+++ b/config.def.h
@@ -1,25 +1,27 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
-static const unsigned int borderpx = 1; /* border pixel of windows */
-static const unsigned int snap = 32; /* snap pixel */
+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 = 1; /* 0: systray in the right corner, >0: systray on left of status text */
+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 int focusonwheel = 0;
-static const char *fonts[] = { "monospace:size=12" };
-static const char dmenufont[] = "monospace:size=12";
-static const char col_gray1[] = "#282c34";
-static const char col_gray2[] = "#353b45";
-static const char col_white[] = "#abb2bf";
-static const char *colors[][3] = {
+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 int focusonwheel = 0;
+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_white, col_gray1, col_gray2 },
- [SchemeSel] = { col_white, col_gray2, col_white },
+ [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
+ [SchemeSel] = { col_gray4, col_cyan, col_cyan },
};
/* tagging */
@@ -32,14 +34,15 @@ static const Rule rules[] = {
*/
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, 1, -1 },
- /* { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, */
+ { "Firefox", NULL, NULL, 1 << 8, 0, -1 },
};
/* layout(s) */
-static const float mfact = 0.50; /* factor of master area size [0.05..0.95] */
-static const int nmaster = 1; /* number of clients in master area */
-static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
-static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
+static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
+static const int nmaster = 1; /* number of clients in master area */
+static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
+static const int attachbelow = 1; /* 1 means attach after the currently active window */
+static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
static const Layout layouts[] = {
/* symbol arrange function */
@@ -60,9 +63,11 @@ static const Layout layouts[] = {
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
-static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_white, "-sb", col_gray2, "-sf", col_white, NULL };
+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 const Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
@@ -74,6 +79,8 @@ static const 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} },
@@ -104,8 +111,8 @@ static const Key keys[] = {
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static const Button buttons[] = {
/* click event mask button function argument */
- { ClkTagBar, MODKEY, Button1, tag, {0} },
- { ClkTagBar, MODKEY, Button3, toggletag, {0} },
+ { ClkLtSymbol, 0, Button1, setlayout, {0} },
+ { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
diff --git a/config.h b/config.h
index ef4400a..a10f9aa 100644
--- a/config.h
+++ b/config.h
@@ -1,25 +1,25 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
-static const unsigned int borderpx = 1; /* border pixel of windows */
-static const unsigned int snap = 32; /* snap pixel */
+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 = 1; /* 0: systray in the right corner, >0: systray on left of status text */
+static const unsigned int systrayonleft = 1; /* 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 int focusonwheel = 0;
-static const char *fonts[] = { "monospace:size=12" };
-static const char dmenufont[] = "monospace:size=12";
-static const char col_gray1[] = "#282c34";
-static const char col_gray2[] = "#353b45";
-static const char col_white[] = "#abb2bf";
-static const char *colors[][3] = {
+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 int focusonwheel = 0;
+static const char *fonts[] = { "monospace:size=12" };
+static const char dmenufont[] = "monospace:size=12";
+static const char col_gray1[] = "#282c34";
+static const char col_gray2[] = "#353b45";
+static const char col_white[] = "#abb2bf";
+static const char *colors[][3] = {
/* fg bg border */
- [SchemeNorm] = { col_white, col_gray1, col_gray2 },
- [SchemeSel] = { col_white, col_gray2, col_white },
+ [SchemeNorm] = { col_white, col_gray1, col_gray2 },
+ [SchemeSel] = { col_white, col_gray2, col_white },
};
/* tagging */
@@ -36,10 +36,11 @@ static const Rule rules[] = {
};
/* 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 = 0; /* 1 means respect size hints in tiled resizals */
-static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
+static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
+static const int nmaster = 1; /* number of clients in master area */
+static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */
+static const int attachbelow = 1; /* 1 means attach after the currently active window */
+static const int lockfullscreen = 0; /* 1 will force focus on the fullscreen window */
static const Layout layouts[] = {
/* symbol arrange function */
@@ -60,9 +61,11 @@ static const Layout layouts[] = {
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
-static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_white, "-sb", col_gray2, "-sf", col_white, NULL };
+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_white, "-sb", col_gray2, "-sf", col_white, NULL };
static const char *termcmd[] = { "st", NULL };
+#include "movestack.c"
static const Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
@@ -74,10 +77,12 @@ static const 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} },
- { MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
+ { MODKEY, XK_n, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_space, setlayout, {0} },
@@ -104,8 +109,8 @@ static const Key keys[] = {
/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static const Button buttons[] = {
/* click event mask button function argument */
- { ClkTagBar, MODKEY, Button1, tag, {0} },
- { ClkTagBar, MODKEY, Button3, toggletag, {0} },
+ { ClkLtSymbol, 0, Button1, setlayout, {0} },
+ { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
diff --git a/config.mk b/config.mk
index ef8acf7..8efca9a 100644
--- a/config.mk
+++ b/config.mk
@@ -1,5 +1,5 @@
# dwm version
-VERSION = 6.4
+VERSION = 6.5
# Customize below to fit your system
@@ -26,7 +26,7 @@ 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}
+CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
LDFLAGS = ${LIBS}
diff --git a/dwm.1 b/dwm.1
index ddc8321..b0fc8c3 100644
--- a/dwm.1
+++ b/dwm.1
@@ -29,6 +29,9 @@ color. The tags of the focused window are indicated with a filled square in the
top left corner. The tags which are applied to one or more windows are
indicated with an empty square in the top left corner.
.P
+The attach below patch makes newly spawned windows attach after the currently
+selected window
+.P
dwm draws a small border around windows to indicate the focus state.
.SH OPTIONS
.TP
diff --git a/dwm.c b/dwm.c
index c7ceb3b..0994f9f 100644
--- a/dwm.c
+++ b/dwm.c
@@ -170,6 +170,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac
static void arrange(Monitor *m);
static void arrangemon(Monitor *m);
static void attach(Client *c);
+static void attachBelow(Client *c);
static void attachstack(Client *c);
static void buttonpress(XEvent *e);
static void checkotherwm(void);
@@ -230,7 +231,6 @@ 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 spawn(const Arg *arg);
static Monitor *systraytomon(Monitor *m);
static void tag(const Arg *arg);
@@ -447,6 +447,21 @@ attach(Client *c)
c->next = c->mon->clients;
c->mon->clients = c;
}
+void
+attachBelow(Client *c)
+{
+ //If there is nothing on the monitor or the selected client is floating, attach as normal
+ if(c->mon->sel == NULL || c->mon->sel == c || c->mon->sel->isfloating) {
+ attach(c);
+ return;
+ }
+
+ //Set the new client's next property to the same as the currently selected clients next
+ c->next = c->mon->sel->next;
+ //Set the currently selected clients next property to the new client
+ c->mon->sel->next = c;
+
+}
void
attachstack(Client *c)
@@ -1077,16 +1092,26 @@ grabkeys(void)
{
updatenumlockmask();
{
- unsigned int i, j;
+ unsigned int i, j, k;
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
- KeyCode code;
+ int start, end, skip;
+ KeySym *syms;
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);
+ XDisplayKeycodes(dpy, &start, &end);
+ syms = XGetKeyboardMapping(dpy, start, end - start + 1, &skip);
+ if (!syms)
+ return;
+ for (k = start; k <= end; k++)
+ for (i = 0; i < LENGTH(keys); i++)
+ /* skip modifier codes, we do that ourselves */
+ if (keys[i].keysym == syms[(k - start) * skip])
+ for (j = 0; j < LENGTH(modifiers); j++)
+ XGrabKey(dpy, k,
+ keys[i].mod | modifiers[j],
+ root, True,
+ GrabModeAsync, GrabModeAsync);
+ XFree(syms);
}
}
@@ -1182,13 +1207,18 @@ 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)
c->isfloating = c->oldstate = trans != None || c->isfixed;
if (c->isfloating)
XRaiseWindow(dpy, c->win);
- attach(c);
+ if( attachbelow )
+ attachBelow(c);
+ else
+ attach(c);
attachstack(c);
XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
(unsigned char *) &(c->win), 1);
@@ -1576,7 +1606,10 @@ sendmon(Client *c, Monitor *m)
detachstack(c);
c->mon = m;
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
- attach(c);
+ if( attachbelow )
+ attachBelow(c);
+ else
+ attach(c);
attachstack(c);
focus(NULL);
arrange(NULL);
@@ -1702,9 +1735,16 @@ setup(void)
int i;
XSetWindowAttributes wa;
Atom utf8string;
+ struct sigaction sa;
- /* clean up any zombies immediately */
- sigchld(0);
+ /* do not transform children into zombies when they terminate */
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT | SA_RESTART;
+ sa.sa_handler = SIG_IGN;
+ sigaction(SIGCHLD, &sa, NULL);
+
+ /* clean up any zombies (inherited from .xinitrc etc) immediately */
+ while (waitpid(-1, NULL, WNOHANG) > 0);
/* init screen */
screen = DefaultScreen(dpy);
@@ -1807,20 +1847,22 @@ showhide(Client *c)
}
void
-sigchld(int unused)
-{
- if (signal(SIGCHLD, sigchld) == SIG_ERR)
- die("can't install SIGCHLD handler:");
- while (0 < waitpid(-1, NULL, WNOHANG));
-}
-
-void
spawn(const Arg *arg)
{
+ struct sigaction sa;
+
+ if (arg->v == dmenucmd)
+ dmenumon[0] = '0' + selmon->num;
if (fork() == 0) {
if (dpy)
close(ConnectionNumber(dpy));
setsid();
+
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = 0;
+ sa.sa_handler = SIG_DFL;
+ sigaction(SIGCHLD, &sa, NULL);
+
execvp(((char **)arg->v)[0], (char **)arg->v);
die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
}
@@ -2122,7 +2164,10 @@ updategeom(void)
m->clients = c->next;
detachstack(c);
c->mon = mons;
- attach(c);
+ if( attachbelow )
+ attachBelow(c);
+ else
+ attach(c);
attachstack(c);
}
if (m == selmon)
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
diff --git a/patches/dwm-alwayscenter-20200625-f04cac6.diff b/patches/dwm-alwayscenter-20200625-f04cac6.diff
new file mode 100644
index 0000000..03ea9ef
--- /dev/null
+++ b/patches/dwm-alwayscenter-20200625-f04cac6.diff
@@ -0,0 +1,12 @@
+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/dwm-attachbelow-6.2.diff b/patches/dwm-attachbelow-6.2.diff
new file mode 100644
index 0000000..1562b38
--- /dev/null
+++ b/patches/dwm-attachbelow-6.2.diff
@@ -0,0 +1,96 @@
+diff --git a/config.def.h b/config.def.h
+index 1c0b587..cb8053a 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -35,6 +35,7 @@ static const Rule rules[] = {
+ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
+ static const int nmaster = 1; /* number of clients in master area */
+ static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
++static const int attachbelow = 1; /* 1 means attach after the currently active window */
+
+ static const Layout layouts[] = {
+ /* symbol arrange function */
+diff --git a/dwm.1 b/dwm.1
+index 13b3729..fb6e76c 100644
+--- a/dwm.1
++++ b/dwm.1
+@@ -29,6 +29,9 @@ color. The tags of the focused window are indicated with a filled square in the
+ top left corner. The tags which are applied to one or more windows are
+ indicated with an empty square in the top left corner.
+ .P
++The attach below patch makes newly spawned windows attach after the currently
++selected window
++.P
+ dwm draws a small border around windows to indicate the focus state.
+ .SH OPTIONS
+ .TP
+diff --git a/dwm.c b/dwm.c
+index 4465af1..bd715a2 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -147,6 +147,7 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac
+ static void arrange(Monitor *m);
+ static void arrangemon(Monitor *m);
+ static void attach(Client *c);
++static void attachBelow(Client *c);
+ static void attachstack(Client *c);
+ static void buttonpress(XEvent *e);
+ static void checkotherwm(void);
+@@ -405,6 +406,21 @@ attach(Client *c)
+ c->next = c->mon->clients;
+ c->mon->clients = c;
+ }
++void
++attachBelow(Client *c)
++{
++ //If there is nothing on the monitor or the selected client is floating, attach as normal
++ if(c->mon->sel == NULL || c->mon->sel == c || c->mon->sel->isfloating) {
++ attach(c);
++ return;
++ }
++
++ //Set the new client's next property to the same as the currently selected clients next
++ c->next = c->mon->sel->next;
++ //Set the currently selected clients next property to the new client
++ c->mon->sel->next = c;
++
++}
+
+ void
+ attachstack(Client *c)
+@@ -1062,7 +1078,10 @@ manage(Window w, XWindowAttributes *wa)
+ c->isfloating = c->oldstate = trans != None || c->isfixed;
+ if (c->isfloating)
+ XRaiseWindow(dpy, c->win);
+- attach(c);
++ if( attachbelow )
++ attachBelow(c);
++ else
++ attach(c);
+ attachstack(c);
+ XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
+ (unsigned char *) &(c->win), 1);
+@@ -1417,7 +1436,10 @@ sendmon(Client *c, Monitor *m)
+ detachstack(c);
+ c->mon = m;
+ c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
+- attach(c);
++ if( attachbelow )
++ attachBelow(c);
++ else
++ attach(c);
+ attachstack(c);
+ focus(NULL);
+ arrange(NULL);
+@@ -1897,7 +1919,10 @@ updategeom(void)
+ m->clients = c->next;
+ detachstack(c);
+ c->mon = mons;
+- attach(c);
++ if( attachbelow )
++ attachBelow(c);
++ else
++ attach(c);
+ attachstack(c);
+ }
+ if (m == selmon)
diff --git a/patches/dwm-movestack-20211115-a786211.diff b/patches/dwm-movestack-20211115-a786211.diff
new file mode 100644
index 0000000..134abb8
--- /dev/null
+++ b/patches/dwm-movestack-20211115-a786211.diff
@@ -0,0 +1,95 @@
+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/dwm-systray-6.4.diff b/patches/dwm-systray-20230922-9f88553.diff
index 58e4a69..9356ec1 100644
--- a/patches/dwm-systray-6.4.diff
+++ b/patches/dwm-systray-20230922-9f88553.diff
@@ -1,5 +1,5 @@
diff --git a/config.def.h b/config.def.h
-index 9efa774..750529d 100644
+index 9efa774..fed4fb9 100644
--- a/config.def.h
+++ b/config.def.h
@@ -3,6 +3,11 @@
@@ -14,19 +14,8 @@ index 9efa774..750529d 100644
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" };
-@@ -101,8 +106,8 @@ static const Key keys[] = {
- /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
- static const Button buttons[] = {
- /* click event mask button function argument */
-- { ClkLtSymbol, 0, Button1, setlayout, {0} },
-- { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
-+ { ClkTagBar, MODKEY, Button1, tag, {0} },
-+ { ClkTagBar, MODKEY, Button3, toggletag, {0} },
- { ClkWinTitle, 0, Button2, zoom, {0} },
- { ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
- { ClkClientWin, MODKEY, Button1, movemouse, {0} },
diff --git a/dwm.c b/dwm.c
-index 03baf42..4611a03 100644
+index f1d86b2..f9e7e4a 100644
--- a/dwm.c
+++ b/dwm.c
@@ -57,12 +57,27 @@
@@ -96,15 +85,15 @@ index 03baf42..4611a03 100644
static void sendmon(Client *c, Monitor *m);
static void setclientstate(Client *c, long state);
static void setfocus(Client *c);
-@@ -207,6 +232,7 @@ static void seturgent(Client *c, int urg);
+@@ -206,6 +231,7 @@ static void setup(void);
+ 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 *m);
-@@ -224,18 +250,23 @@ static int updategeom(void);
+@@ -223,18 +249,23 @@ static int updategeom(void);
static void updatenumlockmask(void);
static void updatesizehints(Client *c);
static void updatestatus(void);
@@ -128,7 +117,7 @@ index 03baf42..4611a03 100644
static const char broken[] = "broken";
static char stext[256];
static int screen;
-@@ -258,9 +289,10 @@ static void (*handler[LASTEvent]) (XEvent *) = {
+@@ -257,9 +288,10 @@ static void (*handler[LASTEvent]) (XEvent *) = {
[MapRequest] = maprequest,
[MotionNotify] = motionnotify,
[PropertyNotify] = propertynotify,
@@ -140,7 +129,7 @@ index 03baf42..4611a03 100644
static int running = 1;
static Cur *cursor[CurLast];
static Clr **scheme;
-@@ -442,7 +474,7 @@ buttonpress(XEvent *e)
+@@ -441,7 +473,7 @@ buttonpress(XEvent *e)
arg.ui = 1 << i;
} else if (ev->x < x + TEXTW(selmon->ltsymbol))
click = ClkLtSymbol;
@@ -149,7 +138,7 @@ index 03baf42..4611a03 100644
click = ClkStatusText;
else
click = ClkWinTitle;
-@@ -485,6 +517,13 @@ cleanup(void)
+@@ -484,6 +516,13 @@ cleanup(void)
XUngrabKey(dpy, AnyKey, AnyModifier, root);
while (mons)
cleanupmon(mons);
@@ -163,7 +152,7 @@ index 03baf42..4611a03 100644
for (i = 0; i < CurLast; i++)
drw_cur_free(drw, cursor[i]);
for (i = 0; i < LENGTH(colors); i++)
-@@ -516,9 +555,58 @@ cleanupmon(Monitor *mon)
+@@ -515,9 +554,58 @@ cleanupmon(Monitor *mon)
void
clientmessage(XEvent *e)
{
@@ -222,7 +211,7 @@ index 03baf42..4611a03 100644
if (!c)
return;
if (cme->message_type == netatom[NetWMState]) {
-@@ -571,7 +659,7 @@ configurenotify(XEvent *e)
+@@ -570,7 +658,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);
@@ -231,7 +220,7 @@ index 03baf42..4611a03 100644
}
focus(NULL);
arrange(NULL);
-@@ -656,6 +744,11 @@ destroynotify(XEvent *e)
+@@ -655,6 +743,11 @@ destroynotify(XEvent *e)
if ((c = wintoclient(ev->window)))
unmanage(c, 1);
@@ -243,7 +232,7 @@ index 03baf42..4611a03 100644
}
void
-@@ -699,7 +792,7 @@ dirtomon(int dir)
+@@ -698,7 +791,7 @@ dirtomon(int dir)
void
drawbar(Monitor *m)
{
@@ -252,7 +241,7 @@ index 03baf42..4611a03 100644
int boxs = drw->fonts->h / 9;
int boxw = drw->fonts->h / 6 + 2;
unsigned int i, occ = 0, urg = 0;
-@@ -708,13 +801,17 @@ drawbar(Monitor *m)
+@@ -707,13 +800,17 @@ drawbar(Monitor *m)
if (!m->showbar)
return;
@@ -272,7 +261,7 @@ index 03baf42..4611a03 100644
for (c = m->clients; c; c = c->next) {
occ |= c->tags;
if (c->isurgent)
-@@ -735,7 +832,7 @@ drawbar(Monitor *m)
+@@ -734,7 +831,7 @@ drawbar(Monitor *m)
drw_setscheme(drw, scheme[SchemeNorm]);
x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
@@ -281,7 +270,7 @@ index 03baf42..4611a03 100644
if (m->sel) {
drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
-@@ -746,7 +843,7 @@ drawbar(Monitor *m)
+@@ -745,7 +842,7 @@ drawbar(Monitor *m)
drw_rect(drw, x, 0, w, bh, 1, 1);
}
}
@@ -290,7 +279,7 @@ index 03baf42..4611a03 100644
}
void
-@@ -783,8 +880,11 @@ expose(XEvent *e)
+@@ -782,8 +879,11 @@ expose(XEvent *e)
Monitor *m;
XExposeEvent *ev = &e->xexpose;
@@ -303,7 +292,7 @@ index 03baf42..4611a03 100644
}
void
-@@ -870,14 +970,32 @@ getatomprop(Client *c, Atom prop)
+@@ -869,14 +969,32 @@ getatomprop(Client *c, Atom prop)
unsigned char *p = NULL;
Atom da, atom = None;
@@ -337,7 +326,7 @@ index 03baf42..4611a03 100644
int
getrootptr(int *x, int *y)
{
-@@ -1018,7 +1136,8 @@ killclient(const Arg *arg)
+@@ -1017,7 +1135,8 @@ killclient(const Arg *arg)
{
if (!selmon->sel)
return;
@@ -347,7 +336,7 @@ index 03baf42..4611a03 100644
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
XSetCloseDownMode(dpy, DestroyAll);
-@@ -1105,6 +1224,13 @@ maprequest(XEvent *e)
+@@ -1104,6 +1223,13 @@ maprequest(XEvent *e)
static XWindowAttributes wa;
XMapRequestEvent *ev = &e->xmaprequest;
@@ -361,7 +350,7 @@ index 03baf42..4611a03 100644
if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect)
return;
if (!wintoclient(ev->window))
-@@ -1226,6 +1352,17 @@ propertynotify(XEvent *e)
+@@ -1225,6 +1351,17 @@ propertynotify(XEvent *e)
Window trans;
XPropertyEvent *ev = &e->xproperty;
@@ -379,7 +368,7 @@ index 03baf42..4611a03 100644
if ((ev->window == root) && (ev->atom == XA_WM_NAME))
updatestatus();
else if (ev->state == PropertyDelete)
-@@ -1276,6 +1413,19 @@ recttomon(int x, int y, int w, int h)
+@@ -1275,6 +1412,19 @@ recttomon(int x, int y, int w, int h)
return r;
}
@@ -399,7 +388,7 @@ index 03baf42..4611a03 100644
void
resize(Client *c, int x, int y, int w, int h, int interact)
{
-@@ -1283,6 +1433,14 @@ resize(Client *c, int x, int y, int w, int h, int interact)
+@@ -1282,6 +1432,14 @@ resize(Client *c, int x, int y, int w, int h, int interact)
resizeclient(c, x, y, w, h);
}
@@ -414,7 +403,7 @@ index 03baf42..4611a03 100644
void
resizeclient(Client *c, int x, int y, int w, int h)
{
-@@ -1298,6 +1456,19 @@ resizeclient(Client *c, int x, int y, int w, int h)
+@@ -1297,6 +1455,19 @@ resizeclient(Client *c, int x, int y, int w, int h)
XSync(dpy, False);
}
@@ -434,7 +423,7 @@ index 03baf42..4611a03 100644
void
resizemouse(const Arg *arg)
{
-@@ -1444,26 +1615,37 @@ setclientstate(Client *c, long state)
+@@ -1443,26 +1614,37 @@ setclientstate(Client *c, long state)
}
int
@@ -483,7 +472,7 @@ index 03baf42..4611a03 100644
}
return exists;
}
-@@ -1477,7 +1659,7 @@ setfocus(Client *c)
+@@ -1476,7 +1658,7 @@ setfocus(Client *c)
XA_WINDOW, 32, PropModeReplace,
(unsigned char *) &(c->win), 1);
}
@@ -492,7 +481,7 @@ index 03baf42..4611a03 100644
}
void
-@@ -1566,6 +1748,10 @@ setup(void)
+@@ -1572,6 +1754,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);
@@ -503,7 +492,7 @@ index 03baf42..4611a03 100644
netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False);
netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
-@@ -1573,6 +1759,9 @@ setup(void)
+@@ -1579,6 +1765,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);
@@ -513,7 +502,7 @@ index 03baf42..4611a03 100644
/* init cursors */
cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr);
cursor[CurResize] = drw_cur_create(drw, XC_sizing);
-@@ -1581,6 +1770,8 @@ setup(void)
+@@ -1587,6 +1776,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);
@@ -522,7 +511,7 @@ index 03baf42..4611a03 100644
/* init bars */
updatebars();
updatestatus();
-@@ -1711,7 +1902,18 @@ togglebar(const Arg *arg)
+@@ -1717,7 +1908,18 @@ togglebar(const Arg *arg)
{
selmon->showbar = !selmon->showbar;
updatebarpos(selmon);
@@ -542,7 +531,7 @@ index 03baf42..4611a03 100644
arrange(selmon);
}
-@@ -1807,11 +2009,18 @@ unmapnotify(XEvent *e)
+@@ -1813,11 +2015,18 @@ unmapnotify(XEvent *e)
else
unmanage(c, 0);
}
@@ -561,7 +550,7 @@ index 03baf42..4611a03 100644
Monitor *m;
XSetWindowAttributes wa = {
.override_redirect = True,
-@@ -1822,10 +2031,15 @@ updatebars(void)
+@@ -1828,10 +2037,15 @@ updatebars(void)
for (m = mons; m; m = m->next) {
if (m->barwin)
continue;
@@ -578,7 +567,7 @@ index 03baf42..4611a03 100644
XMapRaised(dpy, m->barwin);
XSetClassHint(dpy, m->barwin, &ch);
}
-@@ -2002,6 +2216,125 @@ updatestatus(void)
+@@ -2008,6 +2222,125 @@ updatestatus(void)
if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
strcpy(stext, "dwm-"VERSION);
drawbar(selmon);
@@ -704,7 +693,7 @@ index 03baf42..4611a03 100644
}
void
-@@ -2069,6 +2402,16 @@ wintoclient(Window w)
+@@ -2075,6 +2408,16 @@ wintoclient(Window w)
return NULL;
}
@@ -721,7 +710,7 @@ index 03baf42..4611a03 100644
Monitor *
wintomon(Window w)
{
-@@ -2122,6 +2465,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
+@@ -2128,6 +2471,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
return -1;
}