Lazy fontset loading.

Thanks Johannes Hofmann <Johannes.Hofmann@gmx.de>!
This commit is contained in:
Christoph Lohmann 2013-05-11 08:54:26 +02:00
parent 678eff6e18
commit 62502a88e9
1 changed files with 15 additions and 6 deletions

21
st.c
View File

@ -363,6 +363,7 @@ static void xloadcols(void);
static int xsetcolorname(int, const char *); static int xsetcolorname(int, const char *);
static int xloadfont(Font *, FcPattern *); static int xloadfont(Font *, FcPattern *);
static void xloadfonts(char *, int); static void xloadfonts(char *, int);
static int xloadfontset(Font *);
static void xsettitle(char *); static void xsettitle(char *);
static void xresettitle(void); static void xresettitle(void);
static void xseturgency(int); static void xseturgency(int);
@ -2643,16 +2644,12 @@ xloadfont(Font *f, FcPattern *pattern) {
if(!match) if(!match)
return 1; return 1;
if(!(f->set = FcFontSort(0, match, FcTrue, 0, &result))) {
FcPatternDestroy(match);
return 1;
}
if(!(f->match = XftFontOpenPattern(xw.dpy, match))) { if(!(f->match = XftFontOpenPattern(xw.dpy, match))) {
FcPatternDestroy(match); FcPatternDestroy(match);
return 1; return 1;
} }
f->set = NULL;
f->pattern = FcPatternDuplicate(pattern); f->pattern = FcPatternDuplicate(pattern);
f->ascent = f->match->ascent; f->ascent = f->match->ascent;
@ -2727,6 +2724,15 @@ xloadfonts(char *fontstr, int fontsize) {
FcPatternDestroy(pattern); FcPatternDestroy(pattern);
} }
int
xloadfontset(Font *f) {
FcResult result;
if(!(f->set = FcFontSort(0, f->pattern, FcTrue, 0, &result)))
return 1;
return 0;
}
void void
xunloadfonts(void) { xunloadfonts(void) {
int i, ip; int i, ip;
@ -2987,7 +2993,6 @@ xdraws(char *s, Glyph base, int x, int y, int charlen, int bytelen) {
r.width = width; r.width = width;
XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1); XftDrawSetClipRectangles(xw.draw, winx, winy, &r, 1);
fcsets[0] = font->set;
for(xp = winx; bytelen > 0;) { for(xp = winx; bytelen > 0;) {
/* /*
* Search for the range in the to be printed string of glyphs * 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. */ /* Nothing was found. */
if(i >= frclen) { if(i >= frclen) {
if(!font->set)
xloadfontset(font);
fcsets[0] = font->set;
/* /*
* Nothing was found in the cache. Now use * Nothing was found in the cache. Now use
* some dozen of Fontconfig calls to get the * some dozen of Fontconfig calls to get the