#include int resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) { char **sdst = dst; int *idst = dst; float *fdst = dst; char fullname[256]; char fullclass[256]; char *type; XrmValue ret; snprintf(fullname, sizeof(fullname), "%s.%s", "slock", name); snprintf(fullclass, sizeof(fullclass), "%s.%s", "Slock", name); fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; XrmGetResource(db, fullname, fullclass, &type, &ret); if (ret.addr == NULL || strncmp("String", type, 64)) return 1; switch (rtype) { case STRING: *sdst = ret.addr; break; case INTEGER: *idst = strtoul(ret.addr, NULL, 10); break; case FLOAT: *fdst = strtof(ret.addr, NULL); break; } return 0; } void config_init(Display *dpy) { char *resm; XrmDatabase db; ResourcePref *p; XrmInitialize(); resm = XResourceManagerString(dpy); if (!resm) return; db = XrmGetStringDatabase(resm); for (p = resources; p < resources + LEN(resources); p++) resource_load(db, p->name, p->type, p->dst); }