summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2019-11-13 19:49:29 +0900
committerCorinna Vinschen <corinna@vinschen.de>2019-11-15 13:07:40 +0100
commit1626569222066ee601f6c41b29efcc95202674b7 (patch)
treedce11a944fdb94eb0902e8b7e56cd6c84daddd79
parent8f8522c82a43c926119a5764ff009e4e5c26bbdf (diff)
downloadcygnal-1626569222066ee601f6c41b29efcc95202674b7.tar.gz
cygnal-1626569222066ee601f6c41b29efcc95202674b7.tar.bz2
cygnal-1626569222066ee601f6c41b29efcc95202674b7.zip
Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.
- 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
-rw-r--r--winsup/cygwin/fhandler_tty.cc22
1 files changed, 22 insertions, 0 deletions
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);