From 62502a88e94dd908fdd4418899afdd09a4de3bea Mon Sep 17 00:00:00 2001 From: Christoph Lohmann <20h@r-36.net> Date: Sat, 11 May 2013 08:54:26 +0200 Subject: [PATCH] Lazy fontset loading. Thanks Johannes Hofmann ! --- st.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/st.c b/st.c index 50090a4..56955a3 100644 --- a/st.c +++ b/st.c @@ -363,6 +363,7 @@ static void xloadcols(void); static int xsetcolorname(int, const char *); static int xloadfont(Font *, FcPattern *); static void xloadfonts(char *, int); +static int xloadfontset(Font *); static void xsettitle(char *); static void xresettitle(void); static void xseturgency(int); @@ -2643,16 +2644,12 @@ xloadfont(Font *f, FcPattern *pattern) { if(!match) return 1; - if(!(f->set = FcFontSort(0, match, FcTrue, 0, &result))) { - FcPatternDestroy(match); - return 1; - } - if(!(f->match = XftFontOpenPattern(xw.dpy, match))) { FcPatternDestroy(match); return 1; } + f->set = NULL; f->pattern = FcPatternDuplicate(pattern); f->ascent = f->match->ascent; @@ -2727,6 +2724,15 @@ xloadfonts(char *fontstr, int fontsize) { FcPatternDestroy(pattern); } +int +xloadfontset(Font *f) { + FcResult result; + + if(!(f->set = FcFontSort(0, f->pattern, FcTrue, 0, &result))) + return 1; + return 0; +} + void xunloadfonts(void) { int i, ip; @@ -2987,7 +2993,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { r.width = width; XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); - fcsets[0] = font->set; for(xp = winx; bytelen > 0;) { /* * Search for the range in the to be printed string of glyphs @@ -3045,6 +3050,10 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) { /* Nothing was found. */ if(i >= frclen) { + if(!font->set) + xloadfontset(font); + fcsets[0] = font->set; + /* * Nothing was found in the cache. Now use * some dozen of Fontconfig calls to get the