From dd3f2130cf2977cff79101e72cff0b433df1c1c6 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 13 Dec 2019 12:29:05 +0200 Subject: [PATCH] A better fix for extension of overlay string's faces * src/xdisp.c (face_at_pos): Revert previous change that rejected the underlying face if it failed the filtering criteria. * src/xfaces.c (face_at_string_position): Reset the base face's attribute used for filtering faces if the attribute is t. (Bug#38563) --- src/xdisp.c | 25 +++++-------------------- src/xfaces.c | 4 ++++ 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index bb370bbb78f..4ddde1be717 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -4243,26 +4243,11 @@ face_at_pos (const struct it *it, enum lface_attribute_index attr_filter) the display string do. This sounds like a design bug, but Emacs always did that since v21.1, so changing that might be a big deal. */ - bool use_default = (it->string_from_prefix_prop_p != 0); - base_face_id = DEFAULT_FACE_ID; - if (!use_default) - { - base_face_id = underlying_face_id (it); - /* Reject the underlying face, if that face is different - from the iterator face, and we filter by attr_filter, - and that face's value of the filter attribute is nil - or unspecified; use the default face instead. */ - struct face *bf = FACE_FROM_ID_OR_NULL (it->f, base_face_id); - if (base_face_id != it->base_face_id - && attr_filter > 0 - && (NILP (bf->lface[attr_filter]) - || EQ (bf->lface[attr_filter], Qunspecified))) - use_default = true; - } - if (use_default) - base_face_id = (!NILP (Vface_remapping_alist) - ? lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID) - : DEFAULT_FACE_ID); + base_face_id = it->string_from_display_prop_p + ? (!NILP (Vface_remapping_alist) + ? lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID) + : DEFAULT_FACE_ID) + : underlying_face_id (it); } return face_at_string_position (it->w, diff --git a/src/xfaces.c b/src/xfaces.c index 54b5f4a94a4..5c347d41e30 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -6445,6 +6445,10 @@ face_at_string_position (struct window *w, Lisp_Object string, /* Begin with attributes from the base face. */ memcpy (attrs, base_face->lface, sizeof attrs); + /* Reset the attribute of the base face used as the filter, because + otherwise there's no way for faces to be merged to countermand that. */ + if (EQ (attrs[attr_filter], Qt)) + attrs[attr_filter] = Qnil; /* Merge in attributes specified via text properties. */ if (!NILP (prop)) -- 2.39.2