|
@@ -35,6 +35,7 @@
|
|
|
#include <X11/Xatom.h>
|
|
|
#include <X11/Xlib.h>
|
|
|
#include <X11/Xproto.h>
|
|
|
+#include <X11/Xresource.h>
|
|
|
#include <X11/Xutil.h>
|
|
|
#ifdef XINERAMA
|
|
|
#include <X11/extensions/Xinerama.h>
|
|
@@ -56,6 +57,21 @@
|
|
|
#define HEIGHT(X) ((X)->h + 2 * (X)->bw)
|
|
|
#define TAGMASK ((1 << LENGTH(tags)) - 1)
|
|
|
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
|
|
|
+#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'; \
|
|
|
+ } \
|
|
|
+ } \
|
|
|
+ }
|
|
|
|
|
|
#define OPAQUE 0xffU
|
|
|
|
|
@@ -183,6 +199,7 @@ 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);
|
|
@@ -252,6 +269,7 @@ static int xerror(Display *dpy, XErrorEvent *ee);
|
|
|
static int xerrordummy(Display *dpy, XErrorEvent *ee);
|
|
|
static int xerrorstart(Display *dpy, XErrorEvent *ee);
|
|
|
static void xinitvisual();
|
|
|
+static void xrdb(const Arg *arg);
|
|
|
static void zoom(const Arg *arg);
|
|
|
|
|
|
static void centeredmaster(Monitor *m);
|
|
@@ -1091,6 +1109,37 @@ 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.background", normbordercolor);
|
|
|
+ XRDB_LOAD_COLOR("dwm.background", normbgcolor);
|
|
|
+ XRDB_LOAD_COLOR("dwm.foreground", normfgcolor);
|
|
|
+ XRDB_LOAD_COLOR("dwm.color1", selbordercolor);
|
|
|
+ XRDB_LOAD_COLOR("dwm.color1", selbgcolor);
|
|
|
+ XRDB_LOAD_COLOR("dwm.foreground", selfgcolor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ XCloseDisplay(display);
|
|
|
+}
|
|
|
+
|
|
|
void
|
|
|
manage(Window w, XWindowAttributes *wa)
|
|
|
{
|
|
@@ -1771,6 +1820,7 @@ setup(void)
|
|
|
scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
|
|
|
for (i = 0; i < LENGTH(colors); i++)
|
|
|
scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3);
|
|
|
+ xrdb(NULL);
|
|
|
/* init bars */
|
|
|
updatebars();
|
|
|
updatestatus();
|
|
@@ -2370,6 +2420,17 @@ xinitvisual()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void
|
|
|
+xrdb(const Arg *arg)
|
|
|
+{
|
|
|
+ loadxrdb();
|
|
|
+ int i;
|
|
|
+ for (i = 0; i < LENGTH(colors); i++)
|
|
|
+ scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3);
|
|
|
+ focus(NULL);
|
|
|
+ arrange(NULL);
|
|
|
+}
|
|
|
+
|
|
|
void
|
|
|
zoom(const Arg *arg)
|
|
|
{
|
|
@@ -2396,6 +2457,7 @@ main(int argc, char *argv[])
|
|
|
if (!(dpy = XOpenDisplay(NULL)))
|
|
|
die("dwm: cannot open display");
|
|
|
checkotherwm();
|
|
|
+ XrmInitialize();
|
|
|
setup();
|
|
|
#ifdef __OpenBSD__
|
|
|
if (pledge("stdio rpath proc exec", NULL) == -1)
|