aboutsummarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Lohmann2015-03-09 23:16:03 +0100
committerChristoph Lohmann2015-03-09 23:16:03 +0100
commitfa805814afbc1eff22a13bef5ed763ec66a983ab (patch)
tree079e8b8bfb3ab2e5663db13bbfe07f0f482f3417
parent3e45b2e773af31aaab2bf33e167fe4d4832ce919 (diff)
downloadaur-fa805814afbc1eff22a13bef5ed763ec66a983ab.tar.gz
Add a hack to handle unknown chars in fontconfig.
The unicode long is added to the cache. So when fontconfig does fall back to the default font (where there is no easy way to find this out from the pattern) it isn't reloaded.
-rw-r--r--st.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/st.c b/st.c
index e1139ecba498..e27daf0b5472 100644
--- a/st.c
+++ b/st.c
@@ -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++;