diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index 3ed50b82be..290f027afb 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -123,47 +123,32 @@ public: template static void sendMouseEvent (HierarchyChecker& checker, EventMethod&& eventMethod, Params&&... params) { - auto* parent = checker.nearestNonNullParent(); - - if (parent == nullptr) - return; - - if (auto* list = parent->mouseListeners.get()) + const auto callListeners = [&] (auto& parentComp, const auto findNumListeners) { - for (int i = list->listeners.size(); --i >= 0;) + if (auto* list = parentComp.mouseListeners.get()) { - (list->listeners.getUnchecked (i)->*eventMethod) (checker.eventWithNearestParent(), params...); + const WeakReference safePointer { &parentComp }; - if (checker.shouldBailOut()) - return; - - i = jmin (i, list->listeners.size()); - } - } - - for (Component* p = checker.nearestNonNullParent()->parentComponent; p != nullptr; p = p->parentComponent) - { - if (auto* list = p->mouseListeners.get()) - { - if (list->numDeepMouseListeners > 0) + for (int i = findNumListeners (*list); --i >= 0; i = jmin (i, findNumListeners (*list))) { - const auto shouldBailOut = [&checker, safePointer = WeakReference { p }] - { - return checker.shouldBailOut() || safePointer == nullptr; - }; + (list->listeners.getUnchecked (i)->*eventMethod) (checker.eventWithNearestParent(), params...); - for (int i = list->numDeepMouseListeners; --i >= 0;) - { - (list->listeners.getUnchecked(i)->*eventMethod) (checker.eventWithNearestParent(), params...); - - if (shouldBailOut()) - return; - - i = jmin (i, list->numDeepMouseListeners); - } + if (checker.shouldBailOut() || safePointer == nullptr) + return false; } } - } + + return true; + }; + + if (auto* parent = checker.nearestNonNullParent()) + if (! callListeners (*parent, [] (auto& list) { return list.listeners.size(); })) + return; + + if (auto* parent = checker.nearestNonNullParent()) + for (Component* p = parent->parentComponent; p != nullptr; p = p->parentComponent) + if (! callListeners (*p, [] (auto& list) { return list.numDeepMouseListeners; })) + return; } private: