Fix scene reload crash caused by mouse cursor update

After a scene reload a mouse cursor updates is performed via a
InputEventMouseMotion, that is exposed to the user.
The state of Input is however not adjusted to this InputEventMouseMotion
which can lead to inconsistencies.
This PR makes sure, that it is not exposed to the user.
It utilizes the method of Viewport::_process_picking for marking
events that are not sent to the user, so that this function doesn't
need to be changed.
This commit is contained in:
Markus Sauermann 2022-11-28 22:54:47 +01:00
parent 929ee61170
commit 5bb66d3cfb
3 changed files with 25 additions and 10 deletions

View file

@ -1735,13 +1735,18 @@ real_t Control::get_stretch_ratio() const {
// Input events.
void Control::_call_gui_input(const Ref<InputEvent> &p_event) {
emit_signal(SceneStringNames::get_singleton()->gui_input, p_event); //signal should be first, so it's possible to override an event (and then accept it)
if (!is_inside_tree() || get_viewport()->is_input_handled()) {
return; //input was handled, abort
if (p_event->get_device() != InputEvent::DEVICE_ID_INTERNAL) {
emit_signal(SceneStringNames::get_singleton()->gui_input, p_event); // Signal should be first, so it's possible to override an event (and then accept it).
}
GDVIRTUAL_CALL(_gui_input, p_event);
if (!is_inside_tree() || get_viewport()->is_input_handled()) {
return; //input was handled, abort
return; // Input was handled, abort.
}
if (p_event->get_device() != InputEvent::DEVICE_ID_INTERNAL) {
GDVIRTUAL_CALL(_gui_input, p_event);
}
if (!is_inside_tree() || get_viewport()->is_input_handled()) {
return; // Input was handled, abort.
}
gui_input(p_event);
}

View file

@ -2764,7 +2764,9 @@ void Node::request_ready() {
}
void Node::_call_input(const Ref<InputEvent> &p_event) {
GDVIRTUAL_CALL(_input, p_event);
if (p_event->get_device() != InputEvent::DEVICE_ID_INTERNAL) {
GDVIRTUAL_CALL(_input, p_event);
}
if (!is_inside_tree() || !get_viewport() || get_viewport()->is_input_handled()) {
return;
}
@ -2772,7 +2774,9 @@ void Node::_call_input(const Ref<InputEvent> &p_event) {
}
void Node::_call_shortcut_input(const Ref<InputEvent> &p_event) {
GDVIRTUAL_CALL(_shortcut_input, p_event);
if (p_event->get_device() != InputEvent::DEVICE_ID_INTERNAL) {
GDVIRTUAL_CALL(_shortcut_input, p_event);
}
if (!is_inside_tree() || !get_viewport() || get_viewport()->is_input_handled()) {
return;
}
@ -2780,7 +2784,9 @@ void Node::_call_shortcut_input(const Ref<InputEvent> &p_event) {
}
void Node::_call_unhandled_input(const Ref<InputEvent> &p_event) {
GDVIRTUAL_CALL(_unhandled_input, p_event);
if (p_event->get_device() != InputEvent::DEVICE_ID_INTERNAL) {
GDVIRTUAL_CALL(_unhandled_input, p_event);
}
if (!is_inside_tree() || !get_viewport() || get_viewport()->is_input_handled()) {
return;
}
@ -2788,7 +2794,9 @@ void Node::_call_unhandled_input(const Ref<InputEvent> &p_event) {
}
void Node::_call_unhandled_key_input(const Ref<InputEvent> &p_event) {
GDVIRTUAL_CALL(_unhandled_key_input, p_event);
if (p_event->get_device() != InputEvent::DEVICE_ID_INTERNAL) {
GDVIRTUAL_CALL(_unhandled_key_input, p_event);
}
if (!is_inside_tree() || !get_viewport() || get_viewport()->is_input_handled()) {
return;
}

View file

@ -1360,7 +1360,9 @@ void Window::_window_input(const Ref<InputEvent> &p_ev) {
}
}
emit_signal(SceneStringNames::get_singleton()->window_input, p_ev);
if (p_ev->get_device() != InputEvent::DEVICE_ID_INTERNAL) {
emit_signal(SceneStringNames::get_singleton()->window_input, p_ev);
}
push_input(p_ev);
if (!is_input_handled()) {