---
 winsup/cygwin/fhandler_tty.cc | 21 ++++++++++++++++++++-
 winsup/cygwin/tty.cc          |  1 +
 winsup/cygwin/tty.h           |  1 +
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index da6119dfb..163f93f35 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -1305,6 +1305,20 @@ fhandler_pty_slave::write (const void *ptr, size_t len)
   if (bg <= bg_eof)
     return (ssize_t) bg;
 
+  if (get_ttyp ()->need_clear_screen_on_write)
+    {
+      const char *term = getenv ("TERM");
+      if (term && strcmp (term, "dumb") && !strstr (term, "emacs") &&
+         wcsstr (myself->progname, L"\\usr\\sbin\\sshd.exe"))
+       {
+         /* FIXME: Clearing sequence may not be "^[[H^[[J"
+            depending on the terminal type. */
+         DWORD n;
+         WriteFile (get_output_handle_cyg (), "\033[H\033[J", 6, &n, NULL);
+       }
+      get_ttyp ()->need_clear_screen_on_write = false;
+    }
+
   termios_printf ("pty%d, write(%p, %lu)", get_minor (), ptr, len);
 
   push_process_state process_state (PID_TTYOU);
@@ -2668,7 +2682,12 @@ fhandler_pty_slave::fixup_after_attach (bool 
native_maybe, int fd_set)
          if (get_ttyp ()->num_pcon_attached_slaves == 0
              && !ALWAYS_USE_PCON)
            /* Assume this is the first process using this pty slave. */
-           get_ttyp ()->need_clear_screen = true;
+           {
+             if (wcsstr (myself->progname, L"\\usr\\sbin\\sshd.exe"))
+               get_ttyp ()->need_clear_screen_on_write = true;
+             else
+               get_ttyp ()->need_clear_screen = true;
+           }
 
          get_ttyp ()->num_pcon_attached_slaves ++;
        }
diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc
index 460153cdb..1595d0278 100644
--- a/winsup/cygwin/tty.cc
+++ b/winsup/cygwin/tty.cc
@@ -245,6 +245,7 @@ tty::init ()
   num_pcon_attached_slaves = 0;
   term_code_page = 0;
   need_clear_screen = false;
+  need_clear_screen_on_write = false;
 }
 
 HANDLE
diff --git a/winsup/cygwin/tty.h b/winsup/cygwin/tty.h
index 927d7afd9..c7aeef85b 100644
--- a/winsup/cygwin/tty.h
+++ b/winsup/cygwin/tty.h
@@ -106,6 +106,7 @@ private:
   int num_pcon_attached_slaves;
   UINT term_code_page;
   bool need_clear_screen;
+  bool need_clear_screen_on_write;
 
 public:
   HANDLE from_master () const { return _from_master; }
-- 
2.21.0

Reply via email to