diff options
author | Pedro J. Estébanez <pedrojrulez@gmail.com> | 2024-04-15 18:17:09 +0200 |
---|---|---|
committer | Pedro J. Estébanez <pedrojrulez@gmail.com> | 2024-05-08 17:41:40 +0200 |
commit | fc08eca5249b8c83debc99f246cbd54ede886717 (patch) | |
tree | 06b61c7411243b3f95a8e4285015ca244f27ab78 /platform/windows/display_server_windows.cpp | |
parent | 2042420bd7f43bb834316d7ca4631ab2fcfcc820 (diff) | |
download | redot-engine-fc08eca5249b8c83debc99f246cbd54ede886717.tar.gz |
DisplayServer: Avoid deadlocks while issuing input events and recursive main loop iterations
Diffstat (limited to 'platform/windows/display_server_windows.cpp')
-rw-r--r-- | platform/windows/display_server_windows.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 94c368c504..e79d16629e 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -2962,30 +2962,28 @@ String DisplayServerWindows::keyboard_get_layout_name(int p_index) const { } void DisplayServerWindows::process_events() { - _THREAD_SAFE_LOCK_ - - MSG msg; + ERR_FAIL_COND(!Thread::is_main_thread()); if (!drop_events) { joypad->process_joypads(); } + _THREAD_SAFE_LOCK_ + MSG msg = {}; while (PeekMessageW(&msg, nullptr, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessageW(&msg); } + _THREAD_SAFE_UNLOCK_ if (!drop_events) { _process_key_events(); - _THREAD_SAFE_UNLOCK_ Input::get_singleton()->flush_buffered_events(); - } else { - _THREAD_SAFE_UNLOCK_ } } void DisplayServerWindows::force_process_and_drop_events() { - _THREAD_SAFE_METHOD_ + ERR_FAIL_COND(!Thread::is_main_thread()); drop_events = true; process_events(); @@ -4664,10 +4662,12 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } break; case WM_TIMER: { if (wParam == windows[window_id].move_timer_id) { + _THREAD_SAFE_UNLOCK_ _process_key_events(); if (!Main::is_iterating()) { Main::iteration(); } + _THREAD_SAFE_LOCK_ } else if (wParam == windows[window_id].activate_timer_id) { _process_activate_event(window_id); KillTimer(windows[window_id].hWnd, windows[window_id].activate_timer_id); |