URI: 
       Add a hack to handle unknown chars in fontconfig. - st - simple terminal
  HTML git clone https://git.parazyd.org/st
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit b0bddc694a79dd24edb8f997acadecbff356a9e0
   DIR parent 487bbb24d02190efa3d18093cadfa376f816d7fa
  HTML Author: Christoph Lohmann <20h@r-36.net>
       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
       the 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(-)
       ---
   DIR diff --git 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++;