Xinqi Bao's Git

patch: xresources
authorXinqi Bao <[email protected]>
Tue, 5 Apr 2022 09:08:34 +0000 (17:08 +0800)
committerXinqi Bao <[email protected]>
Tue, 5 Apr 2022 09:08:34 +0000 (17:08 +0800)
config.def.h
drw.c
drw.h
dwm.c
patches/dwm-xresources-20210827-138b405.diff [new file with mode: 0644]

index 316fb90..df4b78e 100644 (file)
@@ -3,27 +3,29 @@
 #define TERMINAL "st"
 
 /* appearance */
 #define TERMINAL "st"
 
 /* appearance */
-static const unsigned int borderpx  = 1;        /* border pixel of windows */
-static const unsigned int gappx     = 5;        /* gaps between windows */
-static const unsigned int snap      = 32;       /* snap pixel */
-static const int swallowfloating    = 0;        /* 1 means swallow floating windows by default */
-static const int showbar            = 1;        /* 0 means no bar */
-static const int topbar             = 1;        /* 0 means bottom bar */
-static const char *fonts[]          = { "monospace:size=12",
+static unsigned int borderpx  = 3;        /* border pixel of windows */
+static unsigned int gappx     = 5;        /* gaps between windows */
+static unsigned int snap      = 32;       /* snap pixel */
+static int swallowfloating    = 0;        /* 1 means swallow floating windows by default */
+static int showbar            = 1;        /* 0 means no bar */
+static int topbar             = 1;        /* 0 means bottom bar */
+static char font[]            = "monospace:size=12";
+static char dmenufont[]       = "monospace:size=12";
+static const char *fonts[]          = { font,
                                         "WenQuanYi Micro Hei:size=12:type=Regular:antialias=true:autohint=true",
                                         "Symbols Nerd Font:pixelsize=18:type=2048-em:antialias=true:autohint=true" };
                                         "WenQuanYi Micro Hei:size=12:type=Regular:antialias=true:autohint=true",
                                         "Symbols Nerd Font:pixelsize=18:type=2048-em:antialias=true:autohint=true" };
-static const char dmenufont[]       = "monospace:size=12";
-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 char normbgcolor[]           = "#222222";
+static char normbordercolor[]       = "#444444";
+static char normfgcolor[]           = "#bbbbbb";
+static char selfgcolor[]            = "#eeeeee";
+static char selbordercolor[]        = "#005577";
+static char selbgcolor[]            = "#005577";
 static const unsigned int baralpha = 0xd0;
 static const unsigned int borderalpha = OPAQUE;
 static const unsigned int baralpha = 0xd0;
 static const unsigned int borderalpha = OPAQUE;
