# HG changeset patch # User Patric Stout # Date 2021-06-17 18:22:57 # Node ID 79f3a6be4b7cd99a7e7c9e21c7b4b87374f65a6e # Parent 31eedcf7ade01f02ff5975a50a47c3c367a4126d Fix: don't propagate shift/ctrl state till next game-tick (#9381) When the game-loop is very slow, it was easily possible to start the loop with _shift_pressed being false, but end with _shift_pressed being true. This doesn't hurt the game as such, but for the user this can be very weird: I pressed "Buy Vehicle", pressed shift a bit later, and I still get a cost indication. diff --git a/src/video/video_driver.cpp b/src/video/video_driver.cpp --- a/src/video/video_driver.cpp +++ b/src/video/video_driver.cpp @@ -116,21 +116,6 @@ void VideoDriver::Tick() /* Avoid next_draw_tick getting behind more and more if it cannot keep up. */ if (this->next_draw_tick < now - ALLOWED_DRIFT * this->GetDrawInterval()) this->next_draw_tick = now; - /* Keep the interactive randomizer a bit more random by requesting - * new values when-ever we can. */ - InteractiveRandom(); - - this->InputLoop(); - - /* Check if the fast-forward button is still pressed. */ - if (fast_forward_key_pressed && !_networking && _game_mode != GM_MENU) { - ChangeGameSpeed(true); - this->fast_forward_via_key = true; - } else if (this->fast_forward_via_key) { - ChangeGameSpeed(false); - this->fast_forward_via_key = false; - } - /* Locking video buffer can block (especially with vsync enabled), do it before taking game state lock. */ this->LockVideoBuffer(); @@ -139,9 +124,24 @@ void VideoDriver::Tick() std::lock_guard lock_wait(this->game_thread_wait_mutex); std::lock_guard lock_state(this->game_state_mutex); + /* Keep the interactive randomizer a bit more random by requesting + * new values when-ever we can. */ + InteractiveRandom(); + this->DrainCommandQueue(); while (this->PollEvent()) {} + this->InputLoop(); + + /* Check if the fast-forward button is still pressed. */ + if (fast_forward_key_pressed && !_networking && _game_mode != GM_MENU) { + ChangeGameSpeed(true); + this->fast_forward_via_key = true; + } else if (this->fast_forward_via_key) { + ChangeGameSpeed(false); + this->fast_forward_via_key = false; + } + ::InputLoop(); /* Prevent drawing when switching mode, as windows can be removed when they should still appear. */