Subject: Re: bug#79275: 30.2.50; overlay line-prefix display property fighting with text display property

From: Eli Zaretskii <[email-masked]>
Date: Fri, 22 Aug 2025 09:49:04 +0300

> From: "J.D. Smith" <[email-masked]>
> Cc: [email-masked]
> Date: Thu, 21 Aug 2025 15:46:03 -0400
> 
> Eli Zaretskii <[email-masked]> writes:
> 
> > Please try the patch below, I hope it fixes both of the situations you
> > described.
> 
> Your latest patch indeed fixes this display conflict between overlays
> and text properties at both the front of a fringe-displaying overlay and
> in its middle.  The code I used to test:
> 
>    ;; Insert at least 4 blank lines above this and evaluate
>    (progn
>      (delete-all-overlays)
>      (let ((ov (make-overlay 1 5)))
>        (overlay-put ov 'line-prefix (propertize "SHOULDNOTSEETHIS" 'display
>    				     '(left-fringe right-triangle success))))
>      (put-text-property 1 2 'display ">testing front-fringe display\n")
>      (put-text-property 3 4 'display ">testing mid-fringe display\n"))   
> 
> Thanks very much for your work on this.  I know how challenging it can
> be to hunt down subtle bugs in the redisplay code.  I appreciate all the
> time and energy you volunteer to continuously improve Emacs.

Thanks for testing.  I will run a few more tests before installing
this: as you could see, this bug revealed a couple of serious design
blunders in how line/wrap-prefix was implemented, so I'd like to make
sure the changes didn't break anything.

What astonished me the most was the use of it->object to decide
whether we iterate a buffer or a string, something that I learned long
ago (and forgot) to be a very bad idea, see this comment in
dispextern.h:

     Do NOT use !BUFFERP (it.object) as a test whether we are
     iterating over a string; use STRINGP (it.string) instead.