diff --git a/stepmania/src/archutils/Win32/Crash.cpp b/stepmania/src/archutils/Win32/Crash.cpp index 2441c0af3b..c7089adb78 100644 --- a/stepmania/src/archutils/Win32/Crash.cpp +++ b/stepmania/src/archutils/Win32/Crash.cpp @@ -10,7 +10,6 @@ #include "arch/Threads/Threads_Win32.h" #include "archutils/Win32/WindowsResources.h" -#include "archutils/Win32/GraphicsWindow.h" /* for GraphicsWindow::GetHwnd */ #include "crash.h" #include "ProductInfo.h" @@ -163,6 +162,11 @@ bool VDDebugInfoInitFromMemory(VDDebugInfoContext *pctx, const void *_src); bool VDDebugInfoInitFromFile( VDDebugInfoContext *pctx ); void VDDebugInfoDeinit( VDDebugInfoContext *pctx ); +static HWND g_hForegroundWnd = NULL; +void CrashHandler::SetForegroundWindow( HWND hWnd ) +{ + g_hForegroundWnd = hWnd; +} long __stdcall CrashHandler::ExceptionHandler( EXCEPTION_POINTERS *pExc ) { @@ -255,11 +259,11 @@ long __stdcall CrashHandler::ExceptionHandler( EXCEPTION_POINTERS *pExc ) /* Now things get more risky. If we're fullscreen, the window will obscure the * crash dialog. Try to hide the window. Things might blow up here; do this * after DoSave, so we always write a crash dump. */ - if( GetWindowThreadProcessId( GraphicsWindow::GetHwnd(), NULL ) == GetCurrentThreadId() ) + if( GetWindowThreadProcessId( g_hForegroundWnd, NULL ) == GetCurrentThreadId() ) { /* The thread that crashed was the thread that created the main window. Hide * the window. This will also restore the video mode, if necessary. */ - ShowWindow( GraphicsWindow::GetHwnd(), SW_HIDE ); + ShowWindow( g_hForegroundWnd, SW_HIDE ); } else { /* A different thread crashed. Simply kill all other windows. We can't safely * call ShowWindow; the main thread might be deadlocked. */ diff --git a/stepmania/src/archutils/Win32/Crash.h b/stepmania/src/archutils/Win32/Crash.h index 8aae71edf6..1a7da93888 100644 --- a/stepmania/src/archutils/Win32/Crash.h +++ b/stepmania/src/archutils/Win32/Crash.h @@ -11,6 +11,11 @@ namespace CrashHandler void SymLookup( const void *ptr, char *buf ); void ForceCrash( const char *reason ); void ForceDeadlock( CString reason, uint64_t iID ); + + /* Inform the crash handler of a foreground window that may be fullscreen. If + * set, the crash handler will attempt to hide the window or reset the video + * mode. */ + void SetForegroundWindow( HWND hWnd ); }; #endif diff --git a/stepmania/src/archutils/Win32/GraphicsWindow.cpp b/stepmania/src/archutils/Win32/GraphicsWindow.cpp index f0f3a3d171..c112b1c0fa 100644 --- a/stepmania/src/archutils/Win32/GraphicsWindow.cpp +++ b/stepmania/src/archutils/Win32/GraphicsWindow.cpp @@ -8,6 +8,7 @@ #include "DisplayResolutions.h" #include "arch/ArchHooks/ArchHooks.h" #include "archutils/Win32/AppInstance.h" +#include "archutils/Win32/Crash.h" #include "archutils/Win32/WindowIcon.h" #include "archutils/Win32/GetFileInformation.h" @@ -241,6 +242,7 @@ void GraphicsWindow::CreateGraphicsWindow( const VideoModeParams &p ) if( g_hWndMain == NULL ) RageException::Throw( "%s", werr_ssprintf( GetLastError(), "CreateWindow" ).c_str() ); + CrashHandler::SetForegroundWindow( g_hWndMain ); //SetForegroundWindow( g_hWndMain ); g_HDC = GetDC( g_hWndMain ); @@ -266,6 +268,7 @@ void GraphicsWindow::RecreateGraphicsWindow( const VideoModeParams &p ) DestroyGraphicsWindow(); g_hWndMain = hWnd; + CrashHandler::SetForegroundWindow( g_hWndMain ); g_HDC = GetDC( g_hWndMain ); } @@ -353,6 +356,7 @@ void GraphicsWindow::DestroyGraphicsWindow() { DestroyWindow( g_hWndMain ); g_hWndMain = NULL; + CrashHandler::SetForegroundWindow( g_hWndMain ); } if( g_hIcon != NULL )