diff options
Diffstat (limited to 'st.c')
| -rw-r--r-- | st.c | 63 | 
1 files changed, 22 insertions, 41 deletions
@@ -462,17 +462,12 @@ enum {  typedef struct {  	XftFont *font; -	long c;  	int flags;  } Fontcache; -/* - * Fontcache is a ring buffer, with frccur as current position and frclen as - * the current length of used elements. - */ - -static Fontcache frc[1024]; -static int frccur = -1, frclen = 0; +/* Fontcache is an array now. A new font will be appended to the array. */ +static Fontcache frc[16]; +static int frclen = 0;  ssize_t  xwrite(int fd, char *s, size_t len) { @@ -2781,18 +2776,12 @@ xunloadfont(Font *f) {  void  xunloadfonts(void) { -	int i, ip; +	int i; -	/* -	 * Free the loaded fonts in the font cache. This is done backwards -	 * from the frccur. -	 */ -	for(i = 0, ip = frccur; i < frclen; i++, ip--) { -		if(ip < 0) -			ip = LEN(frc) - 1; -		XftFontClose(xw.dpy, frc[ip].font); +	/* Free the loaded fonts in the font cache.  */ +	for(i = 0; i < frclen; i++) { +		XftFontClose(xw.dpy, frc[i].font);  	} -	frccur = -1;  	frclen = 0;  	xunloadfont(&dc.font); @@ -2918,7 +2907,7 @@ void  xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  	int winx = borderpx + x * xw.cw, winy = borderpx + y * xw.ch,  	    width = charlen * xw.cw, xp, i; -	int frp, frcflags; +	int frcflags;  	int u8fl, u8fblen, u8cblen, doesexist;  	char *u8c, *u8fs;  	long u8char; @@ -3044,7 +3033,7 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  			s += u8cblen;  			bytelen -= u8cblen; -			doesexist = XftCharIndex(xw.dpy, font->match, u8char); +			doesexist = XftCharExists(xw.dpy, font->match, u8char);  			if(!doesexist || bytelen <= 0) {  				if(bytelen <= 0) {  					if(doesexist) { @@ -3071,14 +3060,10 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  		if(doesexist)  			break; -		frp = frccur;  		/* Search the font cache. */ -		for(i = 0; i < frclen; i++, frp--) { -			if(frp <= 0) -				frp = LEN(frc) - 1; - -			if(frc[frp].c == u8char -					&& frc[frp].flags == frcflags) { +		for(i = 0; i < frclen; i++) { +			if(XftCharExists(xw.dpy, frc[i].font, u8char) +					&& frc[i].flags == frcflags) {  				break;  			}  		} @@ -3113,28 +3098,24 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  			/*  			 * Overwrite or create the new cache entry.  			 */ -			frccur++; -			frclen++; -			if(frccur >= LEN(frc)) -				frccur = 0; -			if(frclen > LEN(frc)) { -				frclen = LEN(frc); -				XftFontClose(xw.dpy, frc[frccur].font); +			if(frclen >= LEN(frc)) { +				frclen = LEN(frc) - 1; +				XftFontClose(xw.dpy, frc[frclen].font);  			} -			frc[frccur].font = XftFontOpenPattern(xw.dpy, +			frc[frclen].font = XftFontOpenPattern(xw.dpy,  					fontpattern); -			frc[frccur].c = u8char; -			frc[frccur].flags = frcflags; +			frc[frclen].flags = frcflags; + +			i = frclen; +			frclen++;  			FcPatternDestroy(fcpattern);  			FcCharSetDestroy(fccharset); - -			frp = frccur;  		} -		XftDrawStringUtf8(xw.draw, fg, frc[frp].font, -				xp, winy + frc[frp].font->ascent, +		XftDrawStringUtf8(xw.draw, fg, frc[i].font, +				xp, winy + frc[i].font->ascent,  				(FcChar8 *)u8c, u8cblen);  		xp += font->width;  | 
