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", "spmenu", 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); // recognize global colors if (globalcolors) { for (p = cols; p < cols + LENGTH(cols); p++) resource_load(db, p->name, p->type, p->dst); } XCloseDisplay(display); }