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

Reply via email to