Subject: bug#71163: Cursor can disappear off the window if no-special-glyphs is enabled

From: Eli Zaretskii <[email-masked]>
Date: Fri, 24 May 2024 10:20:19 +0300

> Date: Fri, 24 May 2024 00:42:29 -0400
> From: Emre Yolcu <[email-masked]>
> 
> If the layout parameter no-special-glyphs is enabled and a line is 
> exactly as wide as a window, then the cursor placed at the end of the 
> line disappears off the window. Steps to confirm after "emacs -Q":
> 
> 1. Evaluate the following:
> 
> (set-frame-parameter nil 'no-special-glyphs nil)

You must have meant

  (set-frame-parameter nil 'no-special-glyphs t)

Because nil is the default value of this frame parameter.

>  (fringe-mode 0)
>  (scroll-bar-mode -1)

The last part of disabling scroll-bars is not necessary, AFAICT.

> 2. Insert some line that is exactly as wide as the window, leaving the 
> cursor at the end of the line.
> 
> After those steps, the cursor is not visible. I'm not sure if this is 
> the intended behavior. I would expect the cursor to appear at the 
> beginning of the next screen line instead. If no-special-glyphs is not 
> enabled, then, as expected, the final character of the first screen line 
> is displayed as the continuation indicator "\", and the actual final 
> character of the line appears on the next screen line, with the cursor 
> after it.

I don't really understand how this was intended to behave, so I added
Martin who introduced this feature, in the hope that he could provide
the explanation of the intent.  This was added as part of support for
child frames, so I presume it has something to do with child frames,
but I don't really understand what exactly and why child frames would
need that.

AFAICT, this is currently broken in several ways:

  . it only has effect on GUI frames (basically, the code ignores this
    parameter on TTY frames), although the documentation doesn't say
    that, and I see no immediate reason why it wouldn't make sense on
    TTY frames;
  . it doesn't affect the display of fringe truncation and
    continuation bitmaps, although the documentation doesn't say that,
    either, and it is not clear to me that those bitmaps should be
    displayed in that case;
  . not only display of cursor in full-window lines is broken, but
    also the automatic horizontal scrolling (auto-hscroll-mode) in
    that case: the line is not hscrolled until you type one more
    character beyond those visible;
  . if you insert a TAB near the end of a screen line such that the
    next tab stop is on the next screen line, the TAB is shown with
    wrong number of columns, as if the next tab stop is at column zero
    of the next screen line.

The last 2 points, and the report that started this bug discussion,
are because the logic of line-continuation and truncation is basically
broken in this case: the layout code thinks the continuation and
truncation glyphs are inserted when needed, whereas they are not.
That's because the layout code was not adapted to this frame
parameter, only the geometry of the screen line was adjusted.

Fixing this will take a while.  But first we need to understand and
agree on the scope of support for this frame parameter, and what Emacs
should do in each supported case.

Thanks.