Fixed 'missing glyph doesn't use fontconfig config substitutions' bug - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit fa9a4599720703932d1c4f16b9aeee1f91f96263
 (DIR) parent 740ada1447a0bf9eb7db327d9433fa0b96e0a4d8
 (HTM) Author: Spencer Phippen <spencer.phippen@gmail.com>
       Date:   Wed, 23 Nov 2016 19:17:59 +0100
       
       Fixed 'missing glyph doesn't use fontconfig config substitutions' bug
       
       XftFontMatch does display-specific font configuration (commit 528241a).
       Nice. Unfortunately, when we switched from FcFontMatch, we also stopped
       storing the post-Fc{Config,Default}Substitute FcPattern for future
       lookups. The result is that if a glyph isn't found in the primary font,
       secondary font lookups use the original FcPattern, not the configured
       one. If you have custom fontconfig rules (like me), this can be
       disappointing.
       
       I basically just copied the guts out of XftFontMatch[1] and saved
       the intermediate configured FcPattern. Could be related to the bug that
       inspired commit 4242027.
       
       [1]: https://cgit.freedesktop.org/xorg/lib/libXft/tree/src/xftfont.c
       
       Diffstat:
         M st.c                                |      22 +++++++++++++++++++---
       
       1 file changed, 19 insertions(+), 3 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -3373,16 +3373,32 @@ xgeommasktogravity(int mask)
        int
        xloadfont(Font *f, FcPattern *pattern)
        {
       +        FcPattern *configured;
                FcPattern *match;
                FcResult result;
                XGlyphInfo extents;
                int wantattr, haveattr;
        
       -        match = XftFontMatch(xw.dpy, xw.scr, pattern, &result);
       -        if (!match)
       +        /*
       +         * Manually configure instead of calling XftMatchFont
       +         * so that we can use the configured pattern for
       +         * "missing glyph" lookups.
       +         */
       +        configured = FcPatternDuplicate(pattern);
       +        if (!configured)
       +                return 1;
       +
       +        FcConfigSubstitute(NULL, configured, FcMatchPattern);
       +        XftDefaultSubstitute(xw.dpy, xw.scr, configured);
       +
       +        match = FcFontMatch(NULL, configured, &result);
       +        if (!match) {
       +                FcPatternDestroy(configured);
                        return 1;
       +        }
        
                if (!(f->match = XftFontOpenPattern(xw.dpy, match))) {
       +                FcPatternDestroy(configured);
                        FcPatternDestroy(match);
                        return 1;
                }
       @@ -3414,7 +3430,7 @@ xloadfont(Font *f, FcPattern *pattern)
                        strlen(ascii_printable), &extents);
        
                f->set = NULL;
       -        f->pattern = FcPatternDuplicate(pattern);
       +        f->pattern = configured;
        
                f->ascent = f->match->ascent;
                f->descent = f->match->descent;