Hi Takashi,

On Nov 13 19:49, Takashi Yano wrote:
> - Pseudo console clears console screen buffer if ESC[?3h or ESC[?3l
>   is sent. However, xterm/vt100 does not clear screen. This cause

This is only correct if xterm hasn't been started with the c132 widget
resource set to 'true'.  This resource specifies whether the ESC[?3h
and ESC[?3l ESC sequences are honored or not.  The default is 'false'.

However, if you specify the c132 resource, or if you start xterm
with the commandline option -132, it will resize when these sequences
are sent.  And here's the joke: The resize also clears the screen
in xterm.

My question now is, does this change anything in terms of the below
code, or is it still valid as is?


Thanks,
Corinna


>   mismatch between real screen and console screen buffer. Therefore,
>   this patch triggers redraw screen in that situation so that the
>   synchronization is done on the next execution of native app.
>   This solves the problem reported in:
>   https://www.cygwin.com/ml/cygwin-patches/2019-q4/msg00116.html
> ---
>  winsup/cygwin/fhandler_tty.cc | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
> index e02a8f43b..f9c7c3ade 100644
> --- a/winsup/cygwin/fhandler_tty.cc
> +++ b/winsup/cygwin/fhandler_tty.cc
> @@ -1255,6 +1255,28 @@ fhandler_pty_slave::push_to_pcon_screenbuffer (const 
> char *ptr, size_t len)
>        memmove (p0, p0+4, nlen - (p0+4 - buf));
>        nlen -= 4;
>      }
> +
> +  /* If the ESC sequence ESC[?3h or ESC[?3l which clears console screen
> +     buffer is pushed, set need_redraw_screen to trigger redraw screen. */
> +  p0 = buf;
> +  while ((p0 = (char *) memmem (p0, nlen - (p0 - buf), "\033[?", 3)))
> +    {
> +      p0 += 3;
> +      while (p0 < buf + nlen && *p0 != 'h' && *p0 != 'l')
> +     {
> +       int arg = 0;
> +       while (p0 < buf + nlen && isdigit (*p0))
> +         arg = arg * 10 + (*p0 ++) - '0';
> +       if (arg == 3)
> +         get_ttyp ()->need_redraw_screen = true;
> +       if (p0 < buf + nlen && *p0 == ';')
> +         p0 ++;
> +     }
> +      p0 ++;
> +      if (p0 >= buf + nlen)
> +     break;
> +    }
> +
>    DWORD dwMode, flags;
>    flags = ENABLE_VIRTUAL_TERMINAL_PROCESSING;
>    GetConsoleMode (get_output_handle (), &dwMode);
> -- 
> 2.21.0

-- 
Corinna Vinschen
Cygwin Maintainer

Attachment: signature.asc
Description: PGP signature

Reply via email to