Improve input event accumulation

- API has been simplified: all events now go through `parse_input_event()`. Whether they are accumulated or not depends on the `use_accumulated_input` flag.
- Event accumulation is now thread-safe (it was not needed so far, but it prepares the ground for the following changes).
- Touch drag events now support accumulation.
This commit is contained in:
Pedro J. Estébanez
2021-08-13 00:31:16 +02:00
parent 39efccf3b8
commit 7c864d41c9
8 changed files with 67 additions and 52 deletions

View File

@@ -460,10 +460,6 @@ Vector3 Input::get_gyroscope() const {
return gyroscope;
}
void Input::parse_input_event(const Ref<InputEvent> &p_event) {
_parse_input_event_impl(p_event, false);
}
void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_emulated) {
// Notes on mouse-touch emulation:
// - Emulated mouse events are parsed, that is, re-routed to this method, so they make the same effects
@@ -472,8 +468,6 @@ void Input::_parse_input_event_impl(const Ref<InputEvent> &p_event, bool p_is_em
// - Emulated touch events are handed right to the main loop (i.e., the SceneTree) because they don't
// require additional handling by this class.
_THREAD_SAFE_METHOD_
Ref<InputEventKey> k = p_event;
if (k.is_valid() && !k->is_echo() && k->get_keycode() != 0) {
if (k->is_pressed()) {
@@ -838,11 +832,13 @@ void Input::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, co
set_custom_mouse_cursor_func(p_cursor, p_shape, p_hotspot);
}
void Input::accumulate_input_event(const Ref<InputEvent> &p_event) {
void Input::parse_input_event(const Ref<InputEvent> &p_event) {
_THREAD_SAFE_METHOD_
ERR_FAIL_COND(p_event.is_null());
if (!use_accumulated_input) {
parse_input_event(p_event);
_parse_input_event_impl(p_event, false);
return;
}
if (!accumulated_events.is_empty() && accumulated_events.back()->get()->accumulate(p_event)) {
@@ -853,8 +849,10 @@ void Input::accumulate_input_event(const Ref<InputEvent> &p_event) {
}
void Input::flush_accumulated_events() {
_THREAD_SAFE_METHOD_
while (accumulated_events.front()) {
parse_input_event(accumulated_events.front()->get());
_parse_input_event_impl(accumulated_events.front()->get(), false);
accumulated_events.pop_front();
}
}