Created
September 4, 2019 06:28
-
-
Save qstrahl/51ddfb29c842c6f88a79471900bc1507 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/cachedGCs.c b/cachedGCs.c | |
index 8393478..f0088b1 100644 | |
--- a/cachedGCs.c | |
+++ b/cachedGCs.c | |
@@ -500,7 +500,7 @@ setCgsCSet(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, unsigned cset) | |
#endif | |
void | |
-setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font) | |
+setCgsFont2(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font, VTFontEnum which) | |
{ | |
CgsCache *me; | |
@@ -514,7 +514,7 @@ setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font) | |
font = getIconicFont(screen); | |
else | |
#endif | |
- font = GetNormalFont(screen, fNorm); | |
+ font = GetNormalFont(screen, which); | |
} | |
if (HaveFont(font) && okFont(font->fs)) { | |
TRACE2(("setCgsFont next: %s for %s slot %p, gc %p\n", | |
@@ -531,6 +531,12 @@ setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font) | |
} | |
} | |
+void | |
+setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font) | |
+{ | |
+ setCgsFont2(xw, cgsWin, cgsId, font, fNorm); | |
+} | |
+ | |
/* | |
* Discard all of the font information, e.g., we are resizing the font. | |
* Keep the GC's so we can simply change them rather than creating new ones. | |
diff --git a/fontutils.c b/fontutils.c | |
index 50eb7d8..31f5f91 100644 | |
--- a/fontutils.c | |
+++ b/fontutils.c | |
@@ -1132,14 +1132,14 @@ xtermUpdateFontGCs(XtermWidget xw, Bool italic) | |
setCgsFont(xw, win, gcNorm, myfunc(screen, fNorm)); | |
copyCgs(xw, win, gcBold, gcNorm); | |
- setCgsFont(xw, win, gcBold, myfunc(screen, fBold)); | |
+ setCgsFont2(xw, win, gcBold, myfunc(screen, fBold), fBold); | |
setCgsFore(xw, win, gcNormReverse, new_revers); | |
setCgsBack(xw, win, gcNormReverse, new_normal); | |
setCgsFont(xw, win, gcNormReverse, myfunc(screen, fNorm)); | |
copyCgs(xw, win, gcBoldReverse, gcNormReverse); | |
- setCgsFont(xw, win, gcBoldReverse, myfunc(screen, fBold)); | |
+ setCgsFont2(xw, win, gcBoldReverse, myfunc(screen, fBold), fBold); | |
if_OPT_WIDE_CHARS(screen, { | |
XTermFonts *wide_xx = myfunc(screen, fWide); | |
@@ -1856,6 +1856,7 @@ xtermCopyFontLists(XtermWidget xw, VTFontList * target, VTFontList * source) | |
COPY_IT(fontBold, list_b); | |
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE | |
COPY_IT(fontItal, list_i); | |
+ COPY_IT(fontBtal, list_bi); | |
#endif | |
#if OPT_WIDE_CHARS | |
COPY_IT(wideFont, list_w); | |
@@ -2990,6 +2991,7 @@ xtermComputeFontInfo(XtermWidget xw, | |
XTermXftFonts norm = screen->renderFontNorm[fontnum]; | |
XTermXftFonts bold = screen->renderFontBold[fontnum]; | |
XTermXftFonts ital = screen->renderFontItal[fontnum]; | |
+ XTermXftFonts btal = screen->renderFontBtal[fontnum]; | |
#if OPT_RENDERWIDE | |
XTermXftFonts wnorm = screen->renderWideNorm[fontnum]; | |
XTermXftFonts wbold = screen->renderWideBold[fontnum]; | |
@@ -3035,6 +3037,11 @@ xtermComputeFontInfo(XtermWidget xw, | |
XFT_SLANT, XftTypeInteger, XFT_SLANT_ITALIC, \ | |
XFT_CHAR_WIDTH, XftTypeInteger, norm.font->max_advance_width | |
+#define BtalXftPattern(norm) \ | |
+ XFT_WEIGHT, XftTypeInteger, XFT_WEIGHT_BOLD, \ | |
+ XFT_SLANT, XftTypeInteger, XFT_SLANT_ITALIC, \ | |
+ XFT_CHAR_WIDTH, XftTypeInteger, norm.font->max_advance_width | |
+ | |
#if OPT_WIDE_ATTRS | |
#define HAVE_ITALICS 1 | |
#define FIND_ITALICS ((pat = XftNameParse(face_name)) != 0) | |
@@ -3069,6 +3076,12 @@ xtermComputeFontInfo(XtermWidget xw, | |
ItalXftPattern(norm), | |
(void *) 0); | |
OPEN_XFT(ital, "italic"); | |
+ btal.pattern = XftPatternDuplicate(pat); | |
+ XftPatternBuild(btal.pattern, | |
+ NormXftPattern, | |
+ BtalXftPattern(norm), | |
+ (void *) 0); | |
+ OPEN_XFT(btal, "bold-italic"); | |
} | |
#endif | |
@@ -3110,6 +3123,18 @@ xtermComputeFontInfo(XtermWidget xw, | |
failed = 0; | |
CACHE_XFT(screen->renderFontItal, ital); | |
} | |
+ CACHE_XFT(screen->renderFontBtal, btal); | |
+ if (norm.font != 0 && !btal.font) { | |
+ xtermWarning("did not find a usable bold italic TrueType font\n"); | |
+ XftPatternDestroy(btal.pattern); | |
+ btal.pattern = XftPatternDuplicate(pat); | |
+ XftPatternBuild(btal.pattern, | |
+ NormXftPattern, | |
+ (void *) 0); | |
+ OPEN_XFT(btal, "bold-italics"); | |
+ failed = 0; | |
+ CACHE_XFT(screen->renderFontBtal, btal); | |
+ } | |
#endif | |
XftPatternDestroy(pat); | |
} else { | |
@@ -3214,6 +3239,7 @@ xtermComputeFontInfo(XtermWidget xw, | |
setRenderFontsize(xw, win, norm.font, NULL); | |
setRenderFontsize(xw, win, bold.font, "bold"); | |
setRenderFontsize(xw, win, ital.font, "ital"); | |
+ setRenderFontsize(xw, win, btal.font, "btal"); | |
#if OPT_BOX_CHARS | |
setupPackedFonts(xw); | |
@@ -3810,6 +3836,7 @@ findXftGlyph(XtermWidget xw, XftFont *given, unsigned wc) | |
offsetof(TScreen, renderFontNorm), | |
offsetof(TScreen, renderFontBold), | |
offsetof(TScreen, renderFontItal), | |
+ offsetof(TScreen, renderFontBtal), | |
#if OPT_RENDERWIDE | |
offsetof(TScreen, renderWideNorm), | |
offsetof(TScreen, renderWideBold), | |
@@ -4751,6 +4778,9 @@ save2FontList(XtermWidget xw, | |
case fItal: | |
list = &(target->list_i); | |
break; | |
+ case fBtal: | |
+ list = &(target->list_bi); | |
+ break; | |
#endif | |
#if OPT_WIDE_CHARS | |
case fWide: | |
@@ -4988,6 +5018,9 @@ freeFontLists(VTFontList * lists) | |
case fItal: | |
target = &(lists->list_i); | |
break; | |
+ case fBtal: | |
+ target = &(lists->list_bi); | |
+ break; | |
#endif | |
#if OPT_WIDE_CHARS | |
case fWide: | |
@@ -5070,6 +5103,9 @@ getMyXftFont(XtermWidget xw, int which, int fontnum) | |
case fItal: | |
result = &(screen->renderFontItal[fontnum]); | |
break; | |
+ case fBtal: | |
+ result = &(screen->renderFontBtal[fontnum]); | |
+ break; | |
#endif | |
#if OPT_WIDE_CHARS | |
case fWide: | |
@@ -5110,6 +5146,7 @@ whichFontEnum(VTFontEnum value) | |
DATA(fBold); | |
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE | |
DATA(fItal); | |
+ DATA(fBtal); | |
#endif | |
#if OPT_WIDE_CHARS | |
DATA(fWide); | |
@@ -5148,6 +5185,7 @@ whichFontList2s(VTFontList * list, char **value) | |
DATA(list_b); | |
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE | |
DATA(list_i); | |
+ DATA(list_bi); | |
#endif | |
#if OPT_WIDE_CHARS | |
DATA(list_w); | |
diff --git a/ptyx.h b/ptyx.h | |
index fc4cda9..ca2287b 100644 | |
--- a/ptyx.h | |
+++ b/ptyx.h | |
@@ -885,6 +885,7 @@ typedef enum { | |
, fBold /* bold font */ | |
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE | |
, fItal /* italic font */ | |
+ , fBtal /* bold-italic font */ | |
#endif | |
#if OPT_WIDE_CHARS | |
, fWide /* double-width font */ | |
@@ -2121,6 +2122,7 @@ typedef struct { | |
char *f_b; /* the bold font */ | |
#if OPT_WIDE_ATTRS | |
char *f_i; /* italic font (Xft only) */ | |
+ char *f_bi; /* bold-italic font (Xft only) */ | |
#endif | |
#if OPT_WIDE_CHARS | |
char *f_w; /* the normal wide font */ | |
@@ -2134,6 +2136,7 @@ typedef struct { | |
char **list_b; /* the bold font */ | |
#if OPT_WIDE_ATTRS || OPT_RENDERWIDE | |
char **list_i; /* italic font (Xft only) */ | |
+ char **list_bi; /* bold-italic font (Xft only) */ | |
#endif | |
#if OPT_WIDE_CHARS | |
char **list_w; /* the normal wide font */ | |
@@ -2735,6 +2738,7 @@ typedef struct { | |
XTermXftFonts renderFontNorm[NMENUFONTS]; | |
XTermXftFonts renderFontBold[NMENUFONTS]; | |
XTermXftFonts renderFontItal[NMENUFONTS]; | |
+ XTermXftFonts renderFontBtal[NMENUFONTS]; | |
#if OPT_RENDERWIDE | |
XTermXftFonts renderWideNorm[NMENUFONTS]; | |
XTermXftFonts renderWideBold[NMENUFONTS]; | |
diff --git a/util.c b/util.c | |
index 7623efa..da53d14 100644 | |
--- a/util.c | |
+++ b/util.c | |
@@ -2944,8 +2944,14 @@ getNormXftFont(XtermWidget xw, | |
#if OPT_ISO_COLORS | |
&& !screen->colorITMode | |
#endif | |
- && XFT_FONT(fItal)) { | |
- font = XFT_FONT(fItal); | |
+ ) { | |
+ if ((attr_flags & BOLDATTR(screen)) | |
+ && UseBoldFont(screen) | |
+ && XFT_FONT(fBtal)) { | |
+ font = XFT_FONT(fBtal); | |
+ } else if (XFT_FONT(fItal)) { | |
+ font = XFT_FONT(fItal); | |
+ } | |
} else | |
#endif | |
#if OPT_ISO_COLORS | |
diff --git a/xterm.h b/xterm.h | |
index 89a4482..5e3d29a 100644 | |
--- a/xterm.h | |
+++ b/xterm.h | |
@@ -930,6 +930,7 @@ extern void redoCgs(XtermWidget /*xw*/, Pixel /*fg*/, Pixel /*bg*/, CgsEnum /*cg | |
extern void setCgsBack(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, Pixel /*bg*/); | |
extern void setCgsCSet(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, unsigned /*cset*/); | |
extern void setCgsFont(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, XTermFonts * /*font*/); | |
+extern void setCgsFont2(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, XTermFonts * /*font*/, unsigned /*which*/); | |
extern void setCgsFore(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*cgsId*/, Pixel /*fg*/); | |
extern void swapCgs(XtermWidget /*xw*/, VTwin * /*cgsWin*/, CgsEnum /*dstCgsId*/, CgsEnum /*srcCgsId*/); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment