dmenu-xresources-20260510-7175c48.diff (3600B)
1 From 8320d43fe9634ebe959ac645a108ba913a131ce0 Mon Sep 17 00:00:00 2001 2 From: Justinas Grigas <dev@jstnas.com> 3 Date: Sun, 10 May 2026 15:25:31 +0100 4 Subject: [PATCH] xresources: runtime X Resources loading 5 6 --- 7 config.def.h | 15 +++++++++++++ 8 dmenu.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 9 2 files changed, 74 insertions(+) 10 11 diff --git a/config.def.h b/config.def.h 12 index 1edb647..e336034 100644 13 --- a/config.def.h 14 +++ b/config.def.h 15 @@ -21,3 +21,18 @@ static unsigned int lines = 0; 16 * for example: " /?\"&[]" 17 */ 18 static const char worddelimiters[] = " "; 19 + 20 +/* X resources to load at startup */ 21 +static const XResPref resources[] = { 22 + /* name type address */ 23 + { "dmenu.font", STRING, &fonts[0] }, 24 + { "dmenu.prompt", STRING, &prompt }, 25 + { "dmenu.foreground", STRING, &colors[SchemeNorm][ColFg] }, 26 + { "dmenu.background", STRING, &colors[SchemeNorm][ColBg] }, 27 + { "dmenu.foregroundSel", STRING, &colors[SchemeSel][ColFg] }, 28 + { "dmenu.backgroundSel", STRING, &colors[SchemeSel][ColBg] }, 29 + { "dmenu.foregroundOut", STRING, &colors[SchemeOut][ColFg] }, 30 + { "dmenu.backgroundOut", STRING, &colors[SchemeOut][ColBg] }, 31 + { "dmenu.topbar", INTEGER, &topbar }, 32 + { "dmenu.lines", INTEGER, &lines }, 33 +}; 34 diff --git a/dmenu.c b/dmenu.c 35 index 363d19f..bbb160e 100644 36 --- a/dmenu.c 37 +++ b/dmenu.c 38 @@ -11,6 +11,7 @@ 39 #include <X11/Xlib.h> 40 #include <X11/Xatom.h> 41 #include <X11/Xutil.h> 42 +#include <X11/Xresource.h> 43 #ifdef XINERAMA 44 #include <X11/extensions/Xinerama.h> 45 #endif 46 @@ -26,6 +27,7 @@ 47 48 /* enums */ 49 enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */ 50 +enum XResType { STRING, INTEGER, FLOAT }; 51 52 struct item { 53 char *text; 54 @@ -33,6 +35,12 @@ struct item { 55 int out; 56 }; 57 58 +typedef struct { 59 + const char *name; 60 + enum XResType type; 61 + void *dst; 62 +} XResPref; 63 + 64 static char text[BUFSIZ] = ""; 65 static char *embed; 66 static int bh, mw, mh; 67 @@ -52,6 +60,8 @@ static XIC xic; 68 static Drw *drw; 69 static Clr *scheme[SchemeLast]; 70 71 +static XrmDatabase xrdb; 72 + 73 #include "config.h" 74 75 static int (*fstrncmp)(const char *, const char *, size_t) = strncmp; 76 @@ -107,6 +117,7 @@ cleanup(void) 77 free(items[i].text); 78 free(items); 79 drw_free(drw); 80 + XrmDestroyDatabase(xrdb); 81 XSync(dpy, False); 82 XCloseDisplay(dpy); 83 } 84 @@ -718,12 +729,60 @@ usage(void) 85 " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); 86 } 87 88 +void 89 +xresload(const XResPref *resource) 90 +{ 91 + char *type; 92 + XrmValue ret; 93 + 94 + if (!XrmGetResource(xrdb, resource->name, NULL, &type, &ret)) 95 + return; 96 + if (!ret.addr || strncmp(type, "String", sizeof("String"))) 97 + return; 98 + 99 + switch (resource->type) { 100 + case STRING: 101 + *(char **)resource->dst = ret.addr; 102 + break; 103 + case INTEGER: 104 + *(int *)resource->dst = strtoul(ret.addr, NULL, 10); 105 + break; 106 + case FLOAT: 107 + *(float *)resource->dst = strtof(ret.addr, NULL); 108 + break; 109 + } 110 +} 111 + 112 +void 113 +xresupdate(void) 114 +{ 115 + Display *display; 116 + char *resm; 117 + const XResPref *p; 118 + 119 + display = XOpenDisplay(NULL); 120 + if (!display) 121 + return; 122 + resm = XResourceManagerString(display); 123 + if (resm) { 124 + xrdb = XrmGetStringDatabase(resm); 125 + if (xrdb) { 126 + for (p = resources; p < resources + LENGTH(resources); ++p) 127 + xresload(p); 128 + } 129 + } 130 + XCloseDisplay(display); 131 +} 132 + 133 int 134 main(int argc, char *argv[]) 135 { 136 XWindowAttributes wa; 137 int i, fast = 0; 138 139 + XrmInitialize(); 140 + xresupdate(); 141 + 142 for (i = 1; i < argc; i++) 143 /* these options take no arguments */ 144 if (!strcmp(argv[i], "-v")) { /* prints version information */ 145 -- 146 2.53.0 147