# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit 96385952322575090822ef20329b690a55611cb1
    parent be17937c42013057c5112bb6200297341092ef22
    Author: c0dev0id <sh+github@codevoid.de>
    Date:   Sat, 31 Jul 2021 20:21:07 +0200

    sdk-font2

    Diffstat:
    Mconfig.def.h | 6++++++
    Mconfig.h | 7++++++-
    Mx.c | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    3 files changed, 113 insertions(+), 1 deletion(-)
    diff --git a/config.def.h b/config.def.h
    @@ -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;

     /*
    diff --git a/config.h b/config.h
    @@ -6,8 +6,13 @@
      * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
      */
     static char *font = "-misc-termsynu-medium-r-normal--14-101-100-100-c-70-iso10646-1";
    -static int borderpx = 0;
    +/* 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;
     /*
      * What program is execed by st depends of these precedence rules:
      * 1: program passed with -e
    diff --git a/x.c b/x.c
    @@ -158,6 +158,8 @@ static void xhints(void);
     static int xloadcolor(int, const char *, Color *);
     static int xloadfont(Font *, FcPattern *);
     static void xloadfonts(const char *, double);
    +static int xloadsparefont(FcPattern *, int);
    +static void xloadsparefonts(void);
     static void xunloadfont(Font *);
     static void xunloadfonts(void);
     static void xsetenv(void);
    @@ -307,6 +309,7 @@ zoomabs(const Arg *arg)
     {
     	xunloadfonts();
     	xloadfonts(usedfont, arg->f);
    +	xloadsparefonts();
     	cresize(0, 0);
     	redraw();
     	xhints();
    @@ -1029,6 +1032,101 @@ xloadfonts(const 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)
     {
    @@ -1126,6 +1224,9 @@ xinit(int cols, int rows)
     	usedfont = (opt_font == NULL)? font : opt_font;
     	xloadfonts(usedfont, 0);

    +	/* spare fonts */
    +	xloadsparefonts();
    +
     	/* colors */
     	xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
     	xloadcols();