diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index f5cd31f29e..0725c6d3e8 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -40,6 +40,29 @@ using CheckEventBlockedByModalComps = bool (*) (NSEvent*); extern CheckEventBlockedByModalComps isEventBlockedByModalComps; //============================================================================== +static void resetTrackingArea (NSView* view) +{ + const auto trackingAreas = [view trackingAreas]; + + jassert ([trackingAreas count] <= 1); + + for (NSTrackingArea* area in trackingAreas) + [view removeTrackingArea: area]; + + const auto options = NSTrackingMouseEnteredAndExited + | NSTrackingMouseMoved + | NSTrackingEnabledDuringMouseDrag + | NSTrackingActiveAlways + | NSTrackingInVisibleRect; + + const NSUniquePtr trackingArea { [[NSTrackingArea alloc] initWithRect: [view bounds] + options: options + owner: view + userInfo: nil] }; + + [view addTrackingArea: trackingArea.get()]; +} + static constexpr int translateVirtualToAsciiKeyCode (int keyCode) noexcept { switch (keyCode) @@ -119,16 +142,7 @@ public: [view registerForDraggedTypes: getSupportedDragTypes()]; - const auto options = NSTrackingMouseEnteredAndExited - | NSTrackingMouseMoved - | NSTrackingEnabledDuringMouseDrag - | NSTrackingActiveAlways - | NSTrackingInVisibleRect; - const NSUniquePtr trackingArea { [[NSTrackingArea alloc] initWithRect: r - options: options - owner: view - userInfo: nil] }; - [view addTrackingArea: trackingArea.get()]; + resetTrackingArea (view); notificationCenter = [NSNotificationCenter defaultCenter]; @@ -1926,6 +1940,7 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> { addMethod (@selector (isOpaque), isOpaque); addMethod (@selector (drawRect:), drawRect); + addMethod (@selector (updateTrackingAreas), updateTrackingAreas); addMethod (@selector (mouseDown:), mouseDown); addMethod (@selector (mouseUp:), mouseUp); addMethod (@selector (mouseDragged:), mouseDragged); @@ -2009,6 +2024,13 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> } private: + static void updateTrackingAreas (id self, SEL) + { + sendSuperclassMessage (self, @selector (updateTrackingAreas)); + + resetTrackingArea (static_cast (self)); + } + static void mouseDown (id self, SEL s, NSEvent* ev) { if (JUCEApplicationBase::isStandaloneApp())