Windows: prevent freeze while moving or resizing the game window.

When moving or resizing the window, Windows spins up a seperate event-loop, effectively blocking the normal one.
To work around this, we're starting a timer that will continue sending WM_TIMER messages which we can use to keep the mainloop running.

fixes #4695

(cherry picked from commit 6856c52491)
This commit is contained in:
Andreas Haas 2016-07-01 15:31:37 +02:00 committed by Rémi Verschelde
parent 6199efbc7e
commit 7589307911
2 changed files with 17 additions and 1 deletions

View File

@ -611,6 +611,20 @@ LRESULT OS_Windows::WndProc(HWND hWnd,UINT uMsg, WPARAM wParam, LPARAM lParam) {
} }
//return 0; // Jump Back //return 0; // Jump Back
} break; } break;
case WM_ENTERSIZEMOVE: {
move_timer_id = SetTimer(hWnd, 1, USER_TIMER_MINIMUM,(TIMERPROC) NULL);
} break;
case WM_EXITSIZEMOVE: {
KillTimer(hWnd, move_timer_id);
} break;
case WM_TIMER: {
if (wParam == move_timer_id) {
process_key_events();
Main::iteration();
}
} break;
case WM_SYSKEYDOWN: case WM_SYSKEYDOWN:
case WM_SYSKEYUP: case WM_SYSKEYUP:
case WM_KEYUP: case WM_KEYUP:
@ -1019,7 +1033,7 @@ void OS_Windows::initialize(const VideoMode& p_desired,int p_video_driver,int p_
_ensure_data_dir(); _ensure_data_dir();
move_timer_id = 1;
} }
void OS_Windows::set_clipboard(const String& p_text) { void OS_Windows::set_clipboard(const String& p_text) {

View File

@ -104,6 +104,8 @@ class OS_Windows : public OS {
HINSTANCE hInstance; // Holds The Instance Of The Application HINSTANCE hInstance; // Holds The Instance Of The Application
HWND hWnd; HWND hWnd;
uint32_t move_timer_id;
Size2 window_rect; Size2 window_rect;
VideoMode video_mode; VideoMode video_mode;