diff --git a/Sources/Plasma/CoreLib/HeadSpin.cpp b/Sources/Plasma/CoreLib/HeadSpin.cpp index c9a50e54..356109c4 100644 --- a/Sources/Plasma/CoreLib/HeadSpin.cpp +++ b/Sources/Plasma/CoreLib/HeadSpin.cpp @@ -175,23 +175,6 @@ void DebugMsg(const char fmt[], ...) } } -void ErrorMinimizeAppWindow () -{ -#ifdef HS_BUILD_FOR_WIN32 - // If the application's topmost window is a fullscreen - // popup window, minimize it before displaying an error - HWND appWindow = GetActiveWindow(); - if ( ((GetWindowLong(appWindow, GWL_STYLE) & WS_POPUP) != 0) ) - SetWindowPos( - appWindow, - HWND_NOTOPMOST, - 0, 0, // position - 0, 0, // size - SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE - ); -#endif -} - /////////////////////////////////////////////////////////////////// diff --git a/Sources/Plasma/CoreLib/hsUtils.cpp b/Sources/Plasma/CoreLib/hsUtils.cpp index 60a37f3f..45e5f0e0 100644 --- a/Sources/Plasma/CoreLib/hsUtils.cpp +++ b/Sources/Plasma/CoreLib/hsUtils.cpp @@ -70,9 +70,34 @@ char *hsScalarToStr(float s) return hsStrBuf; } +class hsMinimizeClientGuard +{ +#ifdef CLIENT + hsWindowHndl fWnd; + +public: + hsMinimizeClientGuard() + { +#ifdef HS_BUILD_FOR_WIN32 + fWnd = GetActiveWindow(); + // If the application's topmost window is fullscreen, minimize it before displaying an error + if ((GetWindowLong(fWnd, GWL_STYLE) & WS_POPUP) != 0) + ShowWindow(fWnd, SW_MINIMIZE); +#endif // HS_BUILD_FOR_WIN32 + } + + ~hsMinimizeClientGuard() + { +#ifdef HS_BUILD_FOR_WIN32 + ShowWindow(fWnd, SW_RESTORE); +#endif // HS_BUILD_FOR_WIN32 + } +#endif // CLIENT +}; + bool hsMessageBox_SuppressPrompts = false; -int hsMessageBoxWithOwner(void * owner, const char message[], const char caption[], int kind, int icon) +int hsMessageBoxWithOwner(hsWindowHndl owner, const char message[], const char caption[], int kind, int icon) { if (hsMessageBox_SuppressPrompts) return hsMBoxOk; @@ -106,10 +131,8 @@ int hsMessageBoxWithOwner(void * owner, const char message[], const char caption else flags |= MB_ICONERROR; -#ifdef CLIENT - ErrorMinimizeAppWindow(); -#endif - int ans = MessageBox((HWND)owner, message, caption, flags); + hsMinimizeClientGuard guard; + int ans = MessageBox(owner, message, caption, flags); switch (ans) { @@ -126,7 +149,7 @@ int hsMessageBoxWithOwner(void * owner, const char message[], const char caption #endif } -int hsMessageBoxWithOwner(void * owner, const wchar_t message[], const wchar_t caption[], int kind, int icon) +int hsMessageBoxWithOwner(hsWindowHndl owner, const wchar_t message[], const wchar_t caption[], int kind, int icon) { if (hsMessageBox_SuppressPrompts) return hsMBoxOk; @@ -160,10 +183,8 @@ int hsMessageBoxWithOwner(void * owner, const wchar_t message[], const wchar_t c else flags |= MB_ICONERROR; -#ifdef CLIENT - ErrorMinimizeAppWindow(); -#endif - int ans = MessageBoxW((HWND)owner, message, caption, flags); + hsMinimizeClientGuard guard; + int ans = MessageBoxW(owner, message, caption, flags); switch (ans) { @@ -182,20 +203,12 @@ int hsMessageBoxWithOwner(void * owner, const wchar_t message[], const wchar_t c int hsMessageBox(const char message[], const char caption[], int kind, int icon) { -#if HS_BUILD_FOR_WIN32 - return hsMessageBoxWithOwner(nil/*GetActiveWindow()*/,message,caption,kind,icon); -#else - return hsMessageBoxWithOwner(nil,message,caption,kind,icon); -#endif + return hsMessageBoxWithOwner((hsWindowHndl)nil,message,caption,kind,icon); } int hsMessageBox(const wchar_t message[], const wchar_t caption[], int kind, int icon) { -#if HS_BUILD_FOR_WIN32 - return hsMessageBoxWithOwner(nil/*GetActiveWindow()*/,message,caption,kind,icon); -#else - return hsMessageBoxWithOwner(nil,message,caption,kind,icon); -#endif + return hsMessageBoxWithOwner((hsWindowHndl)nil,message,caption,kind,icon); } inline hsBool hsCompare(float a, float b, float delta) diff --git a/Sources/Plasma/CoreLib/hsUtils.h b/Sources/Plasma/CoreLib/hsUtils.h index 0559c4be..8bf36fef 100644 --- a/Sources/Plasma/CoreLib/hsUtils.h +++ b/Sources/Plasma/CoreLib/hsUtils.h @@ -126,8 +126,8 @@ enum { // RETURN VALUES FROM hsMessageBox extern bool hsMessageBox_SuppressPrompts; int hsMessageBox(const char message[], const char caption[], int kind, int icon=hsMessageBoxIconAsterisk); int hsMessageBox(const wchar_t message[], const wchar_t caption[], int kind, int icon=hsMessageBoxIconAsterisk); -int hsMessageBoxWithOwner(void* owner, const char message[], const char caption[], int kind, int icon=hsMessageBoxIconAsterisk); -int hsMessageBoxWithOwner(void* owner, const wchar_t message[], const wchar_t caption[], int kind, int icon=hsMessageBoxIconAsterisk); +int hsMessageBoxWithOwner(hsWindowHndl owner, const char message[], const char caption[], int kind, int icon=hsMessageBoxIconAsterisk); +int hsMessageBoxWithOwner(hsWindowHndl owner, const wchar_t message[], const wchar_t caption[], int kind, int icon=hsMessageBoxIconAsterisk); inline hsBool hsCompare(float a, float b, float delta=0.0001); @@ -217,7 +217,6 @@ hsDebugMessageProc hsSetStatusMessageProc(hsDebugMessageProc newProc); void ErrorEnableGui (bool enabled); void ErrorAssert (int line, const char file[], const char fmt[], ...); -void ErrorMinimizeAppWindow (); bool DebugIsDebuggerPresent (); void DebugBreakIfDebuggerPresent ();