From bbf12247e85b2fc2d86bd7840804b1295eb63602 Mon Sep 17 00:00:00 2001 From: frosty Date: Tue, 20 Aug 2024 02:00:05 +0000 Subject: [PATCH] patch: xresources alt --- config.def.h | 44 +++++++++++++++++++++++++++------ dmenu.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++- drw.c | 2 +- drw.h | 2 +- 4 files changed, 106 insertions(+), 11 deletions(-) diff --git a/config.def.h b/config.def.h index de52924..dea5d29 100644 --- a/config.def.h +++ b/config.def.h @@ -3,18 +3,30 @@ static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ static int fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */ + /* -fn option overrides fonts[0]; default X11 font or font set */ +static char font[] = "monospace:size=10"; static const char *fonts[] = { + font, "monospace:size=10" }; -static const char *prompt = NULL; /* -p option; prompt to the left of input field */ -static const char *colors[SchemeLast][2] = { - /* fg bg */ - [SchemeNorm] = { "#bbbbbb", "#222222" }, - [SchemeSel] = { "#eeeeee", "#005577" }, - [SchemeSelHighlight] = { "#ffc978", "#005577" }, - [SchemeNormHighlight] = { "#ffc978", "#222222" }, - [SchemeOut] = { "#000000", "#00ffff" }, +static char *prompt = NULL; /* -p option; prompt to the left of input field */ + +static char normfgcolor[] = "#bbbbbb"; +static char normbgcolor[] = "#222222"; +static char selfgcolor[] = "#eeeeee"; +static char selbgcolor[] = "#005577"; +static char normhifgcolor[] = "#ffc978"; +static char normhibgcolor[] = "#222222"; +static char selhifgcolor[] = "#ffc978"; +static char selhibgcolor[] = "#005577"; +static char *colors[SchemeLast][2] = { + /* fg bg */ + [SchemeNorm] = { normfgcolor, normbgcolor }, + [SchemeSel] = { selfgcolor, selbgcolor }, + [SchemeNormHighlight] = { normhifgcolor, normhibgcolor }, + [SchemeSelHighlight] = { selhifgcolor, selhibgcolor }, + [SchemeOut] = { "#000000", "#00ffff" }, }; /* -l and -g options; controls number of lines and columns in grid if > 0 */ static unsigned int lines = 0; @@ -25,3 +37,19 @@ static unsigned int columns = 0; * for example: " /?\"&[]" */ static const char worddelimiters[] = " "; + +/* + * Xresources preferences to load at startup + */ +ResourcePref resources[] = { + { "font", STRING, &font }, + { "normfgcolor", STRING, &normfgcolor }, + { "normbgcolor", STRING, &normbgcolor }, + { "selfgcolor", STRING, &selfgcolor }, + { "selbgcolor", STRING, &selbgcolor }, + { "normhifgcolor", STRING, &normhifgcolor }, + { "normhibgcolor", STRING, &normhibgcolor }, + { "selhifgcolor", STRING, &selhifgcolor }, + { "selhibgcolor", STRING, &selhibgcolor }, + { "prompt", STRING, &prompt }, +}; diff --git a/dmenu.c b/dmenu.c index 68cbd8d..d7c0cb0 100644 --- a/dmenu.c +++ b/dmenu.c @@ -12,6 +12,7 @@ #include #include #include +#include #ifdef XINERAMA #include #endif @@ -59,6 +60,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; @@ -568,7 +584,7 @@ keypress(XKeyEvent *ev) switch(ksym) { default: -insert: + insert: if (!iscntrl((unsigned char)*buf)) insert(buf, len); break; @@ -727,6 +743,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) { @@ -881,6 +945,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 */ diff --git a/drw.c b/drw.c index 344de61..497cc4f 100644 --- a/drw.c +++ b/drw.c @@ -181,7 +181,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, const char *clrnames[], 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 index fd7631b..0d91aad 100644 --- a/drw.h +++ b/drw.h @@ -40,7 +40,7 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in /* Colorscheme abstraction */ void drw_clr_create(Drw *drw, Clr *dest, const char *clrname); -Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount); +Clr *drw_scm_create(Drw *drw, char *clrnames[], size_t clrcount); /* Cursor abstraction */ Cur *drw_cur_create(Drw *drw, int shape);