Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.