]> Sergey Matveev's repositories - st.git/commitdiff
Add a hack to handle unknown chars in fontconfig.
authorChristoph Lohmann <20h@r-36.net>
Mon, 9 Mar 2015 22:16:03 +0000 (23:16 +0100)
committerChristoph Lohmann <20h@r-36.net>
Mon, 9 Mar 2015 22:16:03 +0000 (23:16 +0100)
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.

st.c

diff --git a/st.c b/st.c
index e1139ecba4988787e28ae7d2d652532efa007cbe..e27daf0b547228a29f71eb2645ea47c9ca7e638d 100644 (file)
--- 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++;