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:
parent
6199efbc7e
commit
7589307911
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue