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
This commit is contained in:
Takashi Yano 2019-11-13 19:49:29 +09:00 committed by Corinna Vinschen
parent 8f8522c82a
commit 1626569222
1 changed files with 22 additions and 0 deletions

View File

@ -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);