FOutputDeviceConsoleWindows::~FOutputDeviceConsoleWindows() { SaveToINI(); // WRH - 2007/08/23 - This causes the process to take a LONG time to shut down when clicking the "close window" // button on the top-right of the console window. //FreeConsole(); }
void FOutputDeviceConsoleWindows::Show( bool ShowWindow ) { if( ShowWindow ) { if( !ConsoleHandle ) { if (!AllocConsole()) { bIsAttached = true; } ConsoleHandle = GetStdHandle(OutputDeviceConstants::WIN_STD_OUTPUT_HANDLE); if( ConsoleHandle != INVALID_HANDLE_VALUE ) { COORD Size; Size.X = 160; Size.Y = 4000; int32 ConsoleWidth = 160; int32 ConsoleHeight = 4000; int32 ConsolePosX = 0; int32 ConsolePosY = 0; bool bHasX = false; bool bHasY = false; if(GConfig) { GConfig->GetInt(TEXT("DebugWindows"), TEXT("ConsoleWidth"), ConsoleWidth, GGameIni); GConfig->GetInt(TEXT("DebugWindows"), TEXT("ConsoleHeight"), ConsoleHeight, GGameIni); bHasX = GConfig->GetInt(TEXT("DebugWindows"), TEXT("ConsoleX"), ConsolePosX, GGameIni); bHasY = GConfig->GetInt(TEXT("DebugWindows"), TEXT("ConsoleY"), ConsolePosY, GGameIni); Size.X = (SHORT)ConsoleWidth; Size.Y = (SHORT)ConsoleHeight; } SetConsoleScreenBufferSize( ConsoleHandle, Size ); CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo; // Try to set the window width to match the screen buffer width, so that no manual horizontal scrolling or resizing is necessary if (::GetConsoleScreenBufferInfo( ConsoleHandle, &ConsoleInfo ) != 0) { SMALL_RECT NewConsoleWindowRect = ConsoleInfo.srWindow; NewConsoleWindowRect.Right = ConsoleInfo.dwSize.X - 1; ::SetConsoleWindowInfo( ConsoleHandle, true, &NewConsoleWindowRect ); } RECT WindowRect; ::GetWindowRect( GetConsoleWindow(), &WindowRect ); if (!FParse::Value(FCommandLine::Get(), TEXT("ConsoleX="), ConsolePosX) && !bHasX) { ConsolePosX = WindowRect.left; } if (!FParse::Value(FCommandLine::Get(), TEXT("ConsoleY="), ConsolePosY) && !bHasY) { ConsolePosY = WindowRect.top; } ::SetWindowPos( GetConsoleWindow(), HWND_TOP, ConsolePosX, ConsolePosY, 0, 0, SWP_NOSIZE | SWP_NOSENDCHANGING | SWP_NOZORDER ); // set the control-c, etc handler FPlatformMisc::SetGracefulTerminationHandler(); } } } else if( ConsoleHandle ) { SaveToINI(); ConsoleHandle = NULL; FreeConsole(); bIsAttached = false; } }
void FOutputDeviceConsoleWindows::Show( bool ShowWindow ) { if( ShowWindow ) { if( !ConsoleHandle ) { if (!AllocConsole()) { bIsAttached = true; } ConsoleHandle = GetStdHandle(OutputDeviceConstants::WIN_STD_OUTPUT_HANDLE); if( ConsoleHandle != INVALID_HANDLE_VALUE ) { COORD Size; Size.X = 160; Size.Y = 4000; int32 ConsoleWidth = 160; int32 ConsoleHeight = 4000; int32 ConsolePosX = 0; int32 ConsolePosY = 0; bool bHasX = false; bool bHasY = false; if(GConfig) { GConfig->GetInt(TEXT("DebugWindows"), TEXT("ConsoleWidth"), ConsoleWidth, GGameIni); GConfig->GetInt(TEXT("DebugWindows"), TEXT("ConsoleHeight"), ConsoleHeight, GGameIni); bHasX = GConfig->GetInt(TEXT("DebugWindows"), TEXT("ConsoleX"), ConsolePosX, GGameIni); bHasY = GConfig->GetInt(TEXT("DebugWindows"), TEXT("ConsoleY"), ConsolePosY, GGameIni); Size.X = (SHORT)ConsoleWidth; Size.Y = (SHORT)ConsoleHeight; } SetConsoleScreenBufferSize( ConsoleHandle, Size ); RECT WindowRect; ::GetWindowRect( GetConsoleWindow(), &WindowRect ); if (!FParse::Value(FCommandLine::Get(), TEXT("ConsoleX="), ConsolePosX) && !bHasX) { ConsolePosX = WindowRect.left; } if (!FParse::Value(FCommandLine::Get(), TEXT("ConsoleY="), ConsolePosY) && !bHasY) { ConsolePosY = WindowRect.top; } ::SetWindowPos( GetConsoleWindow(), HWND_TOP, ConsolePosX, ConsolePosY, 0, 0, SWP_NOSIZE | SWP_NOSENDCHANGING | SWP_NOZORDER ); // set the control-c, etc handler FPlatformMisc::SetGracefulTerminationHandler(); } } } else if( ConsoleHandle ) { SaveToINI(); ConsoleHandle = NULL; FreeConsole(); bIsAttached = false; } }