public inbox for cygwin-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent.
@ 2019-11-15 12:08 Corinna Vinschen
  0 siblings, 0 replies; only message in thread
From: Corinna Vinschen @ 2019-11-15 12:08 UTC (permalink / raw)
  To: cygwin-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=1626569222066ee601f6c41b29efcc95202674b7

commit 1626569222066ee601f6c41b29efcc95202674b7
Author: Takashi Yano <takashi.yano@nifty.ne.jp>
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);


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-11-15 12:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-15 12:08 [newlib-cygwin] Cygwin: pty: Trigger redraw screen if ESC[?3h or ESC[?3l is sent Corinna Vinschen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).