summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/libw32c.cc
diff options
context:
space:
mode:
authorSamuel Bronson <naesten@gmail.com>2011-10-31 21:08:33 -0400
committerRobert Burnham <burnhamrobertp@gmail.com>2011-11-01 11:45:30 -0500
commita65c813e4546083033e4a2edab108296ec1534a8 (patch)
treeced5b8ef35d065dc2a7554a3afb4f4457d04681a /crawl-ref/source/libw32c.cc
parent0013ddb42fde3f017ecd9e42a831d4c0bc0b1cbc (diff)
downloadcrawl-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.cc22
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)