Fix input event being dispatched multiple times on Windows

This commit is contained in:
HaSa1002 2020-04-02 16:06:04 +02:00
parent ac58372db8
commit 434bf0572c
2 changed files with 10 additions and 0 deletions

View File

@ -1695,6 +1695,12 @@ void DisplayServerWindows::_dispatch_input_events(const Ref<InputEvent> &p_event
} }
void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event) { void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event) {
_THREAD_SAFE_METHOD_
if (in_dispatch_input_event) {
return;
}
in_dispatch_input_event = true;
Variant ev = p_event; Variant ev = p_event;
Variant *evp = &ev; Variant *evp = &ev;
Variant ret; Variant ret;
@ -1706,6 +1712,7 @@ void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event)
ERR_FAIL_COND(!windows.has(event_from_window->get_window_id())); ERR_FAIL_COND(!windows.has(event_from_window->get_window_id()));
Callable callable = windows[event_from_window->get_window_id()].input_event_callback; Callable callable = windows[event_from_window->get_window_id()].input_event_callback;
if (callable.is_null()) { if (callable.is_null()) {
in_dispatch_input_event = false;
return; return;
} }
callable.call((const Variant **)&evp, 1, ret, ce); callable.call((const Variant **)&evp, 1, ret, ce);
@ -1719,6 +1726,8 @@ void DisplayServerWindows::_dispatch_input_event(const Ref<InputEvent> &p_event)
callable.call((const Variant **)&evp, 1, ret, ce); callable.call((const Variant **)&evp, 1, ret, ce);
} }
} }
in_dispatch_input_event = false;
} }
LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

View File

@ -388,6 +388,7 @@ class DisplayServerWindows : public DisplayServer {
uint32_t last_button_state = 0; uint32_t last_button_state = 0;
bool use_raw_input = false; bool use_raw_input = false;
bool drop_events = false; bool drop_events = false;
bool in_dispatch_input_event = false;
bool console_visible = false; bool console_visible = false;
WNDCLASSEXW wc; WNDCLASSEXW wc;