xresources.c (1089B)
1 #include <X11/Xresource.h> 2 #include <math.h> 3 4 int 5 resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) 6 { 7 char **sdst = dst; 8 int *idst = dst; 9 float *fdst = dst; 10 11 char fullname[256]; 12 char fullclass[256]; 13 char *type; 14 XrmValue ret; 15 16 snprintf(fullname, sizeof(fullname), "%s.%s", "slock", name); 17 snprintf(fullclass, sizeof(fullclass), "%s.%s", "Slock", name); 18 fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; 19 20 XrmGetResource(db, fullname, fullclass, &type, &ret); 21 if (ret.addr == NULL || strncmp("String", type, 64)) 22 return 1; 23 24 switch (rtype) { 25 case STRING: 26 *sdst = ret.addr; 27 break; 28 case INTEGER: 29 *idst = strtoul(ret.addr, NULL, 10); 30 break; 31 case FLOAT: 32 *fdst = strtof(ret.addr, NULL); 33 break; 34 } 35 return 0; 36 } 37 38 void 39 config_init(Display *dpy) 40 { 41 char *resm; 42 XrmDatabase db; 43 ResourcePref *p; 44 45 XrmInitialize(); 46 resm = XResourceManagerString(dpy); 47 if (!resm) 48 return; 49 50 db = XrmGetStringDatabase(resm); 51 for (p = resources; p < resources + LENGTH(resources); p++) 52 resource_load(db, p->name, p->type, p->dst); 53 }