On Tue, 16 Dec 2025 13:28:52 +0100
Corinna Vinschen wrote:
> On Dec 10 10:52, Takashi Yano wrote:
> > In Windows 11, the command "rlwrap cmd" outputs garbaged screen.
> > This is because rlwrap treats text between NLs as a line, while
> > pseudo console sometimes ommits NL before "CISm;nH". This issue
>
> CSI
>
> > does not happen in Windows 10. This patch fixes the issue.
> >
> > Reviewed-by:
> > Signed-off-by: Takashi Yano <[email protected]>
> > ---
> > winsup/cygwin/fhandler/pty.cc | 34 ++++++++++++++++++++++++++++++++++
> > 1 file changed, 34 insertions(+)
> >
> > diff --git a/winsup/cygwin/fhandler/pty.cc b/winsup/cygwin/fhandler/pty.cc
> > index 3b0b4f073..5c02a4111 100644
> > --- a/winsup/cygwin/fhandler/pty.cc
> > +++ b/winsup/cygwin/fhandler/pty.cc
> > @@ -2775,6 +2775,40 @@ fhandler_pty_master::pty_master_fwd_thread (const
> > master_fwd_thread_param_t *p)
> > else
> > state = 0;
> >
> > + /* Workaround for rlwrap */
>
> I think the comment should mention that this is necessary since W11
> only. And maybe the code should only run on systems needing it?
Yes.
> Is that a problem in W11 conhost which has been fixed in OpenConsole
> already, by any chance?
Yes.
> If so, that would be a good indicator for
> always including a self-built OpenConsole package into our distro...
Maybe. I don't try to build OpenConsole in cygwin environment yet...
> > + /* rlwarp treats text between NLs as a line, however,
>
> rlwrap
>
> > + pseudo console somtimes ommits NL before "CSIm;nH". */
> > + state = 0;
> > + for (DWORD i = 0; i < rlen; i++)
> > + if (state == 0 && outbuf[i] == '\033')
> > + {
> > + start_at = i;
> > + state++;
> > + continue;
> > + }
> > + else if (state == 1 && outbuf[i] == '[')
> > + {
> > + state++;
> > + continue;
> > + }
> > + else if (state == 2 && (isdigit (outbuf[i]) || outbuf[i] == ';'))
> > + continue;
> > + else if (state == 2 && outbuf[i] == 'H')
> > + {
> > + /* Add "CSI H" before CR NL to avoid unexpected scroll */
> > + const char *ins = "\033[H\r\n";
> > + const int ins_len = strlen (ins);
> > + memmove (&outbuf[start_at + ins_len], &outbuf[start_at],
> > + rlen - start_at);
> > + memcpy (&outbuf[start_at], ins, ins_len);
> > + rlen += ins_len;
> > + i += ins_len;
> > + state = 0;
> > + continue;
>
> I don't understand this code. The commit message says, the pseudo
> console omits NL before CSI H, so I would expect this code to add a
> missing NL. But instead it adds a CSI H? What am I missing?
'\r\n' is added. CSI H is added in order to avoid extra scrolling when
the cursor is on bottom-most line.
After "CSI H \r\n", CSI m;nH will come, so CSI H does not change the
screen.
--
Takashi Yano <[email protected]>