Added fallback font support
							parent
							
								
									cc114781d3
								
							
						
					
					
						commit
						d391a7831a
					
				|  | @ -6,6 +6,12 @@ | |||
|  * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
 | ||||
|  */ | ||||
| static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; | ||||
| /* Spare fonts */ | ||||
| static char *font2[] = { | ||||
| /*	"Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ | ||||
| /*	"Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */ | ||||
| }; | ||||
| 
 | ||||
| static int borderpx = 2; | ||||
| 
 | ||||
| /*
 | ||||
|  |  | |||
							
								
								
									
										5
									
								
								config.h
								
								
								
								
							
							
						
						
									
										5
									
								
								config.h
								
								
								
								
							|  | @ -5,7 +5,10 @@ | |||
|  * | ||||
|  * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
 | ||||
|  */ | ||||
| static char *font = "Fira Code:size=10"; | ||||
| static char *font = "Fira Code:size=11"; | ||||
| static char *font2[] = { | ||||
|     "Noto Color Emoji:size=10" | ||||
| }; | ||||
| static int borderpx = 2; | ||||
| float alpha = 0.8; | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										101
									
								
								x.c
								
								
								
								
							
							
						
						
									
										101
									
								
								x.c
								
								
								
								
							|  | @ -160,6 +160,8 @@ static void xhints(void); | |||
| static int xloadcolor(int, const char *, Color *); | ||||
| static int xloadfont(Font *, FcPattern *); | ||||
| static void xloadfonts(char *, double); | ||||
| static int xloadsparefont(FcPattern *, int); | ||||
| static void xloadsparefonts(void); | ||||
| static void xunloadfont(Font *); | ||||
| static void xunloadfonts(void); | ||||
| static void xsetenv(void); | ||||
|  | @ -310,6 +312,7 @@ zoomabs(const Arg *arg) | |||
| { | ||||
| 	xunloadfonts(); | ||||
| 	xloadfonts(usedfont, arg->f); | ||||
| 	xloadsparefonts(); | ||||
| 	cresize(0, 0); | ||||
| 	redraw(); | ||||
| 	xhints(); | ||||
|  | @ -1034,6 +1037,101 @@ xloadfonts(char *fontstr, double fontsize) | |||
| 	FcPatternDestroy(pattern); | ||||
| } | ||||
| 
 | ||||
| int | ||||
| xloadsparefont(FcPattern *pattern, int flags) | ||||
| { | ||||
| 	FcPattern *match; | ||||
| 	FcResult result; | ||||
| 	 | ||||
| 	match = FcFontMatch(NULL, pattern, &result); | ||||
| 	if (!match) { | ||||
| 		return 1; | ||||
| 	} | ||||
| 
 | ||||
| 	if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) { | ||||
| 		FcPatternDestroy(match); | ||||
| 		return 1; | ||||
| 	} | ||||
| 
 | ||||
