diff options
-rw-r--r-- | scene/main/viewport.cpp | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 313be88526..d3f0a6e2e0 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1492,22 +1492,30 @@ void Viewport::_gui_call_input(Control *p_control,const InputEvent& p_input) { // _block(); - while(p_control) { - - p_control->call_multilevel(SceneStringNames::get_singleton()->_input_event,p_input); - if (gui.key_event_accepted) - break; - if (!p_control->is_inside_tree()) - break; - p_control->emit_signal(SceneStringNames::get_singleton()->input_event,p_input); - if (!p_control->is_inside_tree() || p_control->is_set_as_toplevel()) { - break; - } - if (gui.key_event_accepted) - break; - if (p_control->data.stop_mouse && (p_input.type==InputEvent::MOUSE_BUTTON || p_input.type==InputEvent::MOUSE_MOTION)) - break; - p_control=p_control->data.parent; + CanvasItem *ci=p_control; + while(ci) { + + Control *control = ci->cast_to<Control>(); + if (control) { + control->call_multilevel(SceneStringNames::get_singleton()->_input_event,p_input); + if (gui.key_event_accepted) + break; + if (!control->is_inside_tree()) + break; + control->emit_signal(SceneStringNames::get_singleton()->input_event,p_input); + if (!control->is_inside_tree() || control->is_set_as_toplevel()) { + break; + } + if (gui.key_event_accepted) + break; + if (control->data.stop_mouse && (p_input.type==InputEvent::MOUSE_BUTTON || p_input.type==InputEvent::MOUSE_MOTION)) + break; + } + + if (ci->is_set_as_toplevel()) + break; + + ci=ci->get_parent_item(); } //_unblock(); |