mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-30 10:36:42 +00:00
enable win32 debug console when launching from console
This commit is contained in:
parent
d791dcfbf3
commit
64e960aa22
5 changed files with 70 additions and 1 deletions
|
@ -90,7 +90,7 @@ add_component_dir (misc
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (debug
|
add_component_dir (debug
|
||||||
debugging debuglog
|
debugging debuglog win32
|
||||||
)
|
)
|
||||||
|
|
||||||
IF(NOT WIN32 AND NOT APPLE)
|
IF(NOT WIN32 AND NOT APPLE)
|
||||||
|
|
|
@ -52,6 +52,11 @@ namespace Debug
|
||||||
|
|
||||||
int wrapApplication(int (*innerApplication)(int argc, char *argv[]), int argc, char *argv[], const std::string& appName)
|
int wrapApplication(int (*innerApplication)(int argc, char *argv[]), int argc, char *argv[], const std::string& appName)
|
||||||
{
|
{
|
||||||
|
#if defined _WIN32
|
||||||
|
// grab a console window if we don't have one
|
||||||
|
(void)Debug::attachParentConsole();
|
||||||
|
#endif
|
||||||
|
|
||||||
// Some objects used to redirect cout and cerr
|
// Some objects used to redirect cout and cerr
|
||||||
// Scope must be here, so this still works inside the catch block for logging exceptions
|
// Scope must be here, so this still works inside the catch block for logging exceptions
|
||||||
std::streambuf* cout_rdbuf = std::cout.rdbuf ();
|
std::streambuf* cout_rdbuf = std::cout.rdbuf ();
|
||||||
|
|
|
@ -9,6 +9,9 @@
|
||||||
#include <SDL_messagebox.h>
|
#include <SDL_messagebox.h>
|
||||||
|
|
||||||
#include "debuglog.hpp"
|
#include "debuglog.hpp"
|
||||||
|
#if defined _WIN32
|
||||||
|
# include "win32.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Debug
|
namespace Debug
|
||||||
{
|
{
|
||||||
|
|
56
components/debug/win32.cpp
Normal file
56
components/debug/win32.cpp
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#include "win32.hpp"
|
||||||
|
|
||||||
|
#undef _CRT_SECURE_NO_WARNINGS
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
namespace Debug {
|
||||||
|
|
||||||
|
bool attachParentConsole()
|
||||||
|
{
|
||||||
|
// we already have a console window
|
||||||
|
if (GetConsoleWindow() != nullptr)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// our parent window has a console we can use
|
||||||
|
if (AttachConsole(ATTACH_PARENT_PROCESS))
|
||||||
|
{
|
||||||
|
// start with consistent state
|
||||||
|
fflush(stdin);
|
||||||
|
fflush(stderr);
|
||||||
|
std::cout.flush();
|
||||||
|
std::cerr.flush();
|
||||||
|
|
||||||
|
// fix fprintf(3) and fwprintf(3)
|
||||||
|
// this looks strange, but nothing is ever simple on Windows.
|
||||||
|
_wfreopen(L"CON", L"w", stdout);
|
||||||
|
_wfreopen(L"CON", L"w", stderr);
|
||||||
|
_wfreopen(L"CON", L"r", stdin);
|
||||||
|
freopen("CON", "w", stdout);
|
||||||
|
freopen("CON", "w", stderr);
|
||||||
|
freopen("CON", "w", stderr);
|
||||||
|
|
||||||
|
// it can be verified that input/output works as expected.
|
||||||
|
#if 0
|
||||||
|
fprintf(stdout, "ascii stdout\n");
|
||||||
|
fwprintf(stdout, L"wide stdout\n");
|
||||||
|
fprintf(stderr, "ascii stderr\n");
|
||||||
|
fwprintf(stderr, L"wide stderr\n");
|
||||||
|
|
||||||
|
std::cout << "ascii cout\n";
|
||||||
|
std::cout << L"wide cout\n";
|
||||||
|
std::cerr << "ascii cerr\n";
|
||||||
|
std::cerr << L"wide cerr\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // ns Debug
|
5
components/debug/win32.hpp
Normal file
5
components/debug/win32.hpp
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Debug {
|
||||||
|
bool attachParentConsole();
|
||||||
|
}
|
Loading…
Reference in a new issue