summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Smith <luke@lukesmith.xyz>2020-11-07 07:13:09 -0500
committerLuke Smith <luke@lukesmith.xyz>2020-11-07 07:13:09 -0500
commitbc040702d9cd576a055f87dab7db92528fadfef2 (patch)
tree7e6f24743d77f91d4cfb90bd20030ac6a16b88a4
parentad08183a60d259387955c8e5f5f319cc5b8a19c9 (diff)
rm xrdb patch to xresources to load non-color vars
-rw-r--r--config.h63
-rw-r--r--drw.c2
-rw-r--r--drw.h2
-rw-r--r--dwm.c136
-rw-r--r--larbs.mom2
5 files changed, 117 insertions, 88 deletions
diff --git a/config.h b/config.h
index 646076a..863454d 100644
--- a/config.h
+++ b/config.h
@@ -5,18 +5,17 @@
#define TERMCLASS "St"
/* appearance */
-static const unsigned int borderpx = 3; /* border pixel of windows */
-static const unsigned int snap = 32; /* snap pixel */
-static const unsigned int gappih = 20; /* horiz inner gap between windows */
-static const unsigned int gappiv = 10; /* vert inner gap between windows */
-static const unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */
-static const unsigned int gappov = 30; /* vert outer gap between windows and screen edge */
-static const int swallowfloating = 0; /* 1 means swallow floating windows by default */
-static const int smartgaps = 0; /* 1 means no outer gap when there is only one window */
-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", "JoyPixels:pixelsize=10:antialias=true:autohint=true" };
-static char dmenufont[] = "monospace:size=10";
+static unsigned int borderpx = 3; /* border pixel of windows */
+static unsigned int snap = 32; /* snap pixel */
+static unsigned int gappih = 20; /* horiz inner gap between windows */
+static unsigned int gappiv = 10; /* vert inner gap between windows */
+static unsigned int gappoh = 10; /* horiz outer gap between windows and screen edge */
+static unsigned int gappov = 30; /* vert outer gap between windows and screen edge */
+static int swallowfloating = 0; /* 1 means swallow floating windows by default */
+static int smartgaps = 0; /* 1 means no outer gap when there is only one window */
+static int showbar = 1; /* 0 means no bar */
+static int topbar = 1; /* 0 means bottom bar */
+static char *fonts[] = { "monospace:size=10", "JoyPixels:pixelsize=10:antialias=true:autohint=true" };
static char normbgcolor[] = "#222222";
static char normbordercolor[] = "#444444";
static char normfgcolor[] = "#bbbbbb";
@@ -58,9 +57,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 */
#define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always split vertically */
#include "vanitygaps.c"
static const Layout layouts[] = {
@@ -101,12 +100,36 @@ static const Layout layouts[] = {
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
-static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
-static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
static const char *termcmd[] = { TERMINAL, NULL };
+/*
+ * Xresources preferences to load at startup
+ */
+ResourcePref resources[] = {
+ { "dwm.color0", STRING, &normbordercolor },
+ { "dwm.color8", STRING, &selbordercolor },
+ { "dwm.color0", STRING, &normbgcolor },
+ { "dwm.color4", STRING, &normfgcolor },
+ { "dwm.color0", STRING, &selfgcolor },
+ { "dwm.color4", STRING, &selbgcolor },
+ { "borderpx", INTEGER, &borderpx },
+ { "snap", INTEGER, &snap },
+ { "showbar", INTEGER, &showbar },
+ { "topbar", INTEGER, &topbar },
+ { "nmaster", INTEGER, &nmaster },
+ { "resizehints", INTEGER, &resizehints },
+ { "mfact", FLOAT, &mfact },
+ { "gappih", STRING, &gappih },
+ { "gappiv", STRING, &gappiv },
+ { "gappoh", STRING, &gappoh },
+ { "gappov", STRING, &gappov },
+ { "swallowfloating", STRING, &swallowfloating },
+ { "smartgaps", STRING, &smartgaps },
+};
+
#include <X11/XF86keysym.h>
#include "shiftview.c"
+
static Key keys[] = {
/* modifier key function argument */
STACKKEYS(MODKEY, focus)
@@ -165,7 +188,7 @@ static Key keys[] = {
{ MODKEY|ShiftMask, XK_a, defaultgaps, {0} },
{ MODKEY, XK_s, togglesticky, {0} },
/* { MODKEY|ShiftMask, XK_s, spawn, SHCMD("") }, */
- { MODKEY, XK_d, spawn, {.v = dmenucmd } },
+ { MODKEY, XK_d, spawn, SHCMD("dmenu_run") },
/* { MODKEY, XK_d, spawn, SHCMD("") } }, */
{ MODKEY, XK_f, togglefullscr, {0} },
{ MODKEY|ShiftMask, XK_f, setlayout, {.v = &layouts[8]} },
@@ -214,14 +237,14 @@ static Key keys[] = {
{ MODKEY, XK_F2, spawn, SHCMD("tutorialvids") },
{ MODKEY, XK_F3, spawn, SHCMD("displayselect") },
{ MODKEY, XK_F4, spawn, SHCMD(TERMINAL " -e pulsemixer; kill -44 $(pidof dwmblocks)") },
- { MODKEY, XK_F5, xrdb, {.v = NULL } },
+ /* { MODKEY, XK_F5, xrdb, {.v = NULL } }, */
{ MODKEY, XK_F6, spawn, SHCMD("torwrap") },
{ MODKEY, XK_F7, spawn, SHCMD("td-toggle") },
{ MODKEY, XK_F8, spawn, SHCMD("mw -Y") },
{ MODKEY, XK_F9, spawn, SHCMD("dmenumount") },
{ MODKEY, XK_F10, spawn, SHCMD("dmenuumount") },
{ MODKEY, XK_F11, spawn, SHCMD("mpv --no-cache --no-osc --no-input-default-bindings --input-conf=/dev/null --title=webcam $(ls /dev/video[0,2,4,6,8] | tail -n 1)") },
- { MODKEY, XK_F12, xrdb, {.v = NULL } },
+ /* { MODKEY, XK_F12, xrdb, {.v = NULL } }, */
{ MODKEY, XK_space, zoom, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
diff --git a/drw.c b/drw.c
index 9617d84..56175a8 100644
--- a/drw.c
+++ b/drw.c
@@ -153,7 +153,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;
diff --git a/drw.h b/drw.h
index 42b04ce..09617cf 100644
--- a/drw.h
+++ b/drw.h
@@ -32,7 +32,7 @@ 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);
diff --git a/dwm.c b/dwm.c
index 2e43282..c18ac9c 100644
--- a/dwm.c
+++ b/dwm.c
@@ -35,8 +35,8 @@
#include <X11/Xatom.h>
#include <X11/Xlib.h>
#include <X11/Xproto.h>
-#include <X11/Xresource.h>
#include <X11/Xutil.h>
+#include <X11/Xresource.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif /* XINERAMA */
@@ -68,21 +68,6 @@
#define SPTAGMASK (((1 << LENGTH(scratchpads))-1) << LENGTH(tags))
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
#define TRUNC(X,A,B) (MAX((A), MIN((X), (B))))
-#define XRDB_LOAD_COLOR(R,V) if (XrmGetResource(xrdb, R, NULL, &type, &value) == True) { \
- if (value.addr != NULL && strnlen(value.addr, 8) == 7 && value.addr[0] == '#') { \
- int i = 1; \
- for (; i <= 6; i++) { \
- if (value.addr[i] < 48) break; \
- if (value.addr[i] > 57 && value.addr[i] < 65) break; \
- if (value.addr[i] > 70 && value.addr[i] < 97) break; \
- if (value.addr[i] > 102) break; \
- } \
- if (i == 7) { \
- strncpy(V, value.addr, 7); \
- V[7] = '\0'; \
- } \
- } \
- }
/* enums */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
@@ -176,6 +161,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);
@@ -214,7 +212,6 @@ static void grabkeys(void);
static void incnmaster(const Arg *arg);
static void keypress(XEvent *e);
static void killclient(const Arg *arg);
-static void loadxrdb(void);
static void manage(Window w, XWindowAttributes *wa);
static void mappingnotify(XEvent *e);
static void maprequest(XEvent *e);
@@ -281,8 +278,9 @@ static Monitor *wintomon(Window w);
static int xerror(Display *dpy, XErrorEvent *ee);
static int xerrordummy(Display *dpy, XErrorEvent *ee);
static int xerrorstart(Display *dpy, XErrorEvent *ee);
-static void xrdb(const Arg *arg);
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);
@@ -1176,37 +1174,6 @@ killclient(const Arg *arg)
}
void
-loadxrdb()
-{
- Display *display;
- char * resm;
- XrmDatabase xrdb;
- char *type;
- XrmValue value;
-
- display = XOpenDisplay(NULL);
-
- if (display != NULL) {
- resm = XResourceManagerString(display);
-
- if (resm != NULL) {
- xrdb = XrmGetStringDatabase(resm);
-
- if (xrdb != NULL) {
- XRDB_LOAD_COLOR("dwm.color0", normbordercolor);
- XRDB_LOAD_COLOR("dwm.color8", selbordercolor);
- XRDB_LOAD_COLOR("dwm.color0", normbgcolor);
- XRDB_LOAD_COLOR("dwm.color4", normfgcolor);
- XRDB_LOAD_COLOR("dwm.color0", selfgcolor);
- XRDB_LOAD_COLOR("dwm.color4", selbgcolor);
- }
- }
- }
-
- XCloseDisplay(display);
-}
-
-void
manage(Window w, XWindowAttributes *wa)
{
Client *c, *t = NULL, *term = NULL;
@@ -1934,8 +1901,6 @@ sigdwmblocks(const Arg *arg)
void
spawn(const Arg *arg)
{
- if (arg->v == dmenucmd)
- dmenumon[0] = '0' + selmon->num;
if (fork() == 0) {
if (dpy)
close(ConnectionNumber(dpy));
@@ -2545,17 +2510,6 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
}
void
-xrdb(const Arg *arg)
-{
- loadxrdb();
- int i;
- for (i = 0; i < LENGTH(colors); i++)
- scheme[i] = drw_scm_create(drw, colors[i], 3);
- focus(NULL);
- arrange(NULL);
-}
-
-void
zoom(const Arg *arg)
{
Client *c = selmon->sel;
@@ -2569,6 +2523,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[])
{
@@ -2583,8 +2591,8 @@ main(int argc, char *argv[])
if (!(xcon = XGetXCBConnection(dpy)))
die("dwm: cannot get xcb connection\n");
checkotherwm();
- XrmInitialize();
- loadxrdb();
+ XrmInitialize();
+ load_xresources();
setup();
#ifdef __OpenBSD__
if (pledge("stdio rpath proc exec", NULL) == -1)
diff --git a/larbs.mom b/larbs.mom
index e2971a0..c62ead7 100644
--- a/larbs.mom
+++ b/larbs.mom
@@ -196,8 +196,6 @@ To type capital letters, hold down the \f(CWShift\fP key\(emthat might sound lik
.ITEM
\f(CWMod+F11\fP \(en View webcam
.ITEM
-\f(CWMod+F12\fP \(en Update dwm's colorscheme if you have changed Xresources
-.ITEM
\f(CWMod+`\fP \(en Select an emoji to copy to clipboard
.ITEM
\f(CWMod+Insert\fP \(en Show contents of clipboard/primary selection