]> git.eshelyaron.com Git - emacs.git/commitdiff
A better fix for extension of overlay string's faces
authorEli Zaretskii <eliz@gnu.org>
Fri, 13 Dec 2019 10:29:05 +0000 (12:29 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 13 Dec 2019 10:29:05 +0000 (12:29 +0200)
* 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
src/xfaces.c

index bb370bbb78fd34cc5f17b49e3e68e06e02ba330f..4ddde1be717ca967d104c792d1108d965bef5758 100644 (file)
@@ -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,
index 54b5f4a94a42c27eb732cb1c7d9e4f17b107ddfb..5c347d41e30388779b367f74b563f50bbe9d8b1c 100644 (file)
@@ -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))