Changeset - r25712:79f3a6be4b7c
[Not reviewed]
master
0 1 0
Patric Stout - 3 years ago 2021-06-17 18:22:57
truebrain@openttd.org
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.
1 file changed with 15 insertions and 15 deletions:
0 comments (0 inline, 0 general)
src/video/video_driver.cpp
Show inline comments
 
@@ -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<std::mutex> lock_wait(this->game_thread_wait_mutex);
 
			std::lock_guard<std::mutex> 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. */
0 comments (0 inline, 0 general)