From 47717f22fd8bf38973c1de15a72df63575388480 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
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 6d64e8ef1fd56..12135e5d91af3 100644
--- a/src/video/cocoa/SDL_cocoawindow.m
+++ b/src/video/cocoa/SDL_cocoawindow.m
@@ -2112,20 +2112,19 @@ - (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
}
}
+// 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