st-font2-20190416-ba72400.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
st-font2-20190416-ba72400.diff (4495B)
---
1 From ba724004c6a368e452114f7dc147a9978fe0f3b4 Mon Sep 17 00:00:00 2001
2 From: Kirill Bugaev <kirill.bugaev87@gmail.com>
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