summaryrefslogtreecommitdiff
path: root/src/ftfont.c
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2022-05-19 20:10:19 +0800
committerPo Lu <luangruo@yahoo.com>2022-05-19 20:10:19 +0800
commitc15430997679fced7ef6adc23cbc59d0cfa3d625 (patch)
tree43b014a1790c32856e815d5d516b050a442aade7 /src/ftfont.c
parent0a4d9f26ee9b24ecf0a8b1fb14d4b4bab5daa3ae (diff)
downloademacs-c15430997679fced7ef6adc23cbc59d0cfa3d625.tar.gz
Whitelist some incorrectly labeled "color" fonts under Xft
* etc/PROBLEMS: Document problem with fonts incorrectly labeled as color fonts under Xft. * src/ftfont.c (xft_color_font_whitelisted_p): New function. (ftfont_spec_pattern, ftfont_list): Respect whitelisting of "color" fonts under Xft. * src/xftfont.c (syms_of_xftfont): New variable `xft-color-font-whitelist'.
Diffstat (limited to 'src/ftfont.c')
-rw-r--r--src/ftfont.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/ftfont.c b/src/ftfont.c
index 5797300d231..301a145b7ac 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -645,8 +645,29 @@ ftfont_get_open_type_spec (Lisp_Object otf_spec)
return spec;
}
+#if defined HAVE_XFT && defined FC_COLOR
+static bool
+xft_color_font_whitelisted_p (const char *family)
+{
+ Lisp_Object tem, name;
+
+ tem = Vxft_color_font_whitelist;
+
+ FOR_EACH_TAIL_SAFE (tem)
+ {
+ name = XCAR (tem);
+
+ if (STRINGP (name) && !strcmp (family, SSDATA (name)))
+ return true;
+ }
+
+ return false;
+}
+#endif
+
static FcPattern *
-ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **otspec, const char **langname)
+ftfont_spec_pattern (Lisp_Object spec, char *otlayout,
+ struct OpenTypeSpec **otspec, const char **langname)
{
Lisp_Object tmp, extra;
FcPattern *pattern = NULL;
@@ -785,6 +806,8 @@ ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **ots
/* We really don't like color fonts, they cause Xft crashes. See
Bug#30874. */
if (xft_ignore_color_fonts
+ && (NILP (AREF (spec, FONT_FAMILY_INDEX))
+ || NILP (Vxft_color_font_whitelist))
&& ! FcPatternAddBool (pattern, FC_COLOR, FcFalse))
goto err;
#endif
@@ -930,7 +953,12 @@ ftfont_list (struct frame *f, Lisp_Object spec)
returns them even when it shouldn't really do so, so we
need to manually skip them here (Bug#37786). */
FcBool b;
+ FcChar8 *str;
+
if (xft_ignore_color_fonts
+ && (FcPatternGetString (fontset->fonts[i], FC_FAMILY,
+ 0, &str) != FcResultMatch
+ || !xft_color_font_whitelisted_p ((char *) str))
&& FcPatternGetBool (fontset->fonts[i], FC_COLOR, 0, &b)
== FcResultMatch && b != FcFalse)
continue;