sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

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