diff --git a/library/Core-windows.cpp b/library/Core-windows.cpp index dab73e12c..adb4c1cff 100644 --- a/library/Core-windows.cpp +++ b/library/Core-windows.cpp @@ -44,27 +44,33 @@ distribution. HANDLE g_hConsoleOut; // Handle to debug console void RedirectIOToConsole(); - -// This function dynamically creates a "Console" window and points stdout and stderr to it. -// It also hooks stdin to the window -// You must free it later with FreeConsole + + +/* + * This function dynamically creates a "Console" window and points stdout and stderr to it. + * It also hooks stdin to the window + * You must free it later with FreeConsole + * + * Windows Developer Journal, December 1997 + * Adding Console I/O to a Win32 GUI App + * by Andrew Tucker + * http://www.halcyon.com/~ast/dload/guicon.htm + */ void RedirectIOToConsole() { int hConHandle; long lStdHandle; CONSOLE_SCREEN_BUFFER_INFO coninfo; FILE *fp; - + // allocate a console for this app AllocConsole(); - + // set the screen buffer to be big enough to let us scroll text - GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), - &coninfo); + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); coninfo.dwSize.Y = MAX_CONSOLE_LINES; // How many lines do you want to have in the console buffer - SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), - coninfo.dwSize); - + SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); + // redirect unbuffered STDOUT to the console g_hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); @@ -72,22 +78,22 @@ void RedirectIOToConsole() fp = _fdopen( hConHandle, "w" ); *stdout = *fp; setvbuf( stdout, NULL, _IONBF, 0 ); - + // redirect unbuffered STDIN to the console lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, "r" ); *stdin = *fp; setvbuf( stdin, NULL, _IONBF, 0 ); - + // redirect unbuffered STDERR to the console lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, "w" ); *stderr = *fp; - setvbuf( stderr, NULL, _IONBF, 0 ); - SetConsoleTitle("The Console Titlebar Text"); - + setvbuf( stderr, NULL, _IONBF, 0 ); + SetConsoleTitle("DFHack"); + // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog // point to console as well Uncomment the next line if you are using c++ cio or comment if you don't std::ios::sync_with_stdio(); @@ -601,6 +607,7 @@ DFhackCExport void SDL_Quit(void) { _SDL_Quit(); } + FreeConsole(); } // this is supported from 0.31.04 forward DFhackCExport int SDL_NumJoysticks(void) @@ -726,7 +733,7 @@ DFhackCExport uint32_t SDL_ThreadID(void) return _SDL_ThreadID(); } -// this has to be thread-safe. Let's hope it is. +// FIXME: this has to be thread-safe. bool FirstCall() { RedirectIOToConsole();