From 087f91559524b25229e1eb61f87080ef98c99569 Mon Sep 17 00:00:00 2001 From: attila Date: Fri, 11 Apr 2025 11:58:29 +0200 Subject: [PATCH] NSViewComponentPeer: Ignore mouseDragged messages during DnD operations Prior to this change trying to drag and drop a file onto a target inside a Viewport could cause hectic scrolling events. --- .../native/juce_NSViewComponentPeer_mac.mm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/modules/juce_gui_basics/native/juce_NSViewComponentPeer_mac.mm b/modules/juce_gui_basics/native/juce_NSViewComponentPeer_mac.mm index da5277063c..d1a28d9acb 100644 --- a/modules/juce_gui_basics/native/juce_NSViewComponentPeer_mac.mm +++ b/modules/juce_gui_basics/native/juce_NSViewComponentPeer_mac.mm @@ -744,6 +744,12 @@ public: void redirectMouseDrag (NSEvent* ev) { + // Very rarely we seem to receive mouseDragged messages in between draggingEntered and draggingExited + // messages. If our drag target is in a viewport, it can cause it to scroll around, so we ignore these + // stray mouseDragged messages. + if (draggingActive) + return; + ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withFlags (getModifierForButtonNumber ([ev buttonNumber])); sendMouseEvent (ev); } @@ -1472,6 +1478,12 @@ public: BOOL sendDragCallback (bool (ComponentPeer::* callback) (const DragInfo&), id sender) { + if (callback == &NSViewComponentPeer::handleDragMove) + draggingActive = true; + + if (callback == &NSViewComponentPeer::handleDragExit || callback == &NSViewComponentPeer::handleDragDrop) + draggingActive = false; + NSPasteboard* pasteboard = [sender draggingPasteboard]; NSString* contentType = [pasteboard availableTypeFromArray: getSupportedDragTypes()]; @@ -1732,6 +1744,7 @@ public: bool windowRepresentsFile = false; bool isAlwaysOnTop = false, wasAlwaysOnTop = false, inBecomeKeyWindow = false; bool inPerformKeyEquivalent = false; + bool draggingActive = false; String stringBeingComposed; int startOfMarkedTextInTextInputTarget = 0;