[hackers] [st] Add a hack to handle unknown chars in fontconfig. || Christoph Lohmann

From: <git_AT_suckless.org>
Date: Mon, 9 Mar 2015 23:17:01 +0100 (CET)

commit b0bddc694a79dd24edb8f997acadecbff356a9e0
Author: Christoph Lohmann <20h_AT_r-36.net>
Date: Mon Mar 9 23:16:03 2015 +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.

diff --git a/st.c b/st.c
index e1139ec..e27daf0 100644
--- a/st.c
+++ b/st.c
_AT_@ -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. */
_AT_@ -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;
_AT_@ -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;
                         }
                 }
_AT_@ -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.
_AT_@ -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++;
Received on Mon Mar 09 2015 - 23:17:01 CET

This archive was generated by hypermail 2.3.0 : Mon Mar 09 2015 - 23:24:14 CET