st

Kris's build of st
git clone git clone https://git.krisyotam.com/krisyotam/st.git
Log | Files | Refs | README | LICENSE

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