-static const char *colors[][3]      = {
-       /*               fg         bg         border   */
-       [SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
-       [SchemeSel]  = { col_gray4, col_cyan,  col_cyan  },
+static char *colors[][3] = {
+       /*               fg           bg           border   */
+       [SchemeNorm] = { normfgcolor, normbgcolor, normbordercolor },
+       [SchemeSel]  = { selfgcolor,  selbgcolor,  selbordercolor  },
 };
 static const unsigned int alphas[][3]      = {
        /*               fg      bg        border     */
 };
 static const unsigned int alphas[][3]      = {
        /*               fg      bg        border     */
@@ -47,9 +49,9 @@ static const Rule rules[] = {
 };
 
 /* layout(s) */
 };
 
 /* 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 int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
 
 #include "fibonacci.c"
 static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
 
 #include "fibonacci.c"
@@ -76,9 +78,31 @@ static const Layout layouts[] = {
 
 /* commands */
 static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
 
 /* 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[]  = { TERMINAL, NULL };
 
 static const char *termcmd[]  = { TERMINAL, NULL };
 
+/*
+ * Xresources preferences to load at startup
+ */
+ResourcePref resources[] = {
+               { "font",               STRING,  &font },
+               { "dmenufont",          STRING,  &dmenufont },
+               { "background",         STRING,  &normbgcolor },
+               { "systemColor",        STRING,  &selbgcolor },
+               { "foreground",         STRING,  &normfgcolor },
+               { "foreground",         STRING,  &selfgcolor },
+               { "background",         STRING,  &normbordercolor },
+               { "systemColor",        STRING,  &selbordercolor },
+               { "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|ShiftMask,             XK_b,      togglebar,      {0} },
 static Key keys[] = {
        /* modifier                     key        function        argument */
        { MODKEY|ShiftMask,             XK_b,      togglebar,      {0} },
diff --git a/drw.c b/drw.c
index fe3aadd..cf8b37a 100644 (file)
--- a/drw.c
+++ b/drw.c
@@ -212,7 +212,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha)
 /* Wrapper to create color schemes. The caller has to call free(3) on the
  * returned color scheme when done using it. */
 Clr *
 /* 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[], const unsigned int alphas[], size_t clrcount)
+drw_scm_create(Drw *drw, char *clrnames[], const unsigned int alphas[], size_t clrcount)
 {
        size_t i;
        Clr *ret;
 {
        size_t i;
        Clr *ret;
diff --git a/drw.h b/drw.h
index a56f523..7978ac1 100644 (file)
--- a/drw.h
+++ b/drw.h
@@ -42,7 +42,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, unsigned int alpha);
 
 /* Colorscheme abstraction */
 void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha);
-Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount);
+Clr *drw_scm_create(Drw *drw, char *clrnames[], const unsigned int alphas[], size_t clrcount);
 
 /* Cursor abstraction */
 Cur *drw_cur_create(Drw *drw, int shape);
 
 /* Cursor abstraction */
 Cur *drw_cur_create(Drw *drw, int shape);
diff --git a/dwm.c b/dwm.c
index 556d934..5a18093 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/Xlib.h>
 #include <X11/Xproto.h>
 #include <X11/Xutil.h>
+#include <X11/Xresource.h>
 #ifdef XINERAMA
 #include <X11/extensions/Xinerama.h>
 #endif /* XINERAMA */
 #ifdef XINERAMA
 #include <X11/extensions/Xinerama.h>
 #endif /* XINERAMA */
@@ -154,6 +155,19 @@ typedef struct {
        int monitor;
 } Rule;
 
        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);
 /* function declarations */
 static void applyrules(Client *c);
 static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
@@ -252,6 +266,8 @@ static int xerrordummy(Display *dpy, XErrorEvent *ee);
 static int xerrorstart(Display *dpy, XErrorEvent *ee);
 static void xinitvisual();
 static void zoom(const Arg *arg);
 static int xerrorstart(Display *dpy, XErrorEvent *ee);
 static void xinitvisual();
 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 pid_t getparentprocess(pid_t p);
 static int isdescprocess(pid_t p, pid_t c);
 
 static pid_t getparentprocess(pid_t p);
 static int isdescprocess(pid_t p, pid_t c);
@@ -2442,6 +2458,60 @@ zoom(const Arg *arg)
        pop(c);
 }
 
        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[])
 {
 int
 main(int argc, char *argv[])
 {
@@ -2456,6 +2526,8 @@ main(int argc, char *argv[])
        if (!(xcon = XGetXCBConnection(dpy)))
                die("dwm: cannot get xcb connection\n");
        checkotherwm();
        if (!(xcon = XGetXCBConnection(dpy)))
                die("dwm: cannot get xcb connection\n");
        checkotherwm();
+       XrmInitialize();
+       load_xresources();
        setup();
 #ifdef __OpenBSD__
        if (pledge("stdio rpath proc exec ps", NULL) == -1)
        setup();
 #ifdef __OpenBSD__
        if (pledge("stdio rpath proc exec ps", NULL) == -1)
diff --git a/patches/dwm-xresources-20210827-138b405.diff b/patches/dwm-xresources-20210827-138b405.diff
new file mode 100644 (file)
index 0000000..29852a9
--- /dev/null
@@ -0,0 +1,240 @@
+From f30583c6e2ab5e7de6ef4ebf156076ac0f6e69fc Mon Sep 17 00:00:00 2001
+From: Jack Bird <[email protected]>
+Date: Fri, 27 Aug 2021 00:53:14 +0100
+Subject: [PATCH] xresources updated for 138b405
+
+---
+ config.def.h | 61 ++++++++++++++++++++++++++++++--------------
+ drw.c        |  2 +-
+ drw.h        |  2 +-
+ dwm.c        | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 116 insertions(+), 21 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index a2ac963..87ac198 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 int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
+ static const Layout layouts[] = {
+@@ -57,9 +59,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 } },
+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 5e4d494..2214b19 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,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";
+@@ -2127,6 +2143,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[])
+ {
+@@ -2139,6 +2209,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.33.0
+