From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 98652 invoked by alias); 15 Nov 2019 12:08:39 -0000 Mailing-List: contact cygwin-cvs-help@cygwin.com; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cygwin-cvs-owner@cygwin.com Received: (qmail 98624 invoked by uid 9078); 15 Nov 2019 12:08:39 -0000 Date: Fri, 15 Nov 2019 12:08:00 -0000 Message-ID: <20191115120839.98622.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent. X-Act-Checkin: newlib-cygwin X-Git-Author: Takashi Yano X-Git-Refname: refs/heads/master X-Git-Oldrev: 8f8522c82a43c926119a5764ff009e4e5c26bbdf X-Git-Newrev: 1626569222066ee601f6c41b29efcc95202674b7 X-SW-Source: 2019-q4/txt/msg00030.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=1626569222066ee601f6c41b29efcc95202674b7 commit 1626569222066ee601f6c41b29efcc95202674b7 Author: Takashi Yano Date: Wed Nov 13 19:49:29 2019 +0900 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 Diff: --- 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 e02a8f4..f9c7c3a 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);