1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-23 07:19:15 +00:00

Fix face extension of overlay strings on buffer text with faces

* src/xdisp.c (face_at_pos): Reject the face returned by
'underlying_face_id' when we are filtering by face attribute,
and that attribute's value fails the filter test.  (Bug#38563)
This commit is contained in:
Eli Zaretskii 2019-12-12 13:16:46 +02:00
parent d57bb0c323
commit 6ee3675dad

View File

@ -4243,11 +4243,25 @@ 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. */
base_face_id = it->string_from_prefix_prop_p
? (!NILP (Vface_remapping_alist)
? lookup_basic_face (it->w, it->f, DEFAULT_FACE_ID)
: DEFAULT_FACE_ID)
: underlying_face_id (it);
bool use_default = (it->string_from_prefix_prop_p != 0);
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);
}
return face_at_string_position (it->w,