all repos — st @ b0bddc694a79dd24edb8f997acadecbff356a9e0

st (suckless terminal) config

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.
Christoph Lohmann 20h@r-36.net
commit

b0bddc694a79dd24edb8f997acadecbff356a9e0

parent

487bbb24d02190efa3d18093cadfa376f816d7fa

1 files changed, 14 insertions(+), 5 deletions(-)

jump to
M st.cst.c

@@ -522,6 +522,7 @@

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 @@ }

/* 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 @@ FcTrue);

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 @@ */

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++;