This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
[PATCH] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.
- From: Takashi Yano <takashi dot yano at nifty dot ne dot jp>
- To: cygwin-patches at cygwin dot com
- Cc: Takashi Yano <takashi dot yano at nifty dot ne dot jp>
- Date: Wed, 13 Nov 2019 19:49:29 +0900
- Subject: [PATCH] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.
- Dkim-filter: OpenDKIM Filter v2.10.3 conuserg-03.nifty.com xADAnXqe027699
- 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