commit 09d02a5abe88d930d583af24d0eba7d9cc2dc51d
parent de4ea03cfa7677b358955a2b4bbf0c5e436eecca
Author: Noname Blank <nonameblank007@gmail.com>
Date: Sun, 11 Oct 2026 16:07:47 +0530
[dwm] [patch] [xrdb] update to 6.8 with bug fixes
- Fix memory leak of xrdb database and scheme not being freed
- Close Display early if NULL
- Lastly, Port to 6.8 with dwm convention
Diffstat:
2 files changed, 212 insertions(+), 0 deletions(-)
diff --git a/dwm.suckless.org/patches/xrdb/dwm-xrdb-6.8.diff b/dwm.suckless.org/patches/xrdb/dwm-xrdb-6.8.diff
@@ -0,0 +1,209 @@
+From f109e898ae8112f5f1f95b42a8cc7ff6837698f2 Mon Sep 17 00:00:00 2001
+From: Sourav Nayak <nonameblank007@gmail.com>
+Date: Sun, 11 Oct 2026 15:06:37 +0530
+Subject: [PATCH] [dwm] update to 6.8 with bug fixes
+
+---
+ config.def.h | 22 +++++++++--------
+ drw.c | 2 +-
+ drw.h | 2 +-
+ dwm.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 82 insertions(+), 12 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 81c3fc0..42c6ded 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 */
+@@ -58,7 +59,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 const Key keys[] = {
+@@ -86,6 +87,7 @@ static const 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 9fdd1a4..721e463 100644
+--- a/drw.c
++++ b/drw.c
+@@ -180,7 +180,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
+
+ /* Create color schemes. */
+ 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 bda06f9..fbfec02 100644
+--- a/drw.h
++++ b/drw.h
+@@ -41,7 +41,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);
+ void drw_clr_free(Drw *drw, Clr *c);
+-Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
++Clr *drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount);
+ void drw_scm_free(Drw *drw, Clr *scm, size_t clrcount);
+
+ /* Cursor abstraction */
+diff --git a/dwm.c b/dwm.c
+index ab3a84c..c92953c 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>
+@@ -55,6 +56,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);
+@@ -231,6 +248,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 */
+@@ -1028,6 +1046,41 @@ killclient(const Arg *arg)
+ }
+ }
+
++void
++loadxrdb(void)
++{
++ Display *display;
++ char *resm;
++ XrmDatabase xrdb;
++ char *type;
++ XrmValue value;
++
++ display = XOpenDisplay(NULL);
++
++ if (!display)
++ return;
++
++ resm = XResourceManagerString(display);
++
++ if (!resm) {
++ XCloseDisplay(display);
++ return;
++ }
++
++ 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);
++ XrmDestroyDatabase(xrdb);
++ }
++
++ XCloseDisplay(display);
++}
++
+ void
+ manage(Window w, XWindowAttributes *wa)
+ {
+@@ -2128,6 +2181,19 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
+ return -1;
+ }
+
++void
++xrdb(const Arg *arg)
++{
++ loadxrdb();
++ int i;
++ for (i = 0; i < LENGTH(colors); i++) {
++ drw_scm_free(drw, scheme[i], 3);
++ scheme[i] = drw_scm_create(drw, colors[i], 3);
++ }
++ focus(NULL);
++ arrange(NULL);
++}
++
+ void
+ zoom(const Arg *arg)
+ {
+@@ -2152,6 +2218,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)
+--
+2.55.0
+
diff --git a/dwm.suckless.org/patches/xrdb/index.md b/dwm.suckless.org/patches/xrdb/index.md
@@ -20,6 +20,7 @@ Default key to reload is `Mod+F5`.
Download
--------
+* [dwm-xrdb-6.8.diff](dwm-xrdb-6.8.diff)
* [dwm-xrdb-6.4.diff](dwm-xrdb-6.4.diff)
* [dwm-xrdb-6.3.diff](dwm-xrdb-6.3.diff)
* [dwm-xrdb-6.2.diff](dwm-xrdb-6.2.diff)
@@ -30,3 +31,4 @@ Authors
* Petr Schmied - <https://github.com/JBlackN/dwm-xrdb>
* Rob Livesey - <rlives6789@gmail.com> (v6.2 port)
* Vasily Doylov - <nekodevelopper@gmail.com> (v6.3, 6.4 port)
+* Sourav Nayak - <nonameblank007@gmail.com> (v6.8 port with bug fixes)
+\ No newline at end of file