diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index ae29e7977d4d..694a843ab9e9 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -2309,9 +2309,11 @@ void Viewport::_gui_input_event(Ref p_event) { Ref touch_event = p_event; if (touch_event.is_valid()) { Size2 pos = touch_event->get_position(); + const int touch_index = touch_event->get_index(); if (touch_event->is_pressed()) { Control *over = _gui_find_control(pos); if (over) { + gui.touch_focus[touch_index] = over->get_instance_id(); if (!gui.modal_stack.empty()) { Control *top = gui.modal_stack.back()->get(); if (over != top && !top->is_a_parent_of(over)) { @@ -2331,14 +2333,22 @@ void Viewport::_gui_input_event(Ref p_event) { set_input_as_handled(); return; } - } else if (touch_event->get_index() == 0 && gui.last_mouse_focus) { - if (gui.last_mouse_focus->can_process()) { + } else { + ObjectID control_id = gui.touch_focus[touch_index]; + Control *over = Object::cast_to(ObjectDB::get_instance(control_id)); + if (over && over->can_process()) { touch_event = touch_event->xformed_by(Transform2D()); //make a copy - touch_event->set_position(gui.focus_inv_xform.xform(pos)); + if (over == gui.last_mouse_focus) { + pos = gui.focus_inv_xform.xform(pos); + } else { + pos = over->get_global_transform_with_canvas().affine_inverse().xform(pos); + } + touch_event->set_position(pos); - _gui_call_input(gui.last_mouse_focus, touch_event); + _gui_call_input(over, touch_event); } set_input_as_handled(); + gui.touch_focus.erase(touch_index); return; } } @@ -2370,7 +2380,9 @@ void Viewport::_gui_input_event(Ref p_event) { Ref drag_event = p_event; if (drag_event.is_valid()) { - Control *over = gui.mouse_focus; + const int drag_event_index = drag_event->get_index(); + ObjectID control_id = gui.touch_focus[drag_event_index]; + Control *over = Object::cast_to(ObjectDB::get_instance(control_id)); if (!over) { over = _gui_find_control(drag_event->get_position()); } diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 556c66285098..40c9b8cf4edf 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -296,6 +296,7 @@ class Viewport : public Node { bool key_event_accepted; bool mouse_in_window; + Map touch_focus; Control *mouse_focus; Control *last_mouse_focus; Control *mouse_click_grabber;