Adding font2 patch as per request #3

This commit is contained in:
bakkeby 2020-03-21 16:41:43 +01:00
parent 188ec2fa1c
commit 9f1a2db7c5
9 changed files with 140 additions and 13 deletions

View File

@ -1,4 +1,4 @@
Similar to [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch) this st 0.8.2 project has a different take on st patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more. Similar to [dwm-flexipatch](https://github.com/bakkeby/dwm-flexipatch) this st 0.8.2 (ed68fe7dce2b21b4e0e595b99d47790e76812cb7) project has a different take on st patching. It uses preprocessor directives to decide whether or not to include a patch during build time. Essentially this means that this build, for better or worse, contains both the patched _and_ the original code. The aim being that you can select which patches to include and the build will contain that code and nothing more.
For example to include the `alpha` patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/st-flexipatch/blob/master/patches.h): For example to include the `alpha` patch then you would only need to flip this setting from 0 to 1 in [patches.h](https://github.com/bakkeby/st-flexipatch/blob/master/patches.h):
```c ```c
@ -15,6 +15,8 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the
### Changelog: ### Changelog:
2020-03-21 - Added font2 patch
2020-01-07 - Added st embedder patch 2020-01-07 - Added st embedder patch
2019-10-16 - Introduced [flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer) 2019-10-16 - Introduced [flexipatch-finalizer](https://github.com/bakkeby/flexipatch-finalizer)
@ -58,6 +60,9 @@ Refer to [https://st.suckless.org/](https://st.suckless.org/) for details on the
- [fix-keyboard-input](https://st.suckless.org/patches/fix_keyboard_input/) - [fix-keyboard-input](https://st.suckless.org/patches/fix_keyboard_input/)
- allows cli applications to use all the fancy key combinations that are available to GUI applications - allows cli applications to use all the fancy key combinations that are available to GUI applications
- [font2](https://st.suckless.org/patches/font2/)
- allows you to add a spare font besides the default
- [hidecursor](https://st.suckless.org/patches/hidecursor/) - [hidecursor](https://st.suckless.org/patches/hidecursor/)
- hides the X cursor whenever a key is pressed and show it back when the mouse is moved in the terminal window - hides the X cursor whenever a key is pressed and show it back when the mouse is moved in the terminal window

View File

@ -6,6 +6,14 @@
* font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
*/ */
static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true";
#if FONT2_PATCH
/* Spare fonts */
static char *font2[] = {
/* "Inconsolata for Powerline:pixelsize=12:antialias=true:autohint=true", */
/* "Hack Nerd Font Mono:pixelsize=11:antialias=true:autohint=true", */
};
#endif // FONT2_PATCH
#if RELATIVEBORDER_PATCH #if RELATIVEBORDER_PATCH
/* borderperc: percentage of cell width to use as a border /* borderperc: percentage of cell width to use as a border
* 0 = no border, 100 = border width is same as cell width */ * 0 = no border, 100 = border width is same as cell width */

94
patch/font2.c Normal file
View File

@ -0,0 +1,94 @@
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);
}
}

2
patch/font2.h Normal file
View File

@ -0,0 +1,2 @@
static int xloadsparefont(FcPattern *, int);
static void xloadsparefonts(void);

View File

@ -11,6 +11,9 @@
#if FIXKEYBOARDINPUT_PATCH #if FIXKEYBOARDINPUT_PATCH
#include "fixkeyboardinput.c" #include "fixkeyboardinput.c"
#endif #endif
#if FONT2_PATCH
#include "font2.c"
#endif
#if KEYBOARDSELECT_PATCH #if KEYBOARDSELECT_PATCH
#include "keyboardselect_x.c" #include "keyboardselect_x.c"
#endif #endif

View File

@ -8,6 +8,9 @@
#if FIXIME_PATCH #if FIXIME_PATCH
#include "fixime_x.h" #include "fixime_x.h"
#endif #endif
#if FONT2_PATCH
#include "font2.h"
#endif
#if KEYBOARDSELECT_PATCH #if KEYBOARDSELECT_PATCH
#include "keyboardselect_x.h" #include "keyboardselect_x.h"
#endif #endif

View File

@ -79,6 +79,14 @@
*/ */
#define FIXKEYBOARDINPUT_PATCH 0 #define FIXKEYBOARDINPUT_PATCH 0
/* This patch allows you to add spare font besides the default. Some glyphs can be not present in
* the 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 the font cache.
* So they will be used first for glyphs that are absent in the default font.
* https://st.suckless.org/patches/font2/
*/
#define FONT2_PATCH 0
/* Hide the X cursor whenever a key is pressed and show it back when the mouse is moved in /* Hide the X cursor whenever a key is pressed and show it back when the mouse is moved in
* the terminal window. * the terminal window.
* https://st.suckless.org/patches/hidecursor/ * https://st.suckless.org/patches/hidecursor/

1
st.c
View File

@ -2468,7 +2468,6 @@ tputc(Rune u)
goto check_control_code; goto check_control_code;
} }
if (IS_SET(MODE_SIXEL)) { if (IS_SET(MODE_SIXEL)) {
/* TODO: implement sixel mode */ /* TODO: implement sixel mode */
return; return;

23
x.c
View File

@ -254,8 +254,9 @@ typedef struct {
} Fontcache; } Fontcache;
/* Fontcache is an array now. A new font will be appended to the array. */ /* Fontcache is an array now. A new font will be appended to the array. */
static Fontcache frc[16]; static Fontcache *frc = NULL;
static int frclen = 0; static int frclen = 0;
static int frccap = 0;
static char *usedfont = NULL; static char *usedfont = NULL;
static double usedfontsize = 0; static double usedfontsize = 0;
static double defaultfontsize = 0; static double defaultfontsize = 0;
@ -331,6 +332,9 @@ zoomabs(const Arg *arg)
{ {
xunloadfonts(); xunloadfonts();
xloadfonts(usedfont, arg->f); xloadfonts(usedfont, arg->f);
#if FONT2_PATCH
xloadsparefonts();
#endif // FONT2_PATCH
cresize(0, 0); cresize(0, 0);
redraw(); redraw();
xhints(); xhints();
@ -861,7 +865,6 @@ xsetcolorname(int x, const char *name)
if (!BETWEEN(x, 0, dc.collen)) if (!BETWEEN(x, 0, dc.collen))
return 1; return 1;
if (!xloadcolor(x, name, &ncolor)) if (!xloadcolor(x, name, &ncolor))
return 1; return 1;
@ -1163,6 +1166,11 @@ xinit(int cols, int rows)
usedfont = (opt_font == NULL)? font : opt_font; usedfont = (opt_font == NULL)? font : opt_font;
xloadfonts(usedfont, 0); xloadfonts(usedfont, 0);
#if FONT2_PATCH
/* spare fonts */
xloadsparefonts();
#endif // FONT2_PATCH
/* colors */ /* colors */
#if ALPHA_PATCH #if ALPHA_PATCH
xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None);
@ -1447,13 +1455,10 @@ xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x
fontpattern = FcFontSetMatch(0, fcsets, 1, fontpattern = FcFontSetMatch(0, fcsets, 1,
fcpattern, &fcres); fcpattern, &fcres);
/* /* Allocate memory for the new cache entry. */
* Overwrite or create the new cache entry. if (frclen >= frccap) {
*/ frccap += 16;
if (frclen >= LEN(frc)) { frc = xrealloc(frc, frccap * sizeof(Fontcache));
frclen = LEN(frc) - 1;
XftFontClose(xw.dpy, frc[frclen].font);
frc[frclen].unicodep = 0;
} }
frc[frclen].font = XftFontOpenPattern(xw.dpy, frc[frclen].font = XftFontOpenPattern(xw.dpy,