Prevent crashes when removing Viewport from scene tree in event handler
This commit is contained in:
parent
621d68e412
commit
c4db212870
1 changed files with 5 additions and 0 deletions
|
@ -2988,10 +2988,12 @@ void Viewport::push_input(const Ref<InputEvent> &p_event, bool p_local_coords) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_input_handled()) {
|
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
|
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()) {
|
if (!is_input_handled()) {
|
||||||
|
ERR_FAIL_COND(!is_inside_tree());
|
||||||
_gui_input_event(ev);
|
_gui_input_event(ev);
|
||||||
} else {
|
} else {
|
||||||
// Cleanup internal GUI state after accepting event during _input().
|
// Cleanup internal GUI state after accepting event during _input().
|
||||||
|
@ -3036,16 +3038,19 @@ void Viewport::push_unhandled_input(const Ref<InputEvent> &p_event, bool p_local
|
||||||
void Viewport::_push_unhandled_input_internal(const Ref<InputEvent> &p_event) {
|
void Viewport::_push_unhandled_input_internal(const Ref<InputEvent> &p_event) {
|
||||||
// Shortcut Input.
|
// Shortcut Input.
|
||||||
if (Object::cast_to<InputEventKey>(*p_event) != nullptr || Object::cast_to<InputEventShortcut>(*p_event) != nullptr || Object::cast_to<InputEventJoypadButton>(*p_event) != nullptr) {
|
if (Object::cast_to<InputEventKey>(*p_event) != nullptr || Object::cast_to<InputEventShortcut>(*p_event) != nullptr || Object::cast_to<InputEventJoypadButton>(*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);
|
get_tree()->_call_input_pause(shortcut_input_group, SceneTree::CALL_INPUT_TYPE_SHORTCUT_INPUT, p_event, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unhandled Input.
|
// Unhandled Input.
|
||||||
if (!is_input_handled()) {
|
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);
|
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.
|
// 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<InputEventKey>(*p_event) != nullptr)) {
|
if (!is_input_handled() && (Object::cast_to<InputEventKey>(*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);
|
get_tree()->_call_input_pause(unhandled_key_input_group, SceneTree::CALL_INPUT_TYPE_UNHANDLED_KEY_INPUT, p_event, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue