From c4db21287097bbd82cd6efe943d449e5af35d01c Mon Sep 17 00:00:00 2001 From: RedworkDE <10944644+RedworkDE@users.noreply.github.com> Date: Fri, 2 Jun 2023 09:47:13 +0200 Subject: [PATCH] Prevent crashes when removing Viewport from scene tree in event handler --- scene/main/viewport.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index e7970b212ee1..fe9298d92bc7 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -2988,10 +2988,12 @@ void Viewport::push_input(const Ref &p_event, bool p_local_coords) { } if (!is_input_handled()) { + ERR_FAIL_COND(!is_inside_tree()); get_tree()->_call_input_pause(input_group, SceneTree::CALL_INPUT_TYPE_INPUT, ev, this); //not a bug, must happen before GUI, order is _input -> gui input -> _unhandled input } if (!is_input_handled()) { + ERR_FAIL_COND(!is_inside_tree()); _gui_input_event(ev); } else { // Cleanup internal GUI state after accepting event during _input(). @@ -3036,16 +3038,19 @@ void Viewport::push_unhandled_input(const Ref &p_event, bool p_local void Viewport::_push_unhandled_input_internal(const Ref &p_event) { // Shortcut Input. if (Object::cast_to(*p_event) != nullptr || Object::cast_to(*p_event) != nullptr || Object::cast_to(*p_event) != nullptr) { + ERR_FAIL_COND(!is_inside_tree()); get_tree()->_call_input_pause(shortcut_input_group, SceneTree::CALL_INPUT_TYPE_SHORTCUT_INPUT, p_event, this); } // Unhandled Input. if (!is_input_handled()) { + ERR_FAIL_COND(!is_inside_tree()); get_tree()->_call_input_pause(unhandled_input_group, SceneTree::CALL_INPUT_TYPE_UNHANDLED_INPUT, p_event, this); } // Unhandled key Input - Used for performance reasons - This is called a lot less than _unhandled_input since it ignores MouseMotion, and to handle Unicode input with Alt / Ctrl modifiers after handling shortcuts. if (!is_input_handled() && (Object::cast_to(*p_event) != nullptr)) { + ERR_FAIL_COND(!is_inside_tree()); get_tree()->_call_input_pause(unhandled_key_input_group, SceneTree::CALL_INPUT_TYPE_UNHANDLED_KEY_INPUT, p_event, this); }