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

From: Eli Zaretskii <[email-masked]>
Date: Sat, 23 Aug 2025 11:38:56 +0300

> Cc: [email-masked]
> Date: Fri, 22 Aug 2025 09:49:04 +0300
> From: Eli Zaretskii <[email-masked]>
> 
> > 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.
> 

The fix is now installed on the master branch.  Closing the bug.