You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
4.4 KiB
167 lines
4.4 KiB
From ba724004c6a368e452114f7dc147a9978fe0f3b4 Mon Sep 17 00:00:00 2001 |
|
From: Kirill Bugaev <kirill.bugaev87@gmail.com> |
|
Date: Tue, 16 Apr 2019 04:31:30 +0800 |
|
Subject: [PATCH] This patch allows to add spare font besides default. Some |
|
glyphs can be not present in default font. For this glyphs st uses |
|
font-config and try to find them in font cache first. This patch append fonts |
|
defined in font2 variable to the beginning of font cache. So they will be |
|
used first for glyphs that absent in default font. |
|
|
|
--- |
|
config.def.h | 6 +++ |
|
x.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
2 files changed, 107 insertions(+) |
|
|
|
diff --git a/config.def.h b/config.def.h |
|
index 482901e..676719e 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/x.c b/x.c |
|
index 5828a3b..d37e59d 100644 |
|
--- a/x.c |
|
+++ b/x.c |
|
@@ -149,6 +149,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); |
|
@@ -296,6 +298,7 @@ zoomabs(const Arg *arg) |
|
{ |
|
xunloadfonts(); |
|
xloadfonts(usedfont, arg->f); |
|
+ xloadsparefonts(); |
|
cresize(0, 0); |
|
redraw(); |
|
xhints(); |
|
@@ -977,6 +980,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) |
|
{ |
|
@@ -1057,6 +1155,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(); |
|
-- |
|
2.21.0 |
|
|
|
|