Fix face merging at EOL when inherited face specifies :extend

* src/xfaces.c (merge_face_ref): Handle correctly faces that
inherit from another, and in addition specify :extend.
(Bug#42552)

(cherry picked from commit 39c90f8dfa)
This commit is contained in:
Eli Zaretskii 2020-08-11 17:39:35 +03:00
parent f946e48bf5
commit c9a739408d

View file

@ -2394,6 +2394,7 @@ merge_face_ref (struct window *w,
{
bool ok = true; /* Succeed without an error? */
Lisp_Object filtered_face_ref;
bool attr_filter_passed = false;
filtered_face_ref = face_ref;
do
@ -2490,6 +2491,7 @@ merge_face_ref (struct window *w,
|| UNSPECIFIEDP (scratch_attrs[attr_filter]))
return true;
}
attr_filter_passed = true;
}
while (CONSP (face_ref) && CONSP (XCDR (face_ref)))
{
@ -2653,9 +2655,21 @@ merge_face_ref (struct window *w,
{
/* This is not really very useful; it's just like a
normal face reference. */
if (! merge_face_ref (w, f, value, to,
err_msgs, named_merge_points,
attr_filter))
if (attr_filter_passed)
{
/* We already know that this face was tested
against attr_filter and was found applicable,
so don't pass attr_filter to merge_face_ref.
This is for when a face is specified like
(:inherit FACE :extend t), but the parent
FACE itself doesn't specify :extend. */
if (! merge_face_ref (w, f, value, to,
err_msgs, named_merge_points, 0))
err = true;
}
else if (! merge_face_ref (w, f, value, to,
err_msgs, named_merge_points,
attr_filter))
err = true;
}
else if (EQ (keyword, QCextend))