summaryrefslogtreecommitdiff
path: root/library/Console-windows.cpp
diff options
context:
space:
mode:
authorPetr Mrázek2011-11-04 09:08:29 +0100
committerPetr Mrázek2011-11-04 09:08:29 +0100
commitaf46b262b532400d1ff0ce176a969aa6d397193d (patch)
tree74380908f0eef2d84c0b53a857d4c89d34584327 /library/Console-windows.cpp
parent0ff7a48848945583f00671b1da9bbd9d16e1f33f (diff)
downloaddfhack-af46b262b532400d1ff0ce176a969aa6d397193d.tar.gz
dfhack-af46b262b532400d1ff0ce176a969aa6d397193d.tar.bz2
dfhack-af46b262b532400d1ff0ce176a969aa6d397193d.tar.xz
More init hardening.
Diffstat (limited to 'library/Console-windows.cpp')
-rw-r--r--library/Console-windows.cpp49
1 files changed, 48 insertions, 1 deletions
diff --git a/library/Console-windows.cpp b/library/Console-windows.cpp
index 92cfae5a..4daab5c2 100644
--- a/library/Console-windows.cpp
+++ b/library/Console-windows.cpp
@@ -378,6 +378,7 @@ namespace DFHack
HANDLE console_in;
HANDLE console_out;
HWND ConsoleWindow;
+ HWND MainWindow;
WORD default_attributes;
// current state
enum console_state
@@ -402,7 +403,29 @@ Console::Console():std::ostream(0), std::ios(0)
Console::~Console()
{
}
+/*
+// DOESN'T WORK - locks up DF!
+void ForceForegroundWindow(HWND window)
+{
+ DWORD nForeThread, nAppThread;
+
+ nForeThread = GetWindowThreadProcessId(GetForegroundWindow(), 0);
+ nAppThread = ::GetWindowThreadProcessId(window,0);
+ if(nForeThread != nAppThread)
+ {
+ AttachThreadInput(nForeThread, nAppThread, true);
+ BringWindowToTop(window);
+ ShowWindow(window,3);
+ AttachThreadInput(nForeThread, nAppThread, false);
+ }
+ else
+ {
+ BringWindowToTop(window);
+ ShowWindow(window,3);
+ }
+}
+*/
bool Console::init(bool)
{
d = new Private();
@@ -411,6 +434,21 @@ bool Console::init(bool)
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp;
DWORD oldMode, newMode;
+ DWORD dwTheardId;
+
+ HWND h = ::GetTopWindow(0 );
+ while ( h )
+ {
+ DWORD pid;
+ dwTheardId = ::GetWindowThreadProcessId( h,&pid);
+ if ( pid == GetCurrentProcessId() )
+ {
+ // here h is the handle to the window
+ break;
+ }
+ h = ::GetNextWindow( h , GW_HWNDNEXT);
+ }
+ d->MainWindow = h;
// Allocate a console!
AllocConsole();
@@ -450,6 +488,8 @@ bool Console::init(bool)
std::cin.tie(this);
clear();
inited = true;
+ // DOESN'T WORK - locks up DF!
+ // ForceForegroundWindow(d->MainWindow);
return true;
}
// FIXME: looks awfully empty, doesn't it?
@@ -480,11 +520,18 @@ int Console::printerr( const char* format, ... )
va_list args;
lock_guard <mutex> g(*wlock);
int ret;
- if(!inited) ret = -1;
+ // also mirror in error log
+ if(!inited)
+ {
+ va_start( args, format );
+ ret = vfprintf(stderr, format, args);
+ va_end(args);
+ }
else
{
va_start( args, format );
ret = d->vprinterr(format, args);
+ vfprintf(stderr, format, args);
va_end(args);
}
return ret;