diff --git a/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h b/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h index 9c2c9d229d..cb73184ea2 100644 --- a/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h +++ b/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h @@ -88,7 +88,7 @@ public: { if (auto* peer = safeOldComponent->getPeer()) { - peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, { -1.0f, -1.0f }, mods, + peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, MouseInputSource::offscreenMousePos, mods, MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, Time::currentTimeMillis()); } } diff --git a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp index 00dedfc0be..b38a02ad4a 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp @@ -96,7 +96,8 @@ public: Point getRawScreenPosition() const noexcept { - return unboundedMouseOffset + MouseInputSource::getCurrentRawMousePosition(); + return unboundedMouseOffset + (inputType != MouseInputSource::InputSourceType::touch ? MouseInputSource::getCurrentRawMousePosition() + : lastScreenPos); } void setScreenPosition (Point p) @@ -271,7 +272,9 @@ public: if (newScreenPos != lastScreenPos || forceUpdate) { cancelPendingUpdate(); - lastScreenPos = newScreenPos; + + if (newScreenPos != MouseInputSource::offscreenMousePos) + lastScreenPos = newScreenPos; if (auto* current = getComponentUnderMouse()) { @@ -648,6 +651,8 @@ const float MouseInputSource::invalidRotation = 0.0f; const float MouseInputSource::invalidTiltX = 0.0f; const float MouseInputSource::invalidTiltY = 0.0f; +const Point MouseInputSource::offscreenMousePos { -10.0f, -10.0f }; + // Deprecated method bool MouseInputSource::hasMouseMovedSignificantlySincePressed() const noexcept { return pimpl->hasMouseMovedSignificantlySincePressed(); } diff --git a/modules/juce_gui_basics/mouse/juce_MouseInputSource.h b/modules/juce_gui_basics/mouse/juce_MouseInputSource.h index 11e13b2c3b..f10f3d000d 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInputSource.h +++ b/modules/juce_gui_basics/mouse/juce_MouseInputSource.h @@ -237,6 +237,11 @@ public: static const float invalidTiltX; static const float invalidTiltY; + /** An offscreen mouse position used when triggering mouse exits where we don't want to move + the cursor over an existing component. + */ + static const Point offscreenMousePos; + #if ! DOXYGEN // This method has been deprecated and replaced with the isLongPressOrDrag() and hasMovedSignificantlySincePressed() // methods. If you want the same behaviour you should use isLongPressOrDrag() which accounts for the amount of time diff --git a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm index d5499fd859..aa2d572635 100644 --- a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm @@ -900,7 +900,7 @@ void UIViewComponentPeer::handleTouches (UIEvent* event, const bool isDown, cons if (isUp || isCancel) { - handleMouseEvent (MouseInputSource::InputSourceType::touch, Point (-1.0f, -1.0f), modsToSend, + handleMouseEvent (MouseInputSource::InputSourceType::touch, MouseInputSource::offscreenMousePos, modsToSend, MouseInputSource::invalidPressure, MouseInputSource::invalidOrientation, time, {}, touchIndex); if (! isValidPeer (this)) diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 7cd49c340a..05bb34b454 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -632,7 +632,7 @@ public: sendMouseEvent (ev); else // moved into another window which overlaps this one, so trigger an exit - handleMouseEvent (MouseInputSource::InputSourceType::mouse, { -1.0f, -1.0f }, ModifierKeys::currentModifiers, + handleMouseEvent (MouseInputSource::InputSourceType::mouse, MouseInputSource::offscreenMousePos, ModifierKeys::currentModifiers, getMousePressure (ev), MouseInputSource::invalidOrientation, getMouseTime (ev)); showArrowCursorIfNeeded(); diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 8152d70f65..655a7e27cd 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -621,9 +621,6 @@ int64 getMouseEventTime() return eventTimeOffset + thisMessageTime; } -Point juce_lastTouchPos; -static JUCE_CONSTEXPR Point juce_invalidTouchPos { -10.0f, -10.0f }; - //============================================================================== const int extendedKeyModifier = 0x10000; @@ -2442,8 +2439,6 @@ private: //============================================================================== void doMouseEvent (Point position, float pressure, float orientation = 0.0f, ModifierKeys mods = ModifierKeys::currentModifiers) { - juce_lastTouchPos = juce_invalidTouchPos; - handleMouseEvent (MouseInputSource::InputSourceType::mouse, position, mods, pressure, orientation, getMouseEventTime()); } @@ -2772,8 +2767,6 @@ private: const auto pressure = touchPressure; auto modsToSend = ModifierKeys::currentModifiers; - juce_lastTouchPos = pos; - if (isDown) { ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withoutMouseButtons().withFlags (ModifierKeys::leftButtonModifier); @@ -2808,7 +2801,7 @@ private: if (isUp) { - handleMouseEvent (MouseInputSource::InputSourceType::touch, juce_invalidTouchPos, ModifierKeys::currentModifiers.withoutMouseButtons(), + handleMouseEvent (MouseInputSource::InputSourceType::touch, MouseInputSource::offscreenMousePos, ModifierKeys::currentModifiers.withoutMouseButtons(), pressure, orientation, time, {}, touchIndex); if (! isValidPeer (this)) @@ -2921,7 +2914,7 @@ private: if (isUp) { - handleMouseEvent (MouseInputSource::InputSourceType::pen, juce_invalidTouchPos, ModifierKeys::currentModifiers, + handleMouseEvent (MouseInputSource::InputSourceType::pen, MouseInputSource::offscreenMousePos, ModifierKeys::currentModifiers, pressure, MouseInputSource::invalidOrientation, time, penDetails); if (! isValidPeer (this)) @@ -4288,9 +4281,6 @@ bool MouseInputSource::SourceList::canUseTouch() Point MouseInputSource::getCurrentRawMousePosition() { - if (juce_lastTouchPos != juce_invalidTouchPos) - return juce_lastTouchPos; - POINT mousePos; GetCursorPos (&mousePos);