From 47717f22fd8bf38973c1de15a72df63575388480 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sat, 31 May 2025 15:00:56 -0400 Subject: [PATCH] cocoa: Always add a window-sized NSTrackingArea to each window. Previously this was only done on older macOSes, but it seems to work on all versions, afaict. Reference Issue #12725. --- src/video/cocoa/SDL_cocoawindow.m | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 6d64e8ef1f..12135e5d91 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -2112,20 +2112,19 @@ static void Cocoa_SendMouseButtonClicks(SDL_Mouse *mouse, NSEvent *theEvent, SDL } } +// NSTrackingArea is how Cocoa tells you when the mouse cursor has entered or +// left certain regions. We put one over our entire window so we know when +// it has "mouse focus." - (void)updateTrackingAreas { [super updateTrackingAreas]; - if (@available(macOS 12.0, *)) { - // we (currently) use the tracking areas as a workaround for older macOSes, but we might be safe everywhere... - } else { - SDL_CocoaWindowData *windata = (__bridge SDL_CocoaWindowData *)_sdlWindow->internal; - if (_trackingArea) { - [self removeTrackingArea:_trackingArea]; - } - _trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways owner:windata.listener userInfo:nil]; - [self addTrackingArea:_trackingArea]; + SDL_CocoaWindowData *windata = (__bridge SDL_CocoaWindowData *)_sdlWindow->internal; + if (_trackingArea) { + [self removeTrackingArea:_trackingArea]; } + _trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways owner:windata.listener userInfo:nil]; + [self addTrackingArea:_trackingArea]; } @end