Skip to content

Commit

Permalink
fasz
Browse files Browse the repository at this point in the history
  • Loading branch information
glorantq committed Feb 6, 2023
1 parent 1f12ab4 commit da94d9a
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 1 deletion.
12 changes: 11 additions & 1 deletion config.def.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,17 @@
*
* font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
*/
static char *font = "Anonymice Nerd Font:pixelsize=12:antialias=true:autohint=true";
static char *font =
"Anonymice Nerd Font:pixelsize=12:antialias=true:autohint=true";
/* Spare fonts */
static char *font2[] = {
"Inconsolata:pixelsize=12:antialias=true:autohint=true",
"Noto Color Emoji:style=Regular:pixelsize=12:antialias=true:autohint=true",
"Noto Sans CJK JP:pixelsize=12:antialias=true:autohint=true",
"Noto Sans CJK KR:pixelsize=12:antialias=true:autohint=true",
"Noto Sans CJK SC:pixelsize=12:antialias=true:autohint=true",
"Noto Sans CJK HK:pixelsize=12:antialias=true:autohint=true",
};
static int borderpx = 2;

/*
Expand Down
101 changes: 101 additions & 0 deletions x.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ static void xhints(void);
static int xloadcolor(int, const char *, Color *);
static int xloadfont(Font *, FcPattern *);
static void xloadfonts(const char *, double);
static int xloadsparefont(FcPattern *, int);
static void xloadsparefonts(void);
static void xunloadfont(Font *);
static void xunloadfonts(void);
static void xsetenv(void);
Expand Down Expand Up @@ -314,6 +316,7 @@ zoomabs(const Arg *arg)
{
xunloadfonts();
xloadfonts(usedfont, arg->f);
xloadsparefonts();
cresize(0, 0);
redraw();
xhints();
Expand Down Expand Up @@ -1062,6 +1065,101 @@ xloadfonts(const char *fontstr, double fontsize)
FcPatternDestroy(pattern);
}

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);
}
}

void
xunloadfont(Font *f)
{
Expand Down Expand Up @@ -1159,6 +1257,9 @@ xinit(int w, int h)
usedfont = (opt_font == NULL)? font : opt_font;
xloadfonts(usedfont, 0);

/* spare fonts */
xloadsparefonts();

/* colors */
xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
xloadcols();
Expand Down

0 comments on commit da94d9a

Please sign in to comment.