diff options
| -rw-r--r-- | st.c | 19 | 
1 files changed, 14 insertions, 5 deletions
| @@ -522,6 +522,7 @@ enum {  typedef struct {  	XftFont *font;  	int flags; +	long unicodep;  } Fontcache;  /* Fontcache is an array now. A new font will be appended to the array. */ @@ -3208,7 +3209,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 frcflags; +	int frcflags, charexists;  	int u8fl, u8fblen, u8cblen, doesexist;  	char *u8c, *u8fs;  	long unicodep; @@ -3391,8 +3392,13 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  		/* Search the font cache. */  		for(i = 0; i < frclen; i++) { -			if(XftCharExists(xw.dpy, frc[i].font, unicodep) -					&& frc[i].flags == frcflags) { +			charexists = XftCharExists(xw.dpy, frc[i].font, unicodep); +			/* Everything correct. */ +			if(charexists && frc[i].flags == frcflags) +				break; +			/* We got a default font for a not found glyph. */ +			if(!charexists && frc[i].flags == frcflags \ +					&& unicodep == unicodep) {  				break;  			}  		} @@ -3421,10 +3427,11 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  			FcConfigSubstitute(0, fcpattern,  					FcMatchPattern); +			FcPatternPrint(fcpattern);  			FcDefaultSubstitute(fcpattern); -			fontpattern = FcFontSetMatch(0, fcsets, -					FcTrue, fcpattern, &fcres); +			fontpattern = FcFontSetMatch(0, fcsets, 1, +					fcpattern, &fcres);  			/*  			 * Overwrite or create the new cache entry. @@ -3432,11 +3439,13 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {  			if(frclen >= LEN(frc)) {  				frclen = LEN(frc) - 1;  				XftFontClose(xw.dpy, frc[frclen].font); +				frc[frclen].unicodep = 0;  			}  			frc[frclen].font = XftFontOpenPattern(xw.dpy,  					fontpattern);  			frc[frclen].flags = frcflags; +			frc[frclen].unicodep = unicodep;  			i = frclen;  			frclen++; | 
