From dd8cfb0e061160676a07d283aaf66a52103d88a3 Mon Sep 17 00:00:00 2001 From: bagajjal Date: Sat, 25 Mar 2017 00:07:30 -0700 Subject: [PATCH] fixed the console scroll down issue https://github.com/PowerShell/Win32-OpenSSH/issues/585 --- contrib/win32/win32compat/console.c | 27 +++++++++++++++++++++------ contrib/win32/win32compat/console.h | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/contrib/win32/win32compat/console.c b/contrib/win32/win32compat/console.c index 7ec2eeb43..1284277d5 100644 --- a/contrib/win32/win32compat/console.c +++ b/contrib/win32/win32compat/console.c @@ -140,7 +140,7 @@ ConEnterRawMode(DWORD OutputHandle, BOOL fSmartInit) SavedViewRect = csbi.srWindow; debug("console doesn't support the ansi parsing"); } else { - ConMoveCurosorTop(csbi); + ConMoveCursorTop(csbi); debug("console supports the ansi parsing"); } @@ -1075,16 +1075,27 @@ ConScrollUp(int topline, int botline) ); } -void +void ConMoveVisibleWindow(int offset) { CONSOLE_SCREEN_BUFFER_INFO consoleInfo; SMALL_RECT visibleWindowRect; if (GetConsoleScreenBufferInfo(hOutputConsole, &consoleInfo)) { - memcpy(&visibleWindowRect, &consoleInfo.srWindow, sizeof(visibleWindowRect)); - visibleWindowRect.Top += offset; - visibleWindowRect.Bottom += offset; + /* Check if applying the offset results in console buffer overflow. + * if yes, then scrolldown the console buffer. + */ + if ((consoleInfo.srWindow.Bottom + offset) >= (consoleInfo.dwSize.Y - 1)) { + for (int i = 0; i < offset; i++) + ConScrollDown(0, consoleInfo.dwSize.Y - 1); + + if (GetConsoleScreenBufferInfo(hOutputConsole, &consoleInfo)) + memcpy(&visibleWindowRect, &consoleInfo.srWindow, sizeof(visibleWindowRect)); + } else { + memcpy(&visibleWindowRect, &consoleInfo.srWindow, sizeof(visibleWindowRect)); + visibleWindowRect.Top += offset; + visibleWindowRect.Bottom += offset; + } SetConsoleWindowInfo(hOutputConsole, TRUE, &visibleWindowRect); } @@ -1552,8 +1563,12 @@ ConSaveWindowsState() } void -ConMoveCurosorTop(CONSOLE_SCREEN_BUFFER_INFO csbi) +ConMoveCursorTop(CONSOLE_SCREEN_BUFFER_INFO csbi) { + /* Windows server at first sends the "cls" after the connection is established. + * Since we don't want to loose any data on the console, we would like to scroll down + * the visible window. + */ int offset = csbi.dwCursorPosition.Y - csbi.srWindow.Top; ConMoveVisibleWindow(offset); diff --git a/contrib/win32/win32compat/console.h b/contrib/win32/win32compat/console.h index c98386d3a..426bc0d77 100644 --- a/contrib/win32/win32compat/console.h +++ b/contrib/win32/win32compat/console.h @@ -137,5 +137,5 @@ void ConSaveWindowsState(); void ConMoveVisibleWindow(int offset); int is_cursor_at_lastline_of_visible_window(); void ConGetCursorPosition(int *x, int *y); -void ConMoveCurosorTop(CONSOLE_SCREEN_BUFFER_INFO csbi); +void ConMoveCursorTop(CONSOLE_SCREEN_BUFFER_INFO csbi); #endif