Lazy fontset loading.
Thanks Johannes Hofmann <Johannes.Hofmann@gmx.de>!
This commit is contained in:
		
							
								
								
									
										21
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								st.c
									
									
									
									
									
								
							| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user