diff --git a/src/openttd.h b/src/openttd.h index ef5c58faeb..8e0f3366a5 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -53,6 +53,20 @@ extern GameMode _game_mode; extern SwitchMode _switch_mode; extern bool _exit_game; +#if defined(WIN32) +extern bool _in_event_loop_post_crash; + +inline bool InEventLoopPostCrash() +{ + return _in_event_loop_post_crash; +} +#else +inline bool InEventLoopPostCrash() +{ + return false; +} +#endif + /** Modes of pausing we've got */ enum PauseMode { PM_UNPAUSED = 0, ///< A normal unpaused game diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index 288619dcab..9c77c878db 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -21,6 +21,7 @@ #include "../../gamelog.h" #include "../../saveload/saveload.h" #include "../../video/video_driver.hpp" +#include "../../openttd.h" #if defined(WITH_DEMANGLE) #include #endif @@ -532,6 +533,8 @@ void *_safe_esp = NULL; static LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS *ep) { + _in_event_loop_post_crash = true; + if (CrashLogWindows::current != NULL) { CrashLog::AfterCrashLogCleanup(); ExitProcess(2); diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp index 3fd1777fa8..e57cc1ef04 100644 --- a/src/os/windows/win32.cpp +++ b/src/os/windows/win32.cpp @@ -34,6 +34,8 @@ #undef strncat #undef strncpy +bool _in_event_loop_post_crash; + static bool _has_console; static bool _cursor_disable = true; static bool _cursor_visible = true; @@ -82,6 +84,7 @@ bool LoadLibraryList(Function proc[], const char *dll) void ShowOSErrorBox(const char *buf, bool system) { + _in_event_loop_post_crash = true; MyShowCursor(true); MessageBox(GetActiveWindow(), OTTD2FS(buf), _T("Error!"), MB_ICONSTOP); } diff --git a/src/window.cpp b/src/window.cpp index 767732ed45..42e6fa15a3 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -2597,6 +2597,8 @@ bool FocusWindowById(WindowClass cls, WindowNumber number) */ void HandleKeypress(uint keycode, WChar key) { + if (InEventLoopPostCrash()) return; + /* World generation is multithreaded and messes with companies. * But there is no company related window open anyway, so _current_company is not used. */ assert(HasModalProgress() || IsLocalCompany()); @@ -2801,6 +2803,8 @@ static void HandleKeyScrolling() static void MouseLoop(MouseClick click, int mousewheel) { + if (InEventLoopPostCrash()) return; + /* World generation is multithreaded and messes with companies. * But there is no company related window open anyway, so _current_company is not used. */ assert(HasModalProgress() || IsLocalCompany()); @@ -2892,6 +2896,8 @@ static void MouseLoop(MouseClick click, int mousewheel) */ void HandleMouseEvents() { + if (InEventLoopPostCrash()) return; + /* World generation is multithreaded and messes with companies. * But there is no company related window open anyway, so _current_company is not used. */ assert(HasModalProgress() || IsLocalCompany()); @@ -2999,6 +3005,8 @@ static void CheckSoftLimit() */ void InputLoop() { + if (InEventLoopPostCrash()) return; + /* World generation is multithreaded and messes with companies. * But there is no company related window open anyway, so _current_company is not used. */ assert(HasModalProgress() || IsLocalCompany());