st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit 62502a88e94dd908fdd4418899afdd09a4de3bea
parent 678eff6e1882a888deda5e4e429df42c39b604fe
Author: Christoph Lohmann <20h@r-36.net>
Date:   Sat, 11 May 2013 08:54:26 +0200

Lazy fontset loading.

Thanks Johannes Hofmann <Johannes.Hofmann@gmx.de>!

Diffstat:
Mst.c | 21+++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git 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