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)
This commit is contained in:
parent
9eaad4de02
commit
dd3f2130cf
2 changed files with 9 additions and 20 deletions
25
src/xdisp.c
25
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,
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Add table
Reference in a new issue