Some windows console refinement.

develop
Petr Mrázek 2011-06-14 16:49:53 +02:00
parent 22b79bb46e
commit 71d46d533f
1 changed files with 24 additions and 17 deletions

@ -44,27 +44,33 @@ distribution.
HANDLE g_hConsoleOut; // Handle to debug console HANDLE g_hConsoleOut; // Handle to debug console
void RedirectIOToConsole(); 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() void RedirectIOToConsole()
{ {
int hConHandle; int hConHandle;
long lStdHandle; long lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo; CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp; FILE *fp;
// allocate a console for this app // allocate a console for this app
AllocConsole(); AllocConsole();
// set the screen buffer to be big enough to let us scroll text // set the screen buffer to be big enough to let us scroll text
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
&coninfo);
coninfo.dwSize.Y = MAX_CONSOLE_LINES; // How many lines do you want to have in the console buffer coninfo.dwSize.Y = MAX_CONSOLE_LINES; // How many lines do you want to have in the console buffer
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
coninfo.dwSize);
// redirect unbuffered STDOUT to the console // redirect unbuffered STDOUT to the console
g_hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); g_hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
@ -72,22 +78,22 @@ void RedirectIOToConsole()
fp = _fdopen( hConHandle, "w" ); fp = _fdopen( hConHandle, "w" );
*stdout = *fp; *stdout = *fp;
setvbuf( stdout, NULL, _IONBF, 0 ); setvbuf( stdout, NULL, _IONBF, 0 );
// redirect unbuffered STDIN to the console // redirect unbuffered STDIN to the console
lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "r" ); fp = _fdopen( hConHandle, "r" );
*stdin = *fp; *stdin = *fp;
setvbuf( stdin, NULL, _IONBF, 0 ); setvbuf( stdin, NULL, _IONBF, 0 );
// redirect unbuffered STDERR to the console // redirect unbuffered STDERR to the console
lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen( hConHandle, "w" ); fp = _fdopen( hConHandle, "w" );
*stderr = *fp; *stderr = *fp;
setvbuf( stderr, NULL, _IONBF, 0 ); setvbuf( stderr, NULL, _IONBF, 0 );
SetConsoleTitle("The Console Titlebar Text"); SetConsoleTitle("DFHack");
// make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog // 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 // 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(); std::ios::sync_with_stdio();
@ -601,6 +607,7 @@ DFhackCExport void SDL_Quit(void)
{ {
_SDL_Quit(); _SDL_Quit();
} }
FreeConsole();
} }
// this is supported from 0.31.04 forward // this is supported from 0.31.04 forward
DFhackCExport int SDL_NumJoysticks(void) DFhackCExport int SDL_NumJoysticks(void)
@ -726,7 +733,7 @@ DFhackCExport uint32_t SDL_ThreadID(void)
return _SDL_ThreadID(); return _SDL_ThreadID();
} }
// this has to be thread-safe. Let's hope it is. // FIXME: this has to be thread-safe.
bool FirstCall() bool FirstCall()
{ {
RedirectIOToConsole(); RedirectIOToConsole();