diff options
author | Samuel Bronson <naesten@gmail.com> | 2011-10-31 21:08:33 -0400 |
---|---|---|
committer | Robert Burnham <burnhamrobertp@gmail.com> | 2011-11-01 11:45:30 -0500 |
commit | a65c813e4546083033e4a2edab108296ec1534a8 (patch) | |
tree | ced5b8ef35d065dc2a7554a3afb4f4457d04681a /crawl-ref/source/libw32c.cc | |
parent | 0013ddb42fde3f017ecd9e42a831d4c0bc0b1cbc (diff) | |
download | crawl-ref-a65c813e4546083033e4a2edab108296ec1534a8.tar.gz crawl-ref-a65c813e4546083033e4a2edab108296ec1534a8.zip |
Win32: Don't tromp over scrollback: use a fresh console screen buffer.
Could maybe use some error checking ...
Diffstat (limited to 'crawl-ref/source/libw32c.cc')
-rw-r--r-- | crawl-ref/source/libw32c.cc | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/crawl-ref/source/libw32c.cc b/crawl-ref/source/libw32c.cc index a72f9094f5..53a2f87f35 100644 --- a/crawl-ref/source/libw32c.cc +++ b/crawl-ref/source/libw32c.cc @@ -74,6 +74,7 @@ wchar_t oldTitle[80]; static HANDLE inbuf = NULL; static HANDLE outbuf = NULL; +static HANDLE old_outbuf = NULL; static int current_color = -1; static bool cursor_is_enabled = false; static CONSOLE_CURSOR_INFO initial_cci; @@ -340,7 +341,18 @@ static void w32_term_resizer() void console_startup() { inbuf = GetStdHandle(STD_INPUT_HANDLE); - outbuf = GetStdHandle(STD_OUTPUT_HANDLE); + old_outbuf = GetStdHandle(STD_OUTPUT_HANDLE); + + // Create a new "console screen buffer" so we don't tramp all over + // the user's scrollback. + outbuf = CreateConsoleScreenBuffer( + GENERIC_READ |GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, // shared + NULL, // default security attributes + CONSOLE_TEXTMODE_BUFFER, // must be TEXTMODE + NULL); // reserved; must be NULL + + SetConsoleActiveScreenBuffer(outbuf); if (inbuf == INVALID_HANDLE_VALUE || outbuf == INVALID_HANDLE_VALUE) { @@ -423,6 +435,14 @@ void console_shutdown() // finally, restore title if (*oldTitle) SetConsoleTitleW(oldTitle); + + // and switch back to the former console buffer + if (old_outbuf) + { + SetConsoleActiveScreenBuffer(old_outbuf); + CloseHandle(outbuf); + old_outbuf = 0; + } } void set_cursor_enabled(bool enabled) |