dwm-noxz

[fork] suckless dwm - personal fork
git clone https://noxz.tech/git/dwm-noxz.git
Log | Files | README | LICENSE

commit: d8ccaa44015c401d262de0fdf9e276e9dbf6ea63
parent: a3e014adf1f0162c1b18194471650b6288131d9f
author: Chris Noxz <chris@noxz.tech>
date:   Thu, 18 Mar 2021 13:29:31 +0100
Replace vtcolors patch with Xresources
Mconfig.def.h111++++++++++-----
Mdrw.c6+-
Mdrw.h6+-
Mdwm.c148++++++++++----------
4 files changed, 152 insertions(+), 119 deletions(-)
diff --git a/config.def.h b/config.def.h
@@ -3,42 +3,47 @@
 #define MODKEY                      Mod4Mask
 
 /* appearance */
-static const unsigned int borderpx  = 2;        /* 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 int viewontag          = 1;
-static const int focusonwheel       = 0;
-static const char *fonts[]          = { "dnoxz_numerics:pixelsize=12:autohint=false" };
-static const char title_bg_dark[]   = "#030303";
-static const char title_bg_light[]  = "#fdfdfd";
-static const int color_ptrs[][4]    = {
-	/*                              fg          bg       border   float   */
-	[SchemeNorm]                   = { -1,      -1,      5,       -1      },
-	[SchemeSel]                    = { -1,      -1,      6,       1       },
-	[SchemeTagsNorm]               = { 2,       0,       0,       -1      },
-	[SchemeTagsSel]                = { 5,       6,       6,       -1      },
-	[SchemeTitleNorm]              = { 6,       -1,      -1,      -1      },
-	[SchemeTitleSel]               = { 6,       -1,      -1,      -1      },
+static unsigned int borderpx    = 2;        /* 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 int viewontag            = 1;
+static int focusonwheel         = 0;
+static char font[256]           = "monospace:size=10";
+static char *fonts[]            = { font };
 
-	[SchemeStatusNorm]             = { 6,       -1,      -1,      -1      },
-	[SchemeStatusAct]              = { 5,       6,       -1,      -1      },
-	[SchemeStatusDist]             = { 11,      0,       -1,      -1      },
-	[SchemeStatusNoti]             = { 0,       6,       -1,      -1      },
-};
-static char colors[][4][8]         = {
-	/*                                 fg       bg       border   float   */
-	[SchemeNorm]                   = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
-	[SchemeSel]                    = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
-	[SchemeTagsNorm]               = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
-	[SchemeTagsSel]                = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
-	[SchemeTitleNorm]              = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
-	[SchemeTitleSel]               = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
+static char col_none[]          = COL_DEF;
+static char col_nbr[]           = COL_DEF;
+static char col_sbr[]           = COL_DEF;
+static char col_sfl[]           = COL_DEF;
+static char col_tanfg[]         = COL_DEF;
+static char col_tanbg[]         = COL_DEF;
+static char col_tanbr[]         = COL_DEF;
+static char col_tasfg[]         = COL_DEF;
+static char col_tasbg[]         = COL_DEF;
+static char col_tasbr[]         = COL_DEF;
+static char col_tinfg[]         = COL_DEF;
+static char col_tisfg[]         = COL_DEF;
+static char col_snfg[]          = COL_DEF;
+static char col_safg[]          = COL_DEF;
+static char col_sabg[]          = COL_DEF;
+static char col_sdfg[]          = COL_DEF;
+static char col_sdbg[]          = COL_DEF;
+static char col_snofg[]         = COL_DEF;
+static char col_snobg[]         = COL_DEF;
+static char *colors[][4]        = {
+	/*                          fg          bg          border      float   */
+	[SchemeNorm]            = { col_none,   col_none,   col_nbr,    col_none },
+	[SchemeSel]             = { col_none,   col_none,   col_sbr,    col_sfl },
+	[SchemeTagsNorm]        = { col_tanfg,  col_tanbg,  col_tanbr,  col_none },
+	[SchemeTagsSel]         = { col_tasfg,  col_tasbg,  col_tasbr,  col_none },
+	[SchemeTitleNorm]       = { col_tinfg,  col_none,   col_none,   col_none },
+	[SchemeTitleSel]        = { col_tisfg,  col_none,   col_none,   col_none },
 
-	[SchemeStatusNorm]             = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
-	[SchemeStatusAct]              = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
-	[SchemeStatusDist]             = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
-	[SchemeStatusNoti]             = { COL_DEF, COL_DEF, COL_DEF, COL_DEF },
+	[SchemeStatusNorm]      = { col_snfg,   col_none,   col_none,   col_none },
+	[SchemeStatusAct]       = { col_safg,   col_sabg,   col_none,   col_none },
+	[SchemeStatusDist]      = { col_sdfg,   col_sdbg,   col_none,   col_none },
+	[SchemeStatusNoti]      = { col_snofg,  col_snobg,  col_none,   col_none },
 };
 
 /* tagging */
