summaryrefslogtreecommitdiff
path: root/dmenu.c
diff options
context:
space:
mode:
authorJakub Trzeciak <jptrzy@gmail.com>2023-09-11 17:32:23 +0200
committerJakub Trzeciak <jptrzy@gmail.com>2023-09-11 17:32:23 +0200
commite9dc2639a3f4a3c9dc8b085bcffe63cee73f8242 (patch)
treebf0f793b9a417af3ef65ee9622cf6d2819070b92 /dmenu.c
parent7ab0cb5ef0e19352fc5d64ae0d57a5cf4540acbf (diff)
downloaddmenu-e9dc2639a3f4a3c9dc8b085bcffe63cee73f8242.tar.gz
dmenu-e9dc2639a3f4a3c9dc8b085bcffe63cee73f8242.tar.bz2
dmenu-e9dc2639a3f4a3c9dc8b085bcffe63cee73f8242.zip
Xresources Patch
Diffstat (limited to 'dmenu.c')
-rw-r--r--dmenu.c69
1 files changed, 68 insertions, 1 deletions
diff --git a/dmenu.c b/dmenu.c
index 40f93e0..379233e 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -11,6 +11,7 @@
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
+#include <X11/Xresource.h>
#ifdef XINERAMA
#include <X11/extensions/Xinerama.h>
#endif
@@ -52,6 +53,21 @@ static XIC xic;
static Drw *drw;
static Clr *scheme[SchemeLast];
+/* Xresources preferences */
+enum resource_type {
+ STRING = 0,
+ INTEGER = 1,
+ FLOAT = 2
+};
+typedef struct {
+ char *name;
+ enum resource_type type;
+ void *dst;
+} ResourcePref;
+
+static void load_xresources(void);
+static void resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst);
+
#include "config.h"
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
@@ -413,7 +429,7 @@ keypress(XKeyEvent *ev)
switch(ksym) {
default:
-insert:
+ insert:
if (!iscntrl((unsigned char)*buf))
insert(buf, len);
break;
@@ -572,6 +588,54 @@ readstdin(void)
lines = MIN(lines, i);
}
+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", "dmenu", 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);
+}
+
static void
run(void)
{
@@ -725,6 +789,9 @@ main(int argc, char *argv[])
XWindowAttributes wa;
int i, fast = 0;
+ XrmInitialize();
+ load_xresources();
+
for (i = 1; i < argc; i++)
/* these options take no arguments */
if (!strcmp(argv[i], "-v")) { /* prints version information */
Software created with 💖