Subject: bug#66128: 28.2; visible-bell breaks setterm --inversescreen on

From: Thomas Dickey <[email-masked]>
Date: Sun, 24 Sep 2023 20:07:03 -0400

On Sat, Sep 23, 2023 at 08:38:53AM +0300, Eli Zaretskii wrote:
> > From: Tomas Hlavaty <[email-masked]>
> > Cc: [email-masked]
> > Date: Fri, 22 Sep 2023 22:18:14 +0200
> > 
> > On Thu 21 Sep 2023 at 08:00, Eli Zaretskii <[email-masked]> wrote:
> > > Emacs just sends to the terminal the sequence defined by the "vb"
> > > termcap capability.  Is that not correct when the screen colors are
> > > inverted?
> > 
> > I do not know.
> > 
> > > Is this perhaps the problem of the terminal?
> > 
> > No, I get the same behaviour in xfce4-terminal and kitty, so this does
> > not seem to be specific problem with the linux console.
> > 
> > I think I wrote it in the bug report too, under an X based terminal:
> > 
> >    $ emacs -nw -Q --eval '(setq visible-bell t)'
> > 
> > then press PgUp.
> > 
> > > Btw, we always use the termcap's "vb", even when terminfo is
> > > available; should we use the terminfo's "flash" instead?
> > 
> > I do not know.
> 
> Thomas, could you perhaps help us out here?  This is about sending the
> "visible bell" sequence to a terminal after "setterm --inversescreen on".
> The original report is:
> 
>     $ setterm --inversescreen on

setterm doesn't have any special way of manipulating the terminal -
it uses the same escape sequences that emacs would

>     $ emacs -Q --eval '(setq visible-bell t)'
> 
>   Then in Emacs do something that causes a bell, like try moving beyond
>   the buffer's end.  This causes the Emacs background to become white,
>   i.e. the visible-bell somehow countermands the inversescreen state.
> 
> Can you think of any reason for this behavior?  Do terminals honor

https://github.com/util-linux/util-linux/blob/master/term-utils/setterm.c

https://github.com/util-linux/util-linux/blob/1e0ad14b3ac08d855cda6de346a65f9b834e00db/term-utils/setterm.c#L1005

	/* -inversescreen [on|off]. */
	if (ctl->opt_inversescreen)
		fputs(ctl->opt_invsc_on ? "\033[?5h" : "\033[?5l", stdout);

man console_codes

       ESC [ ? 5 h
              DECSCNM (default off): Set reverse-video mode.

but visual-bell can be the same thing

The "vb" termcap capability is found with "man 5 terminfo"

          flash_screen                flash     vb     visible bell (may
                                                       not move cursor)

to be "flash" in terminfo,
and "infocmp linux" shows

	flash=\E[?5h$<200/>\E[?5l,

which is to say,
	turn reverse-video on
	wait 200 milliseconds
	turn reverse-video off

> inversescreen when they perform the visible-bell function?  Emacs just
> sends the sequence reported by the "vb" termcap capability of the
> terminal when the visible-bell is triggered.
> 
> Thanks.

-- 
Thomas E. Dickey <[email-masked]>
https://invisible-island.net