JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Add a hack to handle unknown chars in fontconfig.
[st.git] / st.c
diff --git a/st.c b/st.c
index e1139ec..e27daf0 100644 (file)
--- a/st.c
+++ b/st.c
@@ -522,6 +522,7 @@ enum {
 typedef struct {
        XftFont *font;
        int flags;
 typedef struct {
        XftFont *font;
        int flags;
+       long unicodep;
 } Fontcache;
 
 /* Fontcache is an array now. A new font will be appended to the array. */
 } 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;
 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;
        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++) {
 
                /* 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;
                        }
                }
                                break;
                        }
                }
@@ -3421,10 +3427,11 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
 
                        FcConfigSubstitute(0, fcpattern,
                                        FcMatchPattern);
 
                        FcConfigSubstitute(0, fcpattern,
                                        FcMatchPattern);
+                       FcPatternPrint(fcpattern);
                        FcDefaultSubstitute(fcpattern);
 
                        FcDefaultSubstitute(fcpattern);
 
-                       fontpattern = FcFontSetMatch(0, fcsets,
-                                       FcTrue, fcpattern, &fcres);
+                       fontpattern = FcFontSetMatch(0, fcsets, 1,
+                                       fcpattern, &fcres);
 
                        /*
                         * Overwrite or create the new cache entry.
 
                        /*
                         * 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);
                        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].font = XftFontOpenPattern(xw.dpy,
                                        fontpattern);
                        frc[frclen].flags = frcflags;
+                       frc[frclen].unicodep = unicodep;
 
                        i = frclen;
                        frclen++;
 
                        i = frclen;
                        frclen++;