JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Lazy font unloading too.
[st.git] / st.c
diff --git a/st.c b/st.c
index 50090a4..8475878 100644 (file)
--- a/st.c
+++ b/st.c
@@ -363,11 +363,13 @@ 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);
 static void xsetsel(char*);
 static void xtermclear(int, int, int, int);
+static void xunloadfont(Font *f);
 static void xunloadfonts(void);
 static void xresize(int, int);
 
@@ -2643,16 +2645,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 +2725,23 @@ 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
+xunloadfont(Font *f) {
+       XftFontClose(xw.dpy, f->match);
+       FcPatternDestroy(f->pattern);
+       if(f->set)
+               FcFontSetDestroy(f->set);
+}
+
 void
 xunloadfonts(void) {
        int i, ip;
@@ -2743,18 +2758,10 @@ xunloadfonts(void) {
        frccur = -1;
        frclen = 0;
 
-       XftFontClose(xw.dpy, dc.font.match);
-       FcPatternDestroy(dc.font.pattern);
-       FcFontSetDestroy(dc.font.set);
-       XftFontClose(xw.dpy, dc.bfont.match);
-       FcPatternDestroy(dc.bfont.pattern);
-       FcFontSetDestroy(dc.bfont.set);
-       XftFontClose(xw.dpy, dc.ifont.match);
-       FcPatternDestroy(dc.ifont.pattern);
-       FcFontSetDestroy(dc.ifont.set);
-       XftFontClose(xw.dpy, dc.ibfont.match);
-       FcPatternDestroy(dc.ibfont.pattern);
-       FcFontSetDestroy(dc.ibfont.set);
+       xunloadfont(&dc.font);
+       xunloadfont(&dc.bfont);
+       xunloadfont(&dc.ifont);
+       xunloadfont(&dc.ibfont);
 }
 
 void
@@ -2987,7 +2994,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 +3051,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