st

Mahdi's build of st
git clone git://mahdi.pw/st.git
Log | Files | Refs | README | LICENSE

st-font2-20190416-ba72400.diff (4495B)


      1 From ba724004c6a368e452114f7dc147a9978fe0f3b4 Mon Sep 17 00:00:00 2001
      2 From: Kirill Bugaev <[email protected]>
      3 Date: Tue, 16 Apr 2019 04:31:30 +0800
      4 Subject: [PATCH] This patch allows to add spare font besides default. Some
      5  glyphs can be not present in default font. For this glyphs st uses
      6  font-config and try to find them in font cache first. This patch append fonts
      7  defined in font2 variable to the beginning of font cache. So they will be
      8  used first for glyphs that absent in default font.
      9 
     10 ---
     11  config.def.h |   6 +++
     12  x.c          | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++
     13  2 files changed, 107 insertions(+)
     14 
     15 diff --git a/config.def.h b/config.def.h
     16 index 482901e..676719e 100644
     17 --- a/config.def.h
     18 +++ b/config.def.h
     19 @@ -6,6 +6,12 @@
     20   * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
     21   */
     22  static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
     23 +/* Spare fonts */
     24 +static char *font2[] = {
     25 +/*	"Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */
     26 +/*	"Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */
     27 +};
     28 +
     29  static int borderpx = 2;
     30  
     31  /*
     32 diff --git a/x.c b/x.c
     33 index 5828a3b..d37e59d 100644
     34 --- a/x.c
     35 +++ b/x.c
     36 @@ -149,6 +149,8 @@ static void xhints(void);
     37  static int xloadcolor(int, const char *, Color *);
     38  static int xloadfont(Font *, FcPattern *);
     39  static void xloadfonts(char *, double);
     40 +static int xloadsparefont(FcPattern *, int);
     41 +static void xloadsparefonts(void);
     42  static void xunloadfont(Font *);
     43  static void xunloadfonts(void);
     44  static void xsetenv(void);
     45 @@ -296,6 +298,7 @@ zoomabs(const Arg *arg)
     46  {
     47  	xunloadfonts();
     48  	xloadfonts(usedfont, arg->f);
     49 +	xloadsparefonts();
     50  	cresize(0, 0);
     51  	redraw();
     52  	xhints();
     53 @@ -977,6 +980,101 @@ xloadfonts(char *fontstr, double fontsize)
     54  	FcPatternDestroy(pattern);
     55  }
     56  
     57 +int
     58 +xloadsparefont(FcPattern *pattern, int flags)
     59 +{
     60 +	FcPattern *match;
     61 +	FcResult result;
     62 +	
     63 +	match = FcFontMatch(NULL, pattern, &result);
     64 +	if (!match) {
     65 +		return 1;
     66 +	}
     67 +
     68 +	if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) {
     69 +		FcPatternDestroy(match);
     70 +		return 1;
     71 +	}
     72 +
     73 +	frc[frclen].flags = flags;
     74 +	/* Believe U+0000 glyph will present in each default font */
     75 +	frc[frclen].unicodep = 0;
     76 +	frclen++;
     77 +
     78 +	return 0;
     79 +}
     80 +
     81 +void
     82 +xloadsparefonts(void)
     83 +{
     84 +	FcPattern *pattern;
     85 +	double sizeshift, fontval;
     86 +	int fc;
     87 +	char **fp;
     88 +
     89 +	if (frclen != 0)
     90 +		die("can't embed spare fonts. cache isn't empty");
     91 +
     92 +	/* Calculate count of spare fonts */
     93 +	fc = sizeof(font2) / sizeof(*font2);
     94 +	if (fc == 0)
     95 +		return;
     96 +
     97 +	/* Allocate memory for cache entries. */
     98 +	if (frccap < 4 * fc) {
     99 +		frccap += 4 * fc - frccap;
    100 +		frc = xrealloc(frc, frccap * sizeof(Fontcache));
    101 +	}
    102 +
    103 +	for (fp = font2; fp - font2 < fc; ++fp) {
    104 +	
    105 +		if (**fp == '-')
    106 +			pattern = XftXlfdParse(*fp, False, False);
    107 +		else
    108 +			pattern = FcNameParse((FcChar8 *)*fp);
    109 +	
    110 +		if (!pattern)
    111 +			die("can't open spare font %s\n", *fp);
    112 +	   		
    113 +		if (defaultfontsize > 0) {
    114 +			sizeshift = usedfontsize - defaultfontsize;
    115 +			if (sizeshift != 0 &&
    116 +					FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) ==
    117 +					FcResultMatch) {	
    118 +				fontval += sizeshift;
    119 +				FcPatternDel(pattern, FC_PIXEL_SIZE);
    120 +				FcPatternDel(pattern, FC_SIZE);
    121 +				FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval);
    122 +			}
    123 +		}
    124 +	
    125 +		FcPatternAddBool(pattern, FC_SCALABLE, 1);
    126 +	
    127 +		FcConfigSubstitute(NULL, pattern, FcMatchPattern);
    128 +		XftDefaultSubstitute(xw.dpy, xw.scr, pattern);
    129 +	
    130 +		if (xloadsparefont(pattern, FRC_NORMAL))
    131 +			die("can't open spare font %s\n", *fp);
    132 +	
    133 +		FcPatternDel(pattern, FC_SLANT);
    134 +		FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC);
    135 +		if (xloadsparefont(pattern, FRC_ITALIC))
    136 +			die("can't open spare font %s\n", *fp);
    137 +			
    138 +		FcPatternDel(pattern, FC_WEIGHT);
    139 +		FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD);
    140 +		if (xloadsparefont(pattern, FRC_ITALICBOLD))
    141 +			die("can't open spare font %s\n", *fp);
    142 +	
    143 +		FcPatternDel(pattern, FC_SLANT);
    144 +		FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN);
    145 +		if (xloadsparefont(pattern, FRC_BOLD))
    146 +			die("can't open spare font %s\n", *fp);
    147 +	
    148 +		FcPatternDestroy(pattern);
    149 +	}
    150 +}
    151 +
    152  void
    153  xunloadfont(Font *f)
    154  {
    155 @@ -1057,6 +1155,9 @@ xinit(int cols, int rows)
    156  	usedfont = (opt_font == NULL)? font : opt_font;
    157  	xloadfonts(usedfont, 0);
    158  
    159 +	/* spare fonts */
    160 +	xloadsparefonts();
    161 +
    162  	/* colors */
    163  	xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
    164  	xloadcols();
    165 -- 
    166 2.21.0
    167