|
|
@ -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();
|
|
|
|