diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index a1d228c641..c2b21bfd22 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -41,6 +41,29 @@ namespace juce { //============================================================================== +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) @@ -121,16 +144,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]; @@ -1843,6 +1857,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); @@ -1925,6 +1940,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())