From d90add3307d77d5fc7808228a236a4f2e49907a7 Mon Sep 17 00:00:00 2001 From: hogliux Date: Tue, 8 May 2018 16:19:18 +0100 Subject: [PATCH] PopupMenu: Fixed a bug causing an unintentional menu item highlight disco party when using a popup menu in a plug-in's UI --- .../utility/juce_FakeMouseMoveGenerator.h | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h b/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h index f2620756be..c05a48edbd 100644 --- a/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h +++ b/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h @@ -41,6 +41,25 @@ public: startTimer (1000 / 30); } + static bool componentContainsAudioProcessorEditor (Component* comp) noexcept + { + if (dynamic_cast (comp) != nullptr) + return true; + + auto n = comp->getNumChildComponents(); + + for (int i = 0; i < n; ++i) + { + if (auto* child = comp->getChildComponent (i)) + { + if (componentContainsAudioProcessorEditor (child)) + return true; + } + } + + return false; + } + void timerCallback() override { // Workaround for windows not getting mouse-moves... @@ -55,30 +74,33 @@ public: { if (auto* comp = Desktop::getInstance().findComponentAt (screenPos.roundToInt())) { - safeOldComponent = comp; - - if (auto* peer = comp->getPeer()) + if (componentContainsAudioProcessorEditor (comp->getTopLevelComponent())) { - if (! peer->isFocused()) + safeOldComponent = comp; + + if (auto* peer = comp->getPeer()) { - peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, peer->globalToLocal (screenPos), mods, - MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, Time::currentTimeMillis()); + if (! peer->isFocused()) + { + peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, peer->globalToLocal (screenPos), mods, + MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, Time::currentTimeMillis()); + } } + + return; } } - else + + if (safeOldComponent != nullptr) { - if (safeOldComponent != nullptr) + if (auto* peer = safeOldComponent->getPeer()) { - if (auto* peer = safeOldComponent->getPeer()) - { - peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, { -1.0f, -1.0f }, mods, - MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, Time::currentTimeMillis()); - } + peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, { -1.0f, -1.0f }, mods, + MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, Time::currentTimeMillis()); } - - safeOldComponent = nullptr; } + + safeOldComponent = nullptr; } } }