From 7115b4e8864b94f499335002d357b27263511ea6 Mon Sep 17 00:00:00 2001 From: Michael Peters Date: Thu, 13 Oct 2022 11:31:17 -0700 Subject: [PATCH] font2 patch --- config.def.h | 6 ++ config.h | 4 + .../st-appsync-20200618-b27a383.diff | 0 .../{todo => in-progress}/st-font2-0.8.5.diff | 0 x.c | 101 ++++++++++++++++++ 5 files changed, 111 insertions(+) rename patches/{in-progress => done}/st-appsync-20200618-b27a383.diff (100%) rename patches/{todo => in-progress}/st-font2-0.8.5.diff (100%) diff --git a/config.def.h b/config.def.h index 1beb5bd..bd781cd 100644 --- 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 index 52beb02..79746ec 100644 --- a/config.h +++ b/config.h @@ -6,6 +6,10 @@ * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html */ static char *font = "Hack Nerd Font:pixelsize=14:antialias=true:autohint=true"; +/* Spare fonts */ +static char *font2[] = { + "Symbola:pixelsize=14:antialias=true:autohint=true", +}; static int borderpx = 2; /* diff --git a/patches/in-progress/st-appsync-20200618-b27a383.diff b/patches/done/st-appsync-20200618-b27a383.diff similarity index 100% rename from patches/in-progress/st-appsync-20200618-b27a383.diff rename to patches/done/st-appsync-20200618-b27a383.diff diff --git a/patches/todo/st-font2-0.8.5.diff b/patches/in-progress/st-font2-0.8.5.diff similarity index 100% rename from patches/todo/st-font2-0.8.5.diff rename to patches/in-progress/st-font2-0.8.5.diff diff --git a/x.c b/x.c index 290c0ea..57b71ef 100644 --- 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); @@ -308,6 +310,7 @@ zoomabs(const Arg *arg) { xunloadfonts(); xloadfonts(usedfont, arg->f); + xloadsparefonts(); cresize(0, 0); redraw(); xhints(); @@ -1059,6 +1062,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) { @@ -1168,6 +1266,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();