st-font2-20190416-ba72400.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
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. So… | |
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… | |
7 defined in font2 variable to the beginning of font cache. So they will … | |
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… | |
21 */ | |
22 static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohi… | |
23 +/* Spare fonts */ | |
24 +static char *font2[] = { | |
25 +/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohi… | |
26 +/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=tru… | |
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_… | |
117 + FcResultMatch) { | |
118 + fontval += sizeshift; | |
119 + FcPatternDel(pattern, FC_PIXEL_SIZE); | |
120 + FcPatternDel(pattern, FC_SIZE); | |
121 + FcPatternAddDouble(pattern, FC_PIXEL_SI… | |
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 |