| 	frc[frclen].flags = flags; | ||||
| 	/* Believe U+0000 glyph will present in each default font */ | ||||
| 	frc[frclen].unicodep = 0; | ||||
| 	frclen++; | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| xloadsparefonts(void) | ||||
| { | ||||
| 	FcPattern *pattern; | ||||
| 	double sizeshift, fontval; | ||||
| 	int fc; | ||||
| 	char **fp; | ||||
| 
 | ||||
| 	if (frclen != 0) | ||||
| 		die("can't embed spare fonts. cache isn't empty"); | ||||
| 
 | ||||
| 	/* Calculate count of spare fonts */ | ||||
| 	fc = sizeof(font2) / sizeof(*font2); | ||||
| 	if (fc == 0) | ||||
| 		return; | ||||
| 
 | ||||
| 	/* Allocate memory for cache entries. */ | ||||
| 	if (frccap < 4 * fc) { | ||||
| 		frccap += 4 * fc - frccap; | ||||
| 		frc = xrealloc(frc, frccap * sizeof(Fontcache)); | ||||
| 	} | ||||
| 
 | ||||
| 	for (fp = font2; fp - font2 < fc; ++fp) { | ||||
| 	 | ||||
| 		if (**fp == '-') | ||||
| 			pattern = XftXlfdParse(*fp, False, False); | ||||
| 		else | ||||
| 			pattern = FcNameParse((FcChar8 *)*fp); | ||||
| 	 | ||||
| 		if (!pattern) | ||||
| 			die("can't open spare font %s\n", *fp); | ||||
| 	   		 | ||||
| 		if (defaultfontsize > 0) { | ||||
| 			sizeshift = usedfontsize - defaultfontsize; | ||||
| 			if (sizeshift != 0 && | ||||
| 					FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == | ||||
| 					FcResultMatch) {	 | ||||
| 				fontval += sizeshift; | ||||
| 				FcPatternDel(pattern, FC_PIXEL_SIZE); | ||||
| 				FcPatternDel(pattern, FC_SIZE); | ||||
| 				FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); | ||||
| 			} | ||||
| 		} | ||||
| 	 | ||||
| 		FcPatternAddBool(pattern, FC_SCALABLE, 1); | ||||
| 	 | ||||
| 		FcConfigSubstitute(NULL, pattern, FcMatchPattern); | ||||
| 		XftDefaultSubstitute(xw.dpy, xw.scr, pattern); | ||||
| 	 | ||||
| 		if (xloadsparefont(pattern, FRC_NORMAL)) | ||||
| 			die("can't open spare font %s\n", *fp); | ||||
| 	 | ||||
| 		FcPatternDel(pattern, FC_SLANT); | ||||
| 		FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); | ||||
| 		if (xloadsparefont(pattern, FRC_ITALIC)) | ||||
| 			die("can't open spare font %s\n", *fp); | ||||
| 			 | ||||
| 		FcPatternDel(pattern, FC_WEIGHT); | ||||
| 		FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); | ||||
| 		if (xloadsparefont(pattern, FRC_ITALICBOLD)) | ||||
| 			die("can't open spare font %s\n", *fp); | ||||
| 	 | ||||
| 		FcPatternDel(pattern, FC_SLANT); | ||||
| 		FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); | ||||
| 		if (xloadsparefont(pattern, FRC_BOLD)) | ||||
| 			die("can't open spare font %s\n", *fp); | ||||
| 	 | ||||
| 		FcPatternDestroy(pattern); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void | ||||
| xunloadfont(Font *f) | ||||
| { | ||||
|  | @ -1146,6 +1244,9 @@ xinit(int cols, int rows) | |||
| 	usedfont = (opt_font == NULL)? font : opt_font; | ||||
| 	xloadfonts(usedfont, 0); | ||||
| 
 | ||||
| 	/* spare fonts */ | ||||
| 	xloadsparefonts(); | ||||
| 
 | ||||
| 	/* colors */ | ||||
| 	xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); | ||||
| 	xloadcols(); | ||||
|  |  | |||
							
								
								
									
										16
									
								
								x.c.orig
								
								
								
								
							
							
						
						
									
										16
									
								
								x.c.orig
								
								
								
								
							|  | @ -19,6 +19,7 @@ char *argv0; | |||
| #include "arg.h" | ||||
| #include "st.h" | ||||
| #include "win.h" | ||||
| #include "hb.h" | ||||
| 
 | ||||
| /* types used in config.h */ | ||||
| typedef struct { | ||||
|  | @ -1045,6 +1046,9 @@ xunloadfont(Font *f) | |||
| void | ||||
| xunloadfonts(void) | ||||
| { | ||||
| 	/* Clear Harfbuzz font cache. */ | ||||
| 	hbunloadfonts(); | ||||
| 
 | ||||
| 	/* Free the loaded fonts in the font cache.  */ | ||||
| 	while (frclen > 0) | ||||
| 		XftFontClose(xw.dpy, frc[--frclen].font); | ||||
|  | @ -1253,7 +1257,7 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x | |||
| 		mode = glyphs[i].mode; | ||||
| 
 | ||||
| 		/* Skip dummy wide-character spacing. */ | ||||
| 		if (mode == ATTR_WDUMMY) | ||||
| 		if (mode & ATTR_WDUMMY) | ||||
| 			continue; | ||||
| 
 | ||||
| 		/* Determine font for glyph if different from previous glyph. */ | ||||
|  | @ -1365,6 +1369,9 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x | |||
| 		numspecs++; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Harfbuzz transformation for ligatures. */ | ||||
| 	hbtransform(specs, glyphs, len, x, y); | ||||
| 
 | ||||
| 	return numspecs; | ||||
| } | ||||
| 
 | ||||
|  | @ -1518,14 +1525,17 @@ xdrawglyph(Glyph g, int x, int y) | |||
| } | ||||
| 
 | ||||
| void | ||||
| xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) | ||||
| xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og, Line line, int len) | ||||
| { | ||||
| 	Color drawcol; | ||||
| 
 | ||||
| 	/* remove the old cursor */ | ||||
| 	if (selected(ox, oy)) | ||||
| 		og.mode ^= ATTR_REVERSE; | ||||
| 	xdrawglyph(og, ox, oy); | ||||
| 
 | ||||
| 	/* Redraw the line where cursor was previously.
 | ||||
| 	 * It will restore the ligatures broken by the cursor. */ | ||||
| 	xdrawline(line, 0, oy, len); | ||||
| 
 | ||||
| 	if (IS_SET(MODE_HIDE)) | ||||
| 		return; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue