Wiki patches should not be sent to this list, please read: https://suckless.org/community/
The wiki is public to push to. Thanks On Sun, Mar 28, 2021 at 01:34:53PM +0300, ser...@ekmekci.me wrote: > From: Serhan Ekmekçi <ser...@ekmekci.me> > > --- > .../dwm-livereload-xresources-20210328.diff | 275 ++++++++++++++++++ > dwm.suckless.org/patches/xresources/index.md | 4 + > 2 files changed, 279 insertions(+) > create mode 100644 > dwm.suckless.org/patches/xresources/dwm-livereload-xresources-20210328.diff > > diff --git > a/dwm.suckless.org/patches/xresources/dwm-livereload-xresources-20210328.diff > b/dwm.suckless.org/patches/xresources/dwm-livereload-xresources-20210328.diff > new file mode 100644 > index 00000000..0d2b8248 > --- /dev/null > +++ > b/dwm.suckless.org/patches/xresources/dwm-livereload-xresources-20210328.diff > @@ -0,0 +1,275 @@ > +From f956e78dfedb8c62c5410eee6fef6be5d185db15 Mon Sep 17 00:00:00 2001 > +From: =?UTF-8?q?Serhan=20Ekmek=C3=A7i?= <ser...@ekmekci.me> > +Date: Sun, 28 Mar 2021 13:02:48 +0300 > +Subject: [PATCH] dwm-reloadxresources-20210328 > + > +--- > + config.def.h | 62 ++++++++++++++++++++++---------- > + drw.c | 2 +- > + drw.h | 2 +- > + dwm.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > + 4 files changed, 144 insertions(+), 21 deletions(-) > + > +diff --git a/config.def.h b/config.def.h > +index 1c0b587..978ef85 100644 > +--- a/config.def.h > ++++ b/config.def.h > +@@ -1,21 +1,23 @@ > + /* 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 int showbar = 1; /* 0 means no bar */ > +-static const int topbar = 1; /* 0 means bottom bar */ > +-static const char *fonts[] = { "monospace:size=10" }; > +-static const char dmenufont[] = "monospace:size=10"; > +-static const char col_gray1[] = "#222222"; > +-static const char col_gray2[] = "#444444"; > +-static const char col_gray3[] = "#bbbbbb"; > +-static const char col_gray4[] = "#eeeeee"; > +-static const char col_cyan[] = "#005577"; > +-static const char *colors[][3] = { > +- /* fg bg border */ > +- [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, > +- [SchemeSel] = { col_gray4, col_cyan, col_cyan }, > ++static unsigned int borderpx = 1; /* border pixel of windows */ > ++static unsigned int snap = 32; /* snap pixel */ > ++static int showbar = 1; /* 0 means no bar */ > ++static int topbar = 1; /* 0 means bottom bar */ > ++static char font[] = "monospace:size=10"; > ++static char dmenufont[] = "monospace:size=10"; > ++static const char *fonts[] = { font }; > ++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 */ > +@@ -32,9 +34,9 @@ static const Rule rules[] = { > + }; > + > + /* layout(s) */ > +-static const float mfact = 0.55; /* factor of master area size > [0.05..0.95] */ > +-static const int nmaster = 1; /* number of clients in master area */ > +-static const int resizehints = 1; /* 1 means respect size hints in tiled > resizals */ > ++static float mfact = 0.55; /* factor of master area size [0.05..0.95] */ > ++static int nmaster = 1; /* number of clients in master area */ > ++static int resizehints = 1; /* 1 means respect size hints in tiled > resizals */ > + > + static const Layout layouts[] = { > + /* symbol arrange function */ > +@@ -56,9 +58,30 @@ 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 }; > + > ++/* > ++ * Xresources preferences to load at startup > ++ */ > ++ResourcePref resources[] = { > ++ { "font", STRING, &font }, > ++ { "dmenufont", STRING, &dmenufont }, > ++ { "normbgcolor", STRING, &normbgcolor }, > ++ { "normbordercolor", STRING, &normbordercolor }, > ++ { "normfgcolor", STRING, &normfgcolor }, > ++ { "selbgcolor", STRING, &selbgcolor }, > ++ { "selbordercolor", STRING, &selbordercolor }, > ++ { "selfgcolor", STRING, &selfgcolor }, > ++ { "borderpx", INTEGER, &borderpx }, > ++ { "snap", INTEGER, &snap }, > ++ { "showbar", INTEGER, &showbar }, > ++ { "topbar", INTEGER, &topbar }, > ++ { "nmaster", INTEGER, &nmaster }, > ++ { "resizehints", INTEGER, &resizehints }, > ++ { "mfact", FLOAT, &mfact }, > ++}; > ++ > + static Key keys[] = { > + /* modifier key function argument */ > + { MODKEY, XK_p, spawn, {.v = > dmenucmd } }, > +@@ -94,6 +117,7 @@ static Key keys[] = { > + TAGKEYS( XK_8, 7) > + TAGKEYS( XK_9, 8) > + { MODKEY|ShiftMask, XK_q, quit, {0} }, > ++ { MODKEY, XK_F5, > reload_xres, {0} }, > + }; > + > + /* button definitions */ > +diff --git a/drw.c b/drw.c > +index 4cdbcbe..8f1059e 100644 > +--- a/drw.c > ++++ b/drw.c > +@@ -208,7 +208,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 664c527..15ecbdd 100644 > +--- a/dwm.c > ++++ b/dwm.c > +@@ -36,6 +36,7 @@ > + #include <X11/Xlib.h> > + #include <X11/Xproto.h> > + #include <X11/Xutil.h> > ++#include <X11/Xresource.h> > + #ifdef XINERAMA > + #include <X11/extensions/Xinerama.h> > + #endif /* XINERAMA */ > +@@ -141,6 +142,19 @@ typedef struct { > + int monitor; > + } Rule; > + > ++/* Xresources preferences */ > ++enum resource_type { > ++ STRING = 0, > ++ INTEGER = 1, > ++ FLOAT = 2 > ++}; > ++ > ++typedef struct { > ++ char *name; > ++ enum resource_type type; > ++ void *dst; > ++} ResourcePref; > ++ > + /* function declarations */ > + static void applyrules(Client *c); > + static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int > interact); > +@@ -234,6 +248,9 @@ static int xerror(Display *dpy, XErrorEvent *ee); > + static int xerrordummy(Display *dpy, XErrorEvent *ee); > + static int xerrorstart(Display *dpy, XErrorEvent *ee); > + static void zoom(const Arg *arg); > ++static void load_xresources(void); > ++static void resource_load(XrmDatabase db, char *name, enum resource_type > rtype, void *dst); > ++static void reload_xres(const Arg *arg); > + > + /* variables */ > + static const char broken[] = "broken"; > +@@ -2127,6 +2144,86 @@ zoom(const Arg *arg) > + pop(c); > + } > + > ++void > ++resource_load(XrmDatabase db, char *name, enum resource_type rtype, void > *dst) > ++{ > ++ char *sdst = NULL; > ++ int *idst = NULL; > ++ float *fdst = NULL; > ++ > ++ sdst = dst; > ++ idst = dst; > ++ fdst = dst; > ++ > ++ char fullname[256]; > ++ char *type; > ++ XrmValue ret; > ++ > ++ snprintf(fullname, sizeof(fullname), "%s.%s", "dwm", name); > ++ fullname[sizeof(fullname) - 1] = '\0'; > ++ > ++ XrmGetResource(db, fullname, "*", &type, &ret); > ++ if (!(ret.addr == NULL || strncmp("String", type, 64))) > ++ { > ++ switch (rtype) { > ++ case STRING: > ++ strcpy(sdst, ret.addr); > ++ break; > ++ case INTEGER: > ++ *idst = strtoul(ret.addr, NULL, 10); > ++ break; > ++ case FLOAT: > ++ *fdst = strtof(ret.addr, NULL); > ++ break; > ++ } > ++ } > ++} > ++ > ++void > ++load_xresources(void) > ++{ > ++ Display *display; > ++ char *resm; > ++ XrmDatabase db; > ++ ResourcePref *p; > ++ > ++ display = XOpenDisplay(NULL); > ++ resm = XResourceManagerString(display); > ++ if (!resm) > ++ return; > ++ > ++ db = XrmGetStringDatabase(resm); > ++ for (p = resources; p < resources + LENGTH(resources); p++) > ++ resource_load(db, p->name, p->type, p->dst); > ++ XCloseDisplay(display); > ++} > ++ > ++void > ++reload_xres(const Arg *arg) > ++{ > ++ load_xresources(); > ++ > ++ Monitor *m; > ++ unsigned int i; > ++ > ++ for (m = mons; m; m = m->next) { > ++ > ++ /* you can change and reload client wc attributes like borders > here */ > ++ for(Client *c = m->clients; c; c = c->next) { > ++ XWindowChanges wc; > ++ wc.border_width = borderpx; > ++ XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); > ++ } > ++ > ++ } > ++ > ++ for (i = 0; i < LENGTH(colors); i++) > ++ scheme[i] = drw_scm_create(drw, colors[i], 3); > ++ > ++ focus(NULL); > ++ arrange(NULL); > ++} > ++ > + int > + main(int argc, char *argv[]) > + { > +@@ -2139,6 +2236,8 @@ main(int argc, char *argv[]) > + if (!(dpy = XOpenDisplay(NULL))) > + die("dwm: cannot open display"); > + checkotherwm(); > ++ XrmInitialize(); > ++ load_xresources(); > + setup(); > + #ifdef __OpenBSD__ > + if (pledge("stdio rpath proc exec", NULL) == -1) > +-- > +2.31.0 > + > diff --git a/dwm.suckless.org/patches/xresources/index.md > b/dwm.suckless.org/patches/xresources/index.md > index a6bb62b9..f894036f 100644 > --- a/dwm.suckless.org/patches/xresources/index.md > +++ b/dwm.suckless.org/patches/xresources/index.md > @@ -7,6 +7,8 @@ This patch allows to handle settings from Xresources. It > differs from xrdb patch > > The -20210314 patch adds an example on how you could set a custom font. > > +The live reload version of this patch is same patch with an additional > function for reloading colors on fly, you can also combine this function with > signaling or dwmc patch for reloading colors on fly with a shell command. > + > Settings in config.h > -------------------- > In `resources` struct is written the name, the type, and the address of the > setting. > @@ -29,8 +31,10 @@ Download > -------- > * [dwm-xresources-6.2.diff](dwm-xresources-6.2.diff) (11/06/2020) > * [dwm-xresources-20210314.diff](dwm-xresources-20210314.diff) (14/03/2021) > +* > [dwm-livereload-xresources-20210328.diff](dwm-livereload-xresources-20210328.diff) > (28/03/2021) > > > Author > ------ > * MLquest8 (miskuzius at gmail.com) > +* serhanekmekci (serhan at ekmekci.me) > -- > 2.31.0 > > -- Kind regards, Hiltjo