[PATCH] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.

Takashi Yano
- Pseudo console clears console screen buffer if ESC[?3h or ESC[?3l
  is sent. However, xterm/vt100 does not clear screen. This cause
  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

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.

Corinna Vinschen-2
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

signature.asc (849 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.

Corinna Vinschen-2
On Nov 14 10:35, Corinna Vinschen wrote:
> 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

Btw., this is not pseudo console behaviour per se, but the standard
behaviour of the new Windows console with VT ESC sequences turned on.
You can try this in a normal console under Cygwin.  It will clear the
screen after ESC[?3h, but it won't actually resize the console to switch
into 132 column mode.

This probably won't matter much for the problem at hand, I'm just
writing this so this is mentioned somewhere searchable.


Corinna


>
> 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
> [...]
--
Corinna Vinschen
Cygwin Maintainer

signature.asc (849 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.

Takashi Yano
In reply to this post by Corinna Vinschen-2
Hi Corinna,

On Thu, 14 Nov 2019 10:35:41 +0100
Corinna Vinschen wrote:
> 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.

Thanks for the information.

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

It still valid as is. Bacause, if -132 option is specified and the
real sreen is cleared by ESC[?3h and ESC[?3l, mismatch does not occur.
In this case, this patch tries to synchronize the real screen with
the console screen buffer in spite that they are already synchronized,
but there should be no side effects.

--
Takashi Yano <[hidden email]>
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.

Corinna Vinschen-2
On Nov 14 20:51, Takashi Yano wrote:

> Hi Corinna,
>
> On Thu, 14 Nov 2019 10:35:41 +0100
> Corinna Vinschen wrote:
> > 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.
>
> Thanks for the information.
>
> > My question now is, does this change anything in terms of the below
> > code, or is it still valid as is?
>
> It still valid as is. Bacause, if -132 option is specified and the
> real sreen is cleared by ESC[?3h and ESC[?3l, mismatch does not occur.
> In this case, this patch tries to synchronize the real screen with
> the console screen buffer in spite that they are already synchronized,
> but there should be no side effects.
Great, thanks.  Patch pushed.


Thanks,
Corinna

--
Corinna Vinschen
Cygwin Maintainer

signature.asc (849 bytes) Download Attachment