diff options
| author | noname@inventati.org <noname@inventati.org> | 2015-04-21 09:48:33 +0200 | 
|---|---|---|
| committer | Roberto E. Vargas Caballero <k0ga@shike2.com> | 2015-04-21 09:48:33 +0200 | 
| commit | 89807ed453e27893dea5ac73ee2c6b4f8dd15afb (patch) | |
| tree | 22db8b7a9010486d2de7257b4b3026f18be4f6f1 | |
| parent | 84c756b97e31ca6946f634dc329ff8026caa6539 (diff) | |
| download | st-89807ed453e27893dea5ac73ee2c6b4f8dd15afb.tar.gz st-89807ed453e27893dea5ac73ee2c6b4f8dd15afb.zip | |
Move common code to xloadcolor
| -rw-r--r-- | st.c | 82 | 
1 files changed, 29 insertions, 53 deletions
| @@ -2898,10 +2898,31 @@ sixd_to_16bit(int x) {  	return x == 0 ? 0 : 0x3737 + 0x2828 * x;  } +bool +xloadcolor(int i, const char *name, Color *ncolor) { +	XRenderColor color = { .alpha = 0xffff }; + +	if(!name) { +		if(BETWEEN(i, 16, 255)) { /* 256 color */ +			if(i < 6*6*6+16) { /* same colors as xterm */ +				color.red   = sixd_to_16bit( ((i-16)/36)%6 ); +				color.green = sixd_to_16bit( ((i-16)/6) %6 ); +				color.blue  = sixd_to_16bit( ((i-16)/1) %6 ); +			} else { /* greyscale */ +				color.red = 0x0808 + 0x0a0a * (i - (6*6*6+16)); +				color.green = color.blue = color.red; +			} +			return XftColorAllocValue(xw.dpy, xw.vis, +			                          xw.cmap, &color, ncolor); +		} else +			name = colorname[i]; +	} +	return XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, ncolor); +} +  void  xloadcols(void) {  	int i; -	XRenderColor color = { .alpha = 0xffff };  	static bool loaded;  	Color *cp; @@ -2910,70 +2931,25 @@ xloadcols(void) {  			XftColorFree(xw.dpy, xw.vis, xw.cmap, cp);  	} -	/* load colors [0-15] and [256-LEN(colorname)] (config.h) */ -	for(i = 0; i < LEN(dc.col); i++) { -		if(!colorname[i]) -			continue; -		if(!XftColorAllocName(xw.dpy, xw.vis, xw.cmap, colorname[i], &dc.col[i])) { -			die("Could not allocate color '%s'\n", colorname[i]); +	for(i = 0; i < LEN(dc.col); i++) +		if(!xloadcolor(i, NULL, &dc.col[i])) { +			if(colorname[i]) +				die("Could not allocate color '%s'\n", colorname[i]); +			else +				die("Could not allocate color %d\n", i);  		} -	} - -	/* load colors [16-231] ; same colors as xterm */ -	for(i = 16; i < 6*6*6+16; i++) { -		color.red   = sixd_to_16bit( ((i-16)/36)%6 ); -		color.green = sixd_to_16bit( ((i-16)/6) %6 ); -		color.blue  = sixd_to_16bit( ((i-16)/1) %6 ); -		if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &dc.col[i])) -			die("Could not allocate color %d\n", i); -	} - -	/* load colors [232-255] ; grayscale */ -	for(; i < 256; i++) { -		color.red = color.green = color.blue = 0x0808 + 0x0a0a * (i-(6*6*6+16)); -		if(!XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &color, &dc.col[i])) -			die("Could not allocate color %d\n", i); -	}  	loaded = true;  }  int  xsetcolorname(int x, const char *name) { -	XRenderColor color = { .alpha = 0xffff };  	Color ncolor;  	if(!BETWEEN(x, 0, LEN(dc.col)))  		return 1; -	if(!name) { -		if(BETWEEN(x, 16, 16 + 215)) { /* 256 color */ -			color.red   = sixd_to_16bit( ((x-16)/36)%6 ); -			color.green = sixd_to_16bit( ((x-16)/6) %6 ); -			color.blue  = sixd_to_16bit( ((x-16)/1) %6 ); -			if(!XftColorAllocValue(xw.dpy, xw.vis, -						xw.cmap, &color, &ncolor)) { -				return 1; -			} - -			XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]); -			dc.col[x] = ncolor; -			return 0; -		} else if(BETWEEN(x, 16 + 216, 255)) { /* greyscale */ -			color.red = color.green = color.blue = \ -				    0x0808 + 0x0a0a * (x - (16 + 216)); -			if(!XftColorAllocValue(xw.dpy, xw.vis, -						xw.cmap, &color, &ncolor)) { -				return 1; -			} -			XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]); -			dc.col[x] = ncolor; -			return 0; -		} else { /* system colors */ -			name = colorname[x]; -		} -	} -	if(!XftColorAllocName(xw.dpy, xw.vis, xw.cmap, name, &ncolor)) +	if(!xloadcolor(x, name, &ncolor))  		return 1;  	XftColorFree(xw.dpy, xw.vis, xw.cmap, &dc.col[x]); | 
