--- 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