From c4df0f95ae106f3e41c8c1fb5c19670ce876f1f4 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Thu, 18 Feb 2021 13:33:27 +0100 Subject: [PATCH] Fix: during switching of game-mode, drawing could show closed windows that shouldn't be closed yet The higher your refresh-rate, the more likely this is. Mostly you notice this when creating a new game or when abandoning a game. This is a bit of a hack to keep the old behaviour, as before this patch the game was already freezing your mouse while it was changing game-mode, and it does this too after this patch. Just now it freezes too a few frames earlier, to prevent not drawing windows people still expect to see. --- src/video/allegro_v.cpp | 3 ++- src/video/cocoa/cocoa_v.mm | 4 +++- src/video/sdl2_v.cpp | 3 ++- src/video/sdl_v.cpp | 3 ++- src/video/win32_v.cpp | 3 ++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp index 29db2f1daf..83039fdc6e 100644 --- a/src/video/allegro_v.cpp +++ b/src/video/allegro_v.cpp @@ -495,7 +495,8 @@ void VideoDriver_Allegro::MainLoop() GameLoop(); } - if (cur_ticks >= next_draw_tick) { + /* Prevent drawing when switching mode, as windows can be removed when they should still appear. */ + if (cur_ticks >= next_draw_tick && (_switch_mode == SM_NONE || HasModalProgress())) { next_draw_tick += this->GetDrawInterval(); /* Avoid next_draw_tick getting behind more and more if it cannot keep up. */ if (next_draw_tick < cur_ticks - ALLOWED_DRIFT * this->GetDrawInterval()) next_draw_tick = cur_ticks; diff --git a/src/video/cocoa/cocoa_v.mm b/src/video/cocoa/cocoa_v.mm index 31bad36dc1..cf2512b04a 100644 --- a/src/video/cocoa/cocoa_v.mm +++ b/src/video/cocoa/cocoa_v.mm @@ -36,6 +36,7 @@ #include "../../gfx_func.h" #include "../../thread.h" #include "../../core/random_func.hpp" +#include "../../progress.h" #include "../../settings_type.h" #include "../../window_func.h" #include "../../window_gui.h" @@ -685,7 +686,8 @@ void VideoDriver_Cocoa::GameLoop() ::GameLoop(); } - if (cur_ticks >= next_draw_tick) { + /* Prevent drawing when switching mode, as windows can be removed when they should still appear. */ + if (cur_ticks >= next_draw_tick && (_switch_mode == SM_NONE || HasModalProgress())) { next_draw_tick += this->GetDrawInterval(); /* Avoid next_draw_tick getting behind more and more if it cannot keep up. */ if (next_draw_tick < cur_ticks - ALLOWED_DRIFT * this->GetDrawInterval()) next_draw_tick = cur_ticks; diff --git a/src/video/sdl2_v.cpp b/src/video/sdl2_v.cpp index 4170a953c4..bdfdbdaf19 100644 --- a/src/video/sdl2_v.cpp +++ b/src/video/sdl2_v.cpp @@ -792,7 +792,8 @@ void VideoDriver_SDL::LoopOnce() if (_draw_mutex != nullptr) draw_lock.lock(); } - if (cur_ticks >= next_draw_tick) { + /* Prevent drawing when switching mode, as windows can be removed when they should still appear. */ + if (cur_ticks >= next_draw_tick && (_switch_mode == SM_NONE || HasModalProgress())) { next_draw_tick += this->GetDrawInterval(); /* Avoid next_draw_tick getting behind more and more if it cannot keep up. */ if (next_draw_tick < cur_ticks - ALLOWED_DRIFT * this->GetDrawInterval()) next_draw_tick = cur_ticks; diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index 0a603f9798..7c75ebfeaa 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -745,7 +745,8 @@ void VideoDriver_SDL::MainLoop() if (_draw_mutex != nullptr) draw_lock.lock(); } - if (cur_ticks >= next_draw_tick) { + /* Prevent drawing when switching mode, as windows can be removed when they should still appear. */ + if (cur_ticks >= next_draw_tick && (_switch_mode == SM_NONE || HasModalProgress())) { next_draw_tick += this->GetDrawInterval(); /* Avoid next_draw_tick getting behind more and more if it cannot keep up. */ if (next_draw_tick < cur_ticks - ALLOWED_DRIFT * this->GetDrawInterval()) next_draw_tick = cur_ticks; diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index a150711786..4ffbc9a211 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -1225,7 +1225,8 @@ void VideoDriver_Win32::MainLoop() if (_draw_threaded) draw_lock.lock(); } - if (cur_ticks >= next_draw_tick) { + /* Prevent drawing when switching mode, as windows can be removed when they should still appear. */ + if (cur_ticks >= next_draw_tick && (_switch_mode == SM_NONE || HasModalProgress())) { next_draw_tick += this->GetDrawInterval(); /* Avoid next_draw_tick getting behind more and more if it cannot keep up. */ if (next_draw_tick < cur_ticks - ALLOWED_DRIFT * this->GetDrawInterval()) next_draw_tick = cur_ticks;