st-font2-0.8.5.diff (4196B)
1 From 1635e04d3643dd4caa0c7c2043b585c6d7e4705f Mon Sep 17 00:00:00 2001 2 From: Rizqi Nur Assyaufi <bandithijo@gmail.com> 3 Date: Mon, 18 Jul 2022 01:15:45 +0800 4 Subject: [PATCH] [st][patch][font2] Add patch for st-0.8.5 5 6 --- 7 config.def.h | 6 +++ 8 x.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++ 9 2 files changed, 107 insertions(+) 10 11 diff --git a/config.def.h b/config.def.h 12 index 91ab8ca..717b2f0 100644 13 --- a/config.def.h 14 +++ b/config.def.h 15 @@ -6,6 +6,12 @@ 16 * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html 17 */ 18 static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; 19 +/* Spare fonts */ 20 +static char *font2[] = { 21 +/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */ 22 +/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */ 23 +}; 24 + 25 static int borderpx = 2; 26 27 /* 28 diff --git a/x.c b/x.c 29 index 8a16faa..220fc4f 100644 30 --- a/x.c 31 +++ b/x.c 32 @@ -157,6 +157,8 @@ static void xhints(void); 33 static int xloadcolor(int, const char *, Color *); 34 static int xloadfont(Font *, FcPattern *); 35 static void xloadfonts(const char *, double); 36 +static int xloadsparefont(FcPattern *, int); 37 +static void xloadsparefonts(void); 38 static void xunloadfont(Font *); 39 static void xunloadfonts(void); 40 static void xsetenv(void); 41 @@ -306,6 +308,7 @@ zoomabs(const Arg *arg) 42 { 43 xunloadfonts(); 44 xloadfonts(usedfont, arg->f); 45 + xloadsparefonts(); 46 cresize(0, 0); 47 redraw(); 48 xhints(); 49 @@ -1034,6 +1037,101 @@ xloadfonts(const char *fontstr, double fontsize) 50 FcPatternDestroy(pattern); 51 } 52 53 +int 54 +xloadsparefont(FcPattern *pattern, int flags) 55 +{ 56 + FcPattern *match; 57 + FcResult result; 58 + 59 + match = FcFontMatch(NULL, pattern, &result); 60 + if (!match) { 61 + return 1; 62 + } 63 + 64 + if (!(frc[frclen].font = XftFontOpenPattern(xw.dpy, match))) { 65 + FcPatternDestroy(match); 66 + return 1; 67 + } 68 + 69 + frc[frclen].flags = flags; 70 + /* Believe U+0000 glyph will present in each default font */ 71 + frc[frclen].unicodep = 0; 72 + frclen++; 73 + 74 + return 0; 75 +} 76 + 77 +void 78 +xloadsparefonts(void) 79 +{ 80 + FcPattern *pattern; 81 + double sizeshift, fontval; 82 + int fc; 83 + char **fp; 84 + 85 + if (frclen != 0) 86 + die("can't embed spare fonts. cache isn't empty"); 87 + 88 + /* Calculate count of spare fonts */ 89 + fc = sizeof(font2) / sizeof(*font2); 90 + if (fc == 0) 91 + return; 92 + 93 + /* Allocate memory for cache entries. */ 94 + if (frccap < 4 * fc) { 95 + frccap += 4 * fc - frccap; 96 + frc = xrealloc(frc, frccap * sizeof(Fontcache)); 97 + } 98 + 99 + for (fp = font2; fp - font2 < fc; ++fp) { 100 + 101 + if (**fp == '-') 102 + pattern = XftXlfdParse(*fp, False, False); 103 + else 104 + pattern = FcNameParse((FcChar8 *)*fp); 105 + 106 + if (!pattern) 107 + die("can't open spare font %s\n", *fp); 108 + 109 + if (defaultfontsize > 0) { 110 + sizeshift = usedfontsize - defaultfontsize; 111 + if (sizeshift != 0 && 112 + FcPatternGetDouble(pattern, FC_PIXEL_SIZE, 0, &fontval) == 113 + FcResultMatch) { 114 + fontval += sizeshift; 115 + FcPatternDel(pattern, FC_PIXEL_SIZE); 116 + FcPatternDel(pattern, FC_SIZE); 117 + FcPatternAddDouble(pattern, FC_PIXEL_SIZE, fontval); 118 + } 119 + } 120 + 121 + FcPatternAddBool(pattern, FC_SCALABLE, 1); 122 + 123 + FcConfigSubstitute(NULL, pattern, FcMatchPattern); 124 + XftDefaultSubstitute(xw.dpy, xw.scr, pattern); 125 + 126 + if (xloadsparefont(pattern, FRC_NORMAL)) 127 + die("can't open spare font %s\n", *fp); 128 + 129 + FcPatternDel(pattern, FC_SLANT); 130 + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ITALIC); 131 + if (xloadsparefont(pattern, FRC_ITALIC)) 132 + die("can't open spare font %s\n", *fp); 133 + 134 + FcPatternDel(pattern, FC_WEIGHT); 135 + FcPatternAddInteger(pattern, FC_WEIGHT, FC_WEIGHT_BOLD); 136 + if (xloadsparefont(pattern, FRC_ITALICBOLD)) 137 + die("can't open spare font %s\n", *fp); 138 + 139 + FcPatternDel(pattern, FC_SLANT); 140 + FcPatternAddInteger(pattern, FC_SLANT, FC_SLANT_ROMAN); 141 + if (xloadsparefont(pattern, FRC_BOLD)) 142 + die("can't open spare font %s\n", *fp); 143 + 144 + FcPatternDestroy(pattern); 145 + } 146 +} 147 + 148 void 149 xunloadfont(Font *f) 150 { 151 @@ -1131,6 +1229,9 @@ xinit(int cols, int rows) 152 usedfont = (opt_font == NULL)? font : opt_font; 153 xloadfonts(usedfont, 0); 154 155 + /* spare fonts */ 156 + xloadsparefonts(); 157 + 158 /* colors */ 159 xw.cmap = XDefaultColormap(xw.dpy, xw.scr); 160 xloadcols(); 161 -- 162 2.37.1 163