]> git.ekhem.eu.org Git - dwm.git/commitdiff
Patch xresources
authorJakub Czajka <jakub@ekhem.eu.org>
Tue, 10 May 2022 17:40:14 +0000 (19:40 +0200)
committerJakub Czajka <jakub@ekhem.eu.org>
Sat, 14 Oct 2023 20:47:14 +0000 (22:47 +0200)
config.def.h
config.h
drw.c
drw.h
dwm.c

index 944681e2598aaf34235195d2530c8770ae50ed75..3a71282960f9b5e2ac866c9cb64acb3e7140210e 100644 (file)
@@ -1,27 +1,26 @@
 /* See LICENSE file for copyright and license details. */
 
 /* appearance */
-static const unsigned int borderpx  = 1;        /* border pixel of windows */
-static const unsigned int gappx     = 6;        /* 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 */
-static const int horizpadbar        = 3;        /* horizontal padding for statusbar */
-static const int vertpadbar         = 0;        /* vertical padding for statusbar */
-static const char *fonts[] = {
-        "monospace:size=10",
-        "Noto Color Emoji: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 gappx     = 6;  /* gaps between 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 int horizpadbar        = 3;  /* horizontal padding for statusbar */
+static int vertpadbar         = 0;  /* vertical padding for statusbar */
+static char font[]            = "monospace:size=10";
+static char dmenufont[]       = "monospace:size=10";
+static 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 */
@@ -62,12 +61,36 @@ 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 char *emojicmd[]  = { "select_emoji", NULL };
 static const char *emacsclientcmd[] = { "emacs_client", NULL };
 
-static const Key keys[] = {
+/*
+ * 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 },
+               { "gappx",              INTEGER, &gappx },
+               { "snap",               INTEGER, &snap },
+               { "showbar",            INTEGER, &showbar },
+               { "topbar",             INTEGER, &topbar },
+               { "horizpadbar",        INTEGER, &horizpadbar },
+               { "vertpadbar",         INTEGER, &vertpadbar },
+               { "nmaster",            INTEGER, &nmaster },
+               { "resizehints",        INTEGER, &resizehints },
+                { "mfact",              FLOAT,   &mfact },
+};
+
+static Key keys[] = {
        /* modifier                     key        function        argument */
        { MODKEY,                       XK_Return, spawn,          {.v = dmenucmd } },
        { MODKEY|ShiftMask,             XK_Return, spawn,          {.v = termcmd } },
index 089209cd37b5d51a86ab2b6488814a4d41548b1d..2947def2b5418c14a8f797cae1269bd204c2fdfc 100644 (file)
--- a/config.h
+++ b/config.h
@@ -1,27 +1,26 @@
 /* See LICENSE file for copyright and license details. */
 
 /* appearance */
-static const unsigned int borderpx  = 1;        /* border pixel of windows */
-static const unsigned int gappx     = 6;        /* 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 */
-static const int horizpadbar        = 3;        /* horizontal padding for statusbar */
-static const int vertpadbar         = 0;        /* vertical padding for statusbar */
-static const char *fonts[] = {
-        "monospace:size=10",
-        "Noto Color Emoji: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 gappx     = 6;  /* gaps between 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 int horizpadbar        = 3;  /* horizontal padding for statusbar */
+static int vertpadbar         = 0;  /* vertical padding for statusbar */
+static char font[]            = "monospace:size=10";
+static char dmenufont[]       = "monospace:size=10";
+static 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 */
@@ -62,11 +61,35 @@ 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 char *emojicmd[]  = { "select_emoji", NULL };
 static const char *emacsclientcmd[] = { "emacs_client", 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 },
+               { "gappx",              INTEGER, &gappx },
+               { "snap",               INTEGER, &snap },
+               { "showbar",            INTEGER, &showbar },
+               { "topbar",             INTEGER, &topbar },
+               { "horizpadbar",        INTEGER, &horizpadbar },
+               { "vertpadbar",         INTEGER, &vertpadbar },
+               { "nmaster",            INTEGER, &nmaster },
+               { "resizehints",        INTEGER, &resizehints },
+                { "mfact",              FLOAT,   &mfact },
+};
+
 static Key keys[] = {
        /* modifier                     key        function        argument */
        { MODKEY,                       XK_Return, spawn,          {.v = dmenucmd } },
diff --git a/drw.c b/drw.c
index a58a2b4896500cd7c3b61fbdc626cd42cd9df40e..f8a82f520d2f4377789fb007eb489a8eb5ad49ac 100644 (file)
--- a/drw.c
+++ b/drw.c
@@ -195,7 +195,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 64714316bd40c003eac6b722ba5256eebaacf010..bdbf950981fccf5c93bf52c1e5284b63f2eff690 100644 (file)
--- a/drw.h
+++ b/drw.h
@@ -40,7 +40,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 bab7282b596021ab5cb06fda1a51621f2fab485c..b45323f2251d09ca7b18d94732635975b3c3e8c5 100644 (file)
--- 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 */
@@ -142,6 +143,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);
@@ -237,6 +251,8 @@ 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);
 
 /* variables */
 static const char broken[] = "broken";
@@ -2168,6 +2184,60 @@ 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);
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -2180,6 +2250,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)