summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scene/main/viewport.cpp40
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();