diff --git a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp index 24d0e63a04..646cdd1932 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp @@ -57,18 +57,18 @@ public: return lastPeer; } - Component* findComponentAt (Point screenPos) + static Component* findComponentAt (Point screenPos, ComponentPeer* peer) { - if (auto* peer = getPeer()) - { - auto relativePos = ScalingHelpers::unscaledScreenPosToScaled (peer->getComponent(), - peer->globalToLocal (screenPos)); - auto& comp = peer->getComponent(); + if (! ComponentPeer::isValidPeer (peer)) + return nullptr; - // (the contains() call is needed to test for overlapping desktop windows) - if (comp.contains (relativePos)) - return comp.getComponentAt (relativePos); - } + auto relativePos = ScalingHelpers::unscaledScreenPosToScaled (peer->getComponent(), + peer->globalToLocal (screenPos)); + auto& comp = peer->getComponent(); + + // (the contains() call is needed to test for overlapping desktop windows) + if (comp.contains (relativePos)) + return comp.getComponentAt (relativePos); return nullptr; } @@ -244,11 +244,12 @@ public: void setPeer (ComponentPeer& newPeer, const PointerState& pointerState, Time time) { - if (&newPeer != lastPeer) + if (&newPeer != lastPeer && ( findComponentAt (pointerState.position, &newPeer) != nullptr + || findComponentAt (pointerState.position, lastPeer) == nullptr)) { setComponentUnderMouse (nullptr, pointerState, time); lastPeer = &newPeer; - setComponentUnderMouse (findComponentAt (pointerState.position), pointerState, time); + setComponentUnderMouse (findComponentAt (pointerState.position, getPeer()), pointerState, time); } } @@ -257,7 +258,7 @@ public: const auto& newScreenPos = newPointerState.position; if (! isDragging()) - setComponentUnderMouse (findComponentAt (newScreenPos), newPointerState, time); + setComponentUnderMouse (findComponentAt (newScreenPos, getPeer()), newPointerState, time); if ((newPointerState != lastPointerState) || forceUpdate) {