xresources.c (4099B)
1 int 2 resource_load(XrmDatabase db, char *name, enum resource_type rtype, void *dst) 3 { 4 char **sdst = dst; 5 int *idst = dst; 6 float *fdst = dst; 7 8 char fullname[256]; 9 char fullclass[256]; 10 char *type; 11 XrmValue ret; 12 13 snprintf(fullname, sizeof(fullname), "%s.%s", 14 opt_name ? opt_name : "st", name); 15 snprintf(fullclass, sizeof(fullclass), "%s.%s", 16 opt_class ? opt_class : "St", name); 17 fullname[sizeof(fullname) - 1] = fullclass[sizeof(fullclass) - 1] = '\0'; 18 19 XrmGetResource(db, fullname, fullclass, &type, &ret); 20 if (ret.addr == NULL || strncmp("String", type, 64)) 21 return 1; 22 23 switch (rtype) { 24 case STRING: 25 /* Note: this leaks memory */ 26 *sdst = strdup(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 #if XRESOURCES_XDEFAULTS_PATCH 39 /* Returns an XrmDatabase that needs to be freed by the caller. */ 40 static XrmDatabase 41 get_resources(Display *dpy) 42 { 43 /*******************************************************************/ 44 /* Adapted from rxvt-unicode-9.31 rxvttoolkit.C get_resources() */ 45 /*******************************************************************/ 46 char *homedir = getenv("HOME"); 47 char fname[1024]; 48 49 char *displayResource, *xe; 50 XrmDatabase rdb1; 51 XrmDatabase database = XrmGetStringDatabase(""); 52 53 /* For ordering, see for example http://www.faqs.org/faqs/Xt-FAQ/ Subject: 20 */ 54 55 /* 6. System wide per application default file. */ 56 57 /* Add in $XAPPLRESDIR/St only; not bothering with XUSERFILESEARCHPATH */ 58 if ((xe = getenv("XAPPLRESDIR")) || (xe = "/etc/X11/app-defaults")) 59 { 60 snprintf(fname, sizeof(fname), "%s/%s", xe, "St"); 61 62 if ((rdb1 = XrmGetFileDatabase(fname))) 63 XrmMergeDatabases(rdb1, &database); 64 } 65 66 /* 5. User's per application default file. None. */ 67 68 /* 4. User's defaults file. */ 69 if (homedir) 70 { 71 snprintf(fname, sizeof(fname), "%s/.Xdefaults", homedir); 72 73 if ((rdb1 = XrmGetFileDatabase(fname))) 74 XrmMergeDatabases(rdb1, &database); 75 } 76 77 /* Get any Xserver Resources (xrdb). */ 78 displayResource = XResourceManagerString(dpy); 79 80 if (displayResource) 81 { 82 if ((rdb1 = XrmGetStringDatabase(displayResource))) 83 XrmMergeDatabases(rdb1, &database); 84 } 85 86 /* Get screen specific resources. */ 87 displayResource = XScreenResourceString(ScreenOfDisplay(dpy, DefaultScreen(dpy))); 88 89 if (displayResource) 90 { 91 if ((rdb1 = XrmGetStringDatabase(displayResource))) 92 XrmMergeDatabases(rdb1, &database); 93 94 XFree(displayResource); 95 } 96 97 /* 3. User's per host defaults file. */ 98 /* Add in XENVIRONMENT file */ 99 if ((xe = getenv("XENVIRONMENT")) && (rdb1 = XrmGetFileDatabase(xe))) 100 XrmMergeDatabases(rdb1, &database); 101 else if (homedir) 102 { 103 struct utsname un; 104 105 if (!uname(&un)) 106 { 107 snprintf(fname, sizeof(fname), "%s/.Xdefaults-%s", homedir, un.nodename); 108 109 if ((rdb1 = XrmGetFileDatabase(fname))) 110 XrmMergeDatabases(rdb1, &database); 111 } 112 } 113 114 return database; 115 } 116 117 void 118 config_init(Display *dpy) 119 { 120 XrmDatabase db; 121 ResourcePref *p; 122 123 XrmInitialize(); 124 db = get_resources(dpy); 125 126 for (p = resources; p < resources + LEN(resources); p++) 127 resource_load(db, p->name, p->type, p->dst); 128 129 XrmDestroyDatabase(db); 130 } 131 132 #else // !XRESOURCES_XDEFAULTS_PATCH 133 134 void 135 config_init(Display *dpy) 136 { 137 char *resm; 138 XrmDatabase db; 139 ResourcePref *p; 140 141 XrmInitialize(); 142 143 resm = XResourceManagerString(dpy); 144 if (!resm) 145 return; 146 147 db = XrmGetStringDatabase(resm); 148 if (!db) 149 return; 150 151 for (p = resources; p < resources + LEN(resources); p++) 152 resource_load(db, p->name, p->type, p->dst); 153 154 XrmDestroyDatabase(db); 155 } 156 #endif // XRESOURCES_XDEFAULTS_PATCH 157 158 #if XRESOURCES_RELOAD_PATCH 159 void 160 reload_config(int sig) 161 { 162 /* Recreate a Display object to have up to date Xresources entries */ 163 Display *dpy; 164 if (!(dpy = XOpenDisplay(NULL))) 165 die("Can't open display\n"); 166 167 config_init(dpy); 168 xloadcols(); 169 170 /* nearly like zoomabs() */ 171 xunloadfonts(); 172 xloadfonts(font, 0); /* font <- config_init() */ 173 #if FONT2_PATCH 174 xloadsparefonts(); 175 #endif // FONT2_PATCH 176 cresize(0, 0); 177 redraw(); 178 xhints(); 179 180 XCloseDisplay(dpy); 181 } 182 #endif // XRESOURCES_RELOAD_PATCH