@@ -53,9 +58,9 @@ static const Rule rules[] = { NULL
 };
 
 /* layout(s) */
-static const float mfact            = 0.55; /* factor of master area size [0.05..0.95] */
-static const int nmaster            = 0;    /* number of clients in master area */
-static const int resizehints        = 0;    /* 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              = 0;    /* number of clients in master area */
+static int resizehints          = 0;    /* 1 means respect size hints in tiled resizals */
 
 static const Layout layouts[] = {
 	/* symbol     arrange function */
@@ -83,6 +88,38 @@ static Button buttons[] = {
 	{ ClkTagBar,        Mod4Mask,       Button3,    toggletag,      {0} },
 };
 
+/* Xresources preferences to load at startup */
+ResourcePref resources[] = {
+	{ "normalBorderColor",          STRING,     &col_nbr },
+	{ "selectedBorderColor",        STRING,     &col_sbr },
+	{ "selectedFloatColor",         STRING,     &col_sfl },
+	{ "tagsNormalForeground",       STRING,     &col_tanfg },
+	{ "tagsNormalBackground",       STRING,     &col_tanbg },
+	{ "tagsNormalBorderColor",      STRING,     &col_tanbr },
+	{ "tagsSelectedForeground",     STRING,     &col_tasfg },
+	{ "tagsSelectedBackground",     STRING,     &col_tasbg },
+	{ "tagsSelectedBorderColor",    STRING,     &col_tasbr },
+	{ "titleNormalForeground",      STRING,     &col_tinfg },
+	{ "titleSelectedForeground",    STRING,     &col_tisfg },
+	{ "statusNormalForeground",     STRING,     &col_snfg },
+	{ "statusActForeground",        STRING,     &col_safg },
+	{ "statusActBackground",        STRING,     &col_sabg },
+	{ "statusDistForeground",       STRING,     &col_sdfg },
+	{ "statusDistBackground",       STRING,     &col_sdbg },
+	{ "statusNotiForeground",       STRING,     &col_snofg },
+	{ "statusNotiBackground",       STRING,     &col_snobg },
+	{ "font",                       STRING,     &font },
+	{ "borderpx",                   INTEGER,    &borderpx },
+	{ "snap",                       INTEGER,    &snap },
+	{ "showbar",                    INTEGER,    &showbar },
+	{ "topbar",                     INTEGER,    &topbar },
+	{ "viewontag",                  INTEGER,    &viewontag },
+	{ "focusonwheel",               INTEGER,    &focusonwheel },
+	{ "nmaster",                    INTEGER,    &nmaster },
+	{ "resizehints",                INTEGER,    &resizehints },
+	{ "mfact",                      FLOAT,      &mfact },
+};
+
 static const char *dwmfifo = "/tmp/dwm.fifo";
 static Command commands[] = {
 	{ "spawn ...",          spawn,          {.i = DispCmdLine} },
diff --git a/drw.c b/drw.c
@@ -167,7 +167,7 @@ xfont_free(Fnt *font)
 }
 
 Fnt*
-drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
+drw_fontset_create(Drw* drw, char *fonts[], size_t fontcount)
 {
 	Fnt *cur, *ret = NULL;
 	size_t i;
@@ -194,7 +194,7 @@ drw_fontset_free(Fnt *font)
 }
 
 void
-drw_clr_create(Drw *drw, Clr *dest, const char clrname[])
+drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
 {
 	if (!drw || !dest || !clrname)
 		return;
@@ -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, char clrnames[][8], 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
@@ -32,14 +32,14 @@ void drw_resize(Drw *drw, unsigned int w, unsigned int h);
 void drw_free(Drw *drw);
 
 /* Fnt abstraction */
-Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
+Fnt *drw_fontset_create(Drw* drw, char *fonts[], size_t fontcount);
 void drw_fontset_free(Fnt* set);
 unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
 void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
 
 /* Colorscheme abstraction */
-void drw_clr_create(Drw *drw, Clr *dest, const char clrname[]);
-Clr *drw_scm_create(Drw *drw, char clrnames[][8], size_t clrcount);
+void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
+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
@@ -38,6 +38,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;
+
 typedef struct {
 	const char *name;
 	void (*func)(const Arg *arg);
@@ -187,6 +201,7 @@ static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
 static void grabbuttons(Client *c, int focused);
 static void incnmaster(const Arg *arg);
 static void killclient(const Arg *arg);
+static void load_xresources(void);
 static void manage(Window w, XWindowAttributes *wa);
 static void maprequest(XEvent *e);
 static void monocle(Monitor *m);
@@ -199,6 +214,7 @@ static Monitor *recttomon(int x, int y, int w, int h);
 static void resize(Client *c, int x, int y, int w, int h, int interact);
 static void resizeclient(Client *c, int x, int y, int w, int h);
 static void resizemouse(const Arg *arg);
+static void resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst);
 static void restack(Monitor *m);
 static void movestack(const Arg *arg);
 static void rotatestack(const Arg *arg);
@@ -213,8 +229,6 @@ static void setlayout(const Arg *arg);
 static void togglelayout(const Arg *arg);
 static void rotatelayout(const Arg *arg);
 static void setmfact(const Arg *arg);
-static void get_vt_colors(void);
-static int get_luminance(char *rgb);
 static void setup(void);
 static void seturgent(Client *c, int urg);
 static void showhide(Client *c);
@@ -1800,72 +1814,6 @@ setmfact(const Arg *arg)
 	arrange(selmon);
 }
 
-void
-get_vt_colors(void)
-{
-	char *cfs[3] = {
-		"/sys/module/vt/parameters/default_red",
-		"/sys/module/vt/parameters/default_grn",
-		"/sys/module/vt/parameters/default_blu",
-	};
-	char vtcs[16][8];
-	char tk[] = ",";
-	char cl[64];
-	char *tp = NULL;
-	FILE *fp;
-	size_t r;
-	int i, c, n;
-
-	for (i = 0; i < 16; i++)
-		strcpy(vtcs[i], "#000000");
-
-	for (i = 0, r = 0; i < 3; i++) {
-		if ((fp = fopen(cfs[i], "r")) == NULL)
-			continue;
-		while ((cl[r] = fgetc(fp)) != EOF && cl[r] != '\n')
-			r++;
-		cl[r] = '\0';
-		for (c = 0, tp = cl, n = 0; c < 16; c++, tp++) {
-			if ((r = strcspn(tp, tk)) == -1)
-				break;
-			for (n = 0; r && *tp >= 48 && *tp < 58; r--, tp++)
-				n = n * 10 - 48 + *tp;
-			vtcs[c][i * 2 + 1] = n / 16 < 10 ? n / 16 + 48 : n / 16 + 87;
-			vtcs[c][i * 2 + 2] = n % 16 < 10 ? n % 16 + 48 : n % 16 + 87;
-		}
-		fclose(fp);
-	}
-	for (i = 0; i < LENGTH(colors); i++) {
-		for (c = 0; c < 4; c++) {
-			n = color_ptrs[i][c];
-			if (n > -1 && strlen(colors[i][c]) >= strlen(vtcs[n]))
-				memcpy(colors[i][c], vtcs[n], 7);
-		}
-	}
-}
-
-int get_luminance(char *r)
-{
-	char *c = r;
-	int n[3] = {0};
-	int i = 0;
-
-	while (*c) {
-		if (*c >= 48 && *c < 58)
-			n[i / 2] = n[i / 2] * 16 - 48 + *c;
-		else if (*c >= 65 && *c < 71)
-			n[i / 2] = n[i / 2] * 16 - 55 + *c;
-		else if (*c >= 97 && *c < 103)
-			n[i / 2] = n[i / 2] * 16 - 87 + *c;
-		else
-			i--;
-		i++;
-		c++;
-	}
-
-	return (0.299 * n[0] + 0.587 * n[1] + 0.114 * n[2]) / 2.55;
-}
-
 void
 setup(void)
 {
@@ -1907,14 +1855,6 @@ setup(void)
 	cursor[CurResize] = drw_cur_create(drw, XC_sizing);
 	cursor[CurMove] = drw_cur_create(drw, XC_fleur);
 	/* init appearance */
-	get_vt_colors();
-	if (get_luminance(colors[SchemeTagsNorm][ColBg]) > 50) {
-		strcpy(colors[SchemeTitleNorm][ColBg], title_bg_light);
-		strcpy(colors[SchemeTitleSel][ColBg], title_bg_light);
-	} else {
-		strcpy(colors[SchemeTitleNorm][ColBg], title_bg_dark);
-		strcpy(colors[SchemeTitleSel][ColBg], title_bg_dark);
-	}
 	scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
 	for (i = 0; i < LENGTH(colors); i++)
 		scheme[i] = drw_scm_create(drw, colors[i], 4);
@@ -2584,6 +2524,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[])
 {
@@ -2596,6 +2590,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)