tAdd a hack to handle unknown chars in fontconfig. - st - [fork] customized bui… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b0bddc694a79dd24edb8f997acadecbff356a9e0 | |
parent 487bbb24d02190efa3d18093cadfa376f816d7fa | |
Author: Christoph Lohmann <[email protected]> | |
Date: Mon, 9 Mar 2015 23:16:03 +0100 | |
Add a hack to handle unknown chars in fontconfig. | |
The unicode long is added to the cache. So when fontconfig does fall back to | |
tthe default font (where there is no easy way to find this out from the | |
pattern) it isn't reloaded. | |
Diffstat: | |
M st.c | 19 ++++++++++++++----- | |
1 file changed, 14 insertions(+), 5 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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. */ | |
t@@ -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; | |
t@@ -3391,8 +3392,13 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, … | |
/* 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, unicod… | |
+ /* 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; | |
} | |
} | |
t@@ -3421,10 +3427,11 @@ xdraws(char *s, Glyph base, int x, int y, int charlen,… | |
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. | |
t@@ -3432,11 +3439,13 @@ xdraws(char *s, Glyph base, int x, int y, int charlen,… | |
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++; |