|
@@ -62,6 +62,10 @@
|
|
|
#define NSAppKitVersionNumber10_14 1671
|
|
|
#endif
|
|
|
|
|
|
+@implementation SDL_WindowData
|
|
|
+
|
|
|
+@end
|
|
|
+
|
|
|
@interface NSWindow (SDL)
|
|
|
#if MAC_OS_X_VERSION_MAX_ALLOWED < 101000 /* Added in the 10.10 SDK */
|
|
|
@property (readonly) NSRect contentLayoutRect;
|
|
@@ -227,7 +231,7 @@
|
|
|
/* !!! FIXME: is there a better way to do this? */
|
|
|
if (_this) {
|
|
|
for (sdlwindow = _this->windows; sdlwindow; sdlwindow = sdlwindow->next) {
|
|
|
- NSWindow *nswindow = ((SDL_WindowData *) sdlwindow->driverdata)->nswindow;
|
|
|
+ NSWindow *nswindow = ((__bridge SDL_WindowData *) sdlwindow->driverdata).nswindow;
|
|
|
if (nswindow == self) {
|
|
|
break;
|
|
|
}
|
|
@@ -250,7 +254,7 @@ static void ConvertNSRect(NSScreen *screen, BOOL fullscreen, NSRect *r)
|
|
|
static void
|
|
|
ScheduleContextUpdates(SDL_WindowData *data)
|
|
|
{
|
|
|
- if (!data || !data->nscontexts) {
|
|
|
+ if (!data || !data.nscontexts) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -261,7 +265,7 @@ ScheduleContextUpdates(SDL_WindowData *data)
|
|
|
#endif
|
|
|
|
|
|
NSOpenGLContext *currentContext = [NSOpenGLContext currentContext];
|
|
|
- NSMutableArray *contexts = data->nscontexts;
|
|
|
+ NSMutableArray *contexts = data.nscontexts;
|
|
|
@synchronized (contexts) {
|
|
|
for (SDLOpenGLContext *context in contexts) {
|
|
|
if (context == currentContext) {
|
|
@@ -316,19 +320,19 @@ GetWindowStyle(SDL_Window * window)
|
|
|
static SDL_bool
|
|
|
SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
- NSWindow *nswindow = data->nswindow;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ NSWindow *nswindow = data.nswindow;
|
|
|
|
|
|
/* The view responder chain gets messed with during setStyleMask */
|
|
|
- if ([data->sdlContentView nextResponder] == data->listener) {
|
|
|
- [data->sdlContentView setNextResponder:nil];
|
|
|
+ if ([data.sdlContentView nextResponder] == data.listener) {
|
|
|
+ [data.sdlContentView setNextResponder:nil];
|
|
|
}
|
|
|
|
|
|
[nswindow setStyleMask:style];
|
|
|
|
|
|
/* The view responder chain gets messed with during setStyleMask */
|
|
|
- if ([data->sdlContentView nextResponder] != data->listener) {
|
|
|
- [data->sdlContentView setNextResponder:data->listener];
|
|
|
+ if ([data.sdlContentView nextResponder] != data.listener) {
|
|
|
+ [data.sdlContentView setNextResponder:data.listener];
|
|
|
}
|
|
|
|
|
|
return SDL_TRUE;
|
|
@@ -337,9 +341,9 @@ SetWindowStyle(SDL_Window * window, NSUInteger style)
|
|
|
static SDL_bool
|
|
|
ShouldAdjustCoordinatesForGrab(SDL_Window * window)
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
- if (!data || [data->listener isMovingOrFocusClickPending]) {
|
|
|
+ if (!data || [data.listener isMovingOrFocusClickPending]) {
|
|
|
return SDL_FALSE;
|
|
|
}
|
|
|
|
|
@@ -396,10 +400,10 @@ AdjustCoordinatesForGrab(SDL_Window * window, int x, int y, CGPoint *adjusted)
|
|
|
static void
|
|
|
Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_13_2) {
|
|
|
- NSWindow *nswindow = data->nswindow;
|
|
|
+ NSWindow *nswindow = data.nswindow;
|
|
|
SDL_Rect mouse_rect;
|
|
|
|
|
|
SDL_zero(mouse_rect);
|
|
@@ -453,8 +457,8 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
- (void)listen:(SDL_WindowData *)data
|
|
|
{
|
|
|
NSNotificationCenter *center;
|
|
|
- NSWindow *window = data->nswindow;
|
|
|
- NSView *view = data->sdlContentView;
|
|
|
+ NSWindow *window = data.nswindow;
|
|
|
+ NSView *view = data.sdlContentView;
|
|
|
|
|
|
_data = data;
|
|
|
observingVisible = YES;
|
|
@@ -515,12 +519,12 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (object == _data->nswindow && [keyPath isEqualToString:@"visible"]) {
|
|
|
+ if (object == _data.nswindow && [keyPath isEqualToString:@"visible"]) {
|
|
|
int newVisibility = [[change objectForKey:@"new"] intValue];
|
|
|
if (newVisibility) {
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_SHOWN, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_SHOWN, 0, 0);
|
|
|
} else {
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_HIDDEN, 0, 0);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -528,18 +532,18 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
-(void) pauseVisibleObservation
|
|
|
{
|
|
|
observingVisible = NO;
|
|
|
- wasVisible = [_data->nswindow isVisible];
|
|
|
+ wasVisible = [_data.nswindow isVisible];
|
|
|
}
|
|
|
|
|
|
-(void) resumeVisibleObservation
|
|
|
{
|
|
|
- BOOL isVisible = [_data->nswindow isVisible];
|
|
|
+ BOOL isVisible = [_data.nswindow isVisible];
|
|
|
observingVisible = YES;
|
|
|
if (wasVisible != isVisible) {
|
|
|
if (isVisible) {
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_SHOWN, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_SHOWN, 0, 0);
|
|
|
} else {
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_HIDDEN, 0, 0);
|
|
|
}
|
|
|
|
|
|
wasVisible = isVisible;
|
|
@@ -548,11 +552,11 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
-(BOOL) setFullscreenSpace:(BOOL) state
|
|
|
{
|
|
|
- SDL_Window *window = _data->window;
|
|
|
- NSWindow *nswindow = _data->nswindow;
|
|
|
- SDL_VideoData *videodata = ((SDL_WindowData *) window->driverdata)->videodata;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
+ NSWindow *nswindow = _data.nswindow;
|
|
|
+ SDL_VideoData *videodata = ((__bridge SDL_WindowData *) window->driverdata).videodata;
|
|
|
|
|
|
- if (!videodata->allow_spaces) {
|
|
|
+ if (!videodata.allow_spaces) {
|
|
|
return NO; /* Spaces are forcibly disabled. */
|
|
|
} else if (state && ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != SDL_WINDOW_FULLSCREEN_DESKTOP)) {
|
|
|
return NO; /* we only allow you to make a Space on FULLSCREEN_DESKTOP windows. */
|
|
@@ -596,7 +600,7 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
- (void)close
|
|
|
{
|
|
|
NSNotificationCenter *center;
|
|
|
- NSWindow *window = _data->nswindow;
|
|
|
+ NSWindow *window = _data.nswindow;
|
|
|
NSView *view = [window contentView];
|
|
|
|
|
|
center = [NSNotificationCenter defaultCenter];
|
|
@@ -678,15 +682,15 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
mouse->WarpMouseGlobal(pendingWindowWarpX, pendingWindowWarpY);
|
|
|
pendingWindowWarpX = pendingWindowWarpY = INT_MAX;
|
|
|
}
|
|
|
- if (mouse->relative_mode && !mouse->relative_mode_warp && mouse->focus == _data->window) {
|
|
|
+ if (mouse->relative_mode && !mouse->relative_mode_warp && mouse->focus == _data.window) {
|
|
|
/* Move the cursor to the nearest point in the window */
|
|
|
{
|
|
|
int x, y;
|
|
|
CGPoint cgpoint;
|
|
|
|
|
|
SDL_GetMouseState(&x, &y);
|
|
|
- cgpoint.x = _data->window->x + x;
|
|
|
- cgpoint.y = _data->window->y + y;
|
|
|
+ cgpoint.x = _data.window->x + x;
|
|
|
+ cgpoint.y = _data.window->y + y;
|
|
|
|
|
|
Cocoa_HandleMouseWarp(cgpoint.x, cgpoint.y);
|
|
|
|
|
@@ -696,25 +700,25 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
mouse->SetRelativeMouseMode(SDL_TRUE);
|
|
|
} else {
|
|
|
- Cocoa_UpdateClipCursor(_data->window);
|
|
|
+ Cocoa_UpdateClipCursor(_data.window);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- (BOOL)windowShouldClose:(id)sender
|
|
|
{
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_CLOSE, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_CLOSE, 0, 0);
|
|
|
return NO;
|
|
|
}
|
|
|
|
|
|
- (void)windowDidExpose:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_EXPOSED, 0, 0);
|
|
|
}
|
|
|
|
|
|
- (void)windowWillMove:(NSNotification *)aNotification
|
|
|
{
|
|
|
- if ([_data->nswindow isKindOfClass:[SDLWindow class]]) {
|
|
|
+ if ([_data.nswindow isKindOfClass:[SDLWindow class]]) {
|
|
|
pendingWindowWarpX = pendingWindowWarpY = INT_MAX;
|
|
|
isMoving = YES;
|
|
|
}
|
|
@@ -723,8 +727,8 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
- (void)windowDidMove:(NSNotification *)aNotification
|
|
|
{
|
|
|
int x, y;
|
|
|
- SDL_Window *window = _data->window;
|
|
|
- NSWindow *nswindow = _data->nswindow;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
+ NSWindow *nswindow = _data.nswindow;
|
|
|
BOOL fullscreen = window->flags & FULLSCREEN_MASK;
|
|
|
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
|
|
ConvertNSRect([nswindow screen], fullscreen, &rect);
|
|
@@ -764,8 +768,8 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- SDL_Window *window = _data->window;
|
|
|
- NSWindow *nswindow = _data->nswindow;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
+ NSWindow *nswindow = _data.nswindow;
|
|
|
int x, y, w, h;
|
|
|
NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]];
|
|
|
ConvertNSRect([nswindow screen], (window->flags & FULLSCREEN_MASK), &rect);
|
|
@@ -799,17 +803,17 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
focusClickPending = 0;
|
|
|
[self onMovingOrFocusClickPendingStateCleared];
|
|
|
}
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
|
|
|
}
|
|
|
|
|
|
- (void)windowDidDeminiaturize:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_RESTORED, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_RESTORED, 0, 0);
|
|
|
}
|
|
|
|
|
|
- (void)windowDidBecomeKey:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_Window *window = _data->window;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
SDL_Mouse *mouse = SDL_GetMouse();
|
|
|
|
|
|
/* We're going to get keyboard events, since we're key. */
|
|
@@ -825,7 +829,7 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
NSPoint point;
|
|
|
int x, y;
|
|
|
|
|
|
- point = [_data->nswindow mouseLocationOutsideOfEventStream];
|
|
|
+ point = [_data.nswindow mouseLocationOutsideOfEventStream];
|
|
|
x = (int)point.x;
|
|
|
y = (int)(window->h - point.y);
|
|
|
|
|
@@ -835,14 +839,14 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
}
|
|
|
|
|
|
/* Check to see if someone updated the clipboard */
|
|
|
- Cocoa_CheckClipboardUpdate(_data->videodata);
|
|
|
+ Cocoa_CheckClipboardUpdate(_data.videodata);
|
|
|
|
|
|
if ((isFullscreenSpace) && ((window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {
|
|
|
[NSMenu setMenuBarVisible:NO];
|
|
|
}
|
|
|
|
|
|
const unsigned int newflags = [NSEvent modifierFlags] & NSEventModifierFlagCapsLock;
|
|
|
- _data->videodata->modifierFlags = (_data->videodata->modifierFlags & ~NSEventModifierFlagCapsLock) | newflags;
|
|
|
+ _data.videodata.modifierFlags = (_data.videodata.modifierFlags & ~NSEventModifierFlagCapsLock) | newflags;
|
|
|
SDL_ToggleModState(KMOD_CAPS, newflags != 0);
|
|
|
}
|
|
|
|
|
@@ -854,12 +858,12 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
}
|
|
|
|
|
|
/* Some other window will get mouse events, since we're not key. */
|
|
|
- if (SDL_GetMouseFocus() == _data->window) {
|
|
|
+ if (SDL_GetMouseFocus() == _data.window) {
|
|
|
SDL_SetMouseFocus(NULL);
|
|
|
}
|
|
|
|
|
|
/* Some other window will get keyboard events, since we're not key. */
|
|
|
- if (SDL_GetKeyboardFocus() == _data->window) {
|
|
|
+ if (SDL_GetKeyboardFocus() == _data.window) {
|
|
|
SDL_SetKeyboardFocus(NULL);
|
|
|
}
|
|
|
|
|
@@ -876,22 +880,22 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if ([oldscale doubleValue] != [_data->nswindow backingScaleFactor]) {
|
|
|
+ if ([oldscale doubleValue] != [_data.nswindow backingScaleFactor]) {
|
|
|
/* Force a resize event when the backing scale factor changes. */
|
|
|
- _data->window->w = 0;
|
|
|
- _data->window->h = 0;
|
|
|
+ _data.window->w = 0;
|
|
|
+ _data.window->h = 0;
|
|
|
[self windowDidResize:aNotification];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- (void)windowDidChangeScreenProfile:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_ICCPROF_CHANGED, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_ICCPROF_CHANGED, 0, 0);
|
|
|
}
|
|
|
|
|
|
- (void)windowWillEnterFullScreen:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_Window *window = _data->window;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
|
|
|
SetWindowStyle(window, (NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskMiniaturizable|NSWindowStyleMaskResizable));
|
|
|
|
|
@@ -901,7 +905,7 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
- (void)windowDidFailToEnterFullScreen:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_Window *window = _data->window;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
|
|
|
if (window->is_destroying) {
|
|
|
return;
|
|
@@ -917,9 +921,9 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
- (void)windowDidEnterFullScreen:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_Window *window = _data->window;
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
- NSWindow *nswindow = data->nswindow;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ NSWindow *nswindow = data.nswindow;
|
|
|
|
|
|
inFullscreenTransition = NO;
|
|
|
|
|
@@ -949,7 +953,7 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
- (void)windowWillExitFullScreen:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_Window *window = _data->window;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
|
|
|
isFullscreenSpace = NO;
|
|
|
inFullscreenTransition = YES;
|
|
@@ -967,7 +971,7 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
- (void)windowDidFailToExitFullScreen:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_Window *window = _data->window;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
|
|
|
if (window->is_destroying) {
|
|
|
return;
|
|
@@ -983,8 +987,8 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
- (void)windowDidExitFullScreen:(NSNotification *)aNotification
|
|
|
{
|
|
|
- SDL_Window *window = _data->window;
|
|
|
- NSWindow *nswindow = _data->nswindow;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
+ NSWindow *nswindow = _data.nswindow;
|
|
|
NSButton *button = nil;
|
|
|
|
|
|
inFullscreenTransition = NO;
|
|
@@ -1077,7 +1081,7 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
-(NSApplicationPresentationOptions)window:(NSWindow *)window willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)proposedOptions
|
|
|
{
|
|
|
- if ((_data->window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) {
|
|
|
+ if ((_data.window->flags & SDL_WINDOW_FULLSCREEN_DESKTOP) == SDL_WINDOW_FULLSCREEN_DESKTOP) {
|
|
|
return NSApplicationPresentationFullScreen | NSApplicationPresentationHideDock | NSApplicationPresentationHideMenuBar;
|
|
|
} else {
|
|
|
return proposedOptions;
|
|
@@ -1127,16 +1131,16 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
- (BOOL)processHitTest:(NSEvent *)theEvent
|
|
|
{
|
|
|
- SDL_assert(isDragAreaRunning == [_data->nswindow isMovableByWindowBackground]);
|
|
|
+ SDL_assert(isDragAreaRunning == [_data.nswindow isMovableByWindowBackground]);
|
|
|
|
|
|
- if (_data->window->hit_test) { /* if no hit-test, skip this. */
|
|
|
+ if (_data.window->hit_test) { /* if no hit-test, skip this. */
|
|
|
const NSPoint location = [theEvent locationInWindow];
|
|
|
- const SDL_Point point = { (int) location.x, _data->window->h - (((int) location.y)-1) };
|
|
|
- const SDL_HitTestResult rc = _data->window->hit_test(_data->window, &point, _data->window->hit_test_data);
|
|
|
+ const SDL_Point point = { (int) location.x, _data.window->h - (((int) location.y)-1) };
|
|
|
+ const SDL_HitTestResult rc = _data.window->hit_test(_data.window, &point, _data.window->hit_test_data);
|
|
|
if (rc == SDL_HITTEST_DRAGGABLE) {
|
|
|
if (!isDragAreaRunning) {
|
|
|
isDragAreaRunning = YES;
|
|
|
- [_data->nswindow setMovableByWindowBackground:YES];
|
|
|
+ [_data.nswindow setMovableByWindowBackground:YES];
|
|
|
}
|
|
|
return YES; /* dragging! */
|
|
|
}
|
|
@@ -1144,7 +1148,7 @@ Cocoa_UpdateClipCursor(SDL_Window * window)
|
|
|
|
|
|
if (isDragAreaRunning) {
|
|
|
isDragAreaRunning = NO;
|
|
|
- [_data->nswindow setMovableByWindowBackground:NO];
|
|
|
+ [_data.nswindow setMovableByWindowBackground:NO];
|
|
|
return YES; /* was dragging, drop event. */
|
|
|
}
|
|
|
|
|
@@ -1164,7 +1168,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
// the position in the currently-focused window. We don't (currently) send a mousemove
|
|
|
// event for the background window, this just makes sure the button is reported at the
|
|
|
// correct position in its own event.
|
|
|
- if ( focus && ([theEvent window] == ((SDL_WindowData *) focus->driverdata)->nswindow) ) {
|
|
|
+ if ( focus && ([theEvent window] == ((__bridge SDL_WindowData *) focus->driverdata).nswindow) ) {
|
|
|
rc = SDL_SendMouseButtonClicks(window, mouseID, state, button, clicks);
|
|
|
} else {
|
|
|
const int orig_x = mouse->x;
|
|
@@ -1198,7 +1202,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
}
|
|
|
|
|
|
if ([self processHitTest:theEvent]) {
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_HIT_TEST, 0, 0);
|
|
|
return; /* dragging, drop event. */
|
|
|
}
|
|
|
|
|
@@ -1224,7 +1228,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- Cocoa_SendMouseButtonClicks(mouse, theEvent, _data->window, SDL_PRESSED, button);
|
|
|
+ Cocoa_SendMouseButtonClicks(mouse, theEvent, _data.window, SDL_PRESSED, button);
|
|
|
}
|
|
|
|
|
|
- (void)rightMouseDown:(NSEvent *)theEvent
|
|
@@ -1247,7 +1251,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
int button;
|
|
|
|
|
|
if ([self processHitTest:theEvent]) {
|
|
|
- SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIT_TEST, 0, 0);
|
|
|
+ SDL_SendWindowEvent(_data.window, SDL_WINDOWEVENT_HIT_TEST, 0, 0);
|
|
|
return; /* stopped dragging, drop event. */
|
|
|
}
|
|
|
|
|
@@ -1271,7 +1275,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- Cocoa_SendMouseButtonClicks(mouse, theEvent, _data->window, SDL_RELEASED, button);
|
|
|
+ Cocoa_SendMouseButtonClicks(mouse, theEvent, _data.window, SDL_RELEASED, button);
|
|
|
}
|
|
|
|
|
|
- (void)rightMouseUp:(NSEvent *)theEvent
|
|
@@ -1292,7 +1296,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
}
|
|
|
|
|
|
const SDL_MouseID mouseID = mouse->mouseID;
|
|
|
- SDL_Window *window = _data->window;
|
|
|
+ SDL_Window *window = _data.window;
|
|
|
NSPoint point;
|
|
|
int x, y;
|
|
|
|
|
@@ -1341,7 +1345,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
|
|
|
- (void)scrollWheel:(NSEvent *)theEvent
|
|
|
{
|
|
|
- Cocoa_HandleMouseWheel(_data->window, theEvent);
|
|
|
+ Cocoa_HandleMouseWheel(_data.window, theEvent);
|
|
|
}
|
|
|
|
|
|
- (void)touchesBeganWithEvent:(NSEvent *) theEvent
|
|
@@ -1531,7 +1535,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
white until the app is ready to draw. In practice on modern macOS, this
|
|
|
only gets called for window creation and other extraordinary events. */
|
|
|
self.layer.backgroundColor = CGColorGetConstantColor(kCGColorBlack);
|
|
|
- ScheduleContextUpdates((SDL_WindowData *) _sdlWindow->driverdata);
|
|
|
+ ScheduleContextUpdates((__bridge SDL_WindowData *) _sdlWindow->driverdata);
|
|
|
SDL_SendWindowEvent(_sdlWindow, SDL_WINDOWEVENT_EXPOSED, 0, 0);
|
|
|
}
|
|
|
|
|
@@ -1555,7 +1559,7 @@ Cocoa_SendMouseButtonClicks(SDL_Mouse * mouse, NSEvent *theEvent, SDL_Window * w
|
|
|
|
|
|
if (mouse->cursor_shown && mouse->cur_cursor && !mouse->relative_mode) {
|
|
|
[self addCursorRect:[self bounds]
|
|
|
- cursor:mouse->cur_cursor->driverdata];
|
|
|
+ cursor:(__bridge NSCursor *)mouse->cur_cursor->driverdata];
|
|
|
} else {
|
|
|
[self addCursorRect:[self bounds]
|
|
|
cursor:[NSCursor invisibleCursor]];
|
|
@@ -1576,23 +1580,23 @@ static int
|
|
|
SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, NSView *nsview, SDL_bool created)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
|
|
|
+ SDL_VideoData *videodata = (__bridge SDL_VideoData *) _this->driverdata;
|
|
|
SDL_WindowData *data;
|
|
|
|
|
|
/* Allocate the window data */
|
|
|
- window->driverdata = data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data));
|
|
|
+ data = [[SDL_WindowData alloc] init];
|
|
|
if (!data) {
|
|
|
return SDL_OutOfMemory();
|
|
|
}
|
|
|
- data->window = window;
|
|
|
- data->nswindow = nswindow;
|
|
|
- data->created = created;
|
|
|
- data->videodata = videodata;
|
|
|
- data->nscontexts = [[NSMutableArray alloc] init];
|
|
|
- data->sdlContentView = nsview;
|
|
|
+ data.window = window;
|
|
|
+ data.nswindow = nswindow;
|
|
|
+ data.created = created;
|
|
|
+ data.videodata = videodata;
|
|
|
+ data.nscontexts = [[NSMutableArray alloc] init];
|
|
|
+ data.sdlContentView = nsview;
|
|
|
|
|
|
/* Create an event listener for the window */
|
|
|
- data->listener = [[Cocoa_WindowListener alloc] init];
|
|
|
+ data.listener = [[Cocoa_WindowListener alloc] init];
|
|
|
|
|
|
/* Fill in the SDL window with the window data */
|
|
|
{
|
|
@@ -1605,7 +1609,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, NSView *nsview,
|
|
|
}
|
|
|
|
|
|
/* Set up the listener after we create the view */
|
|
|
- [data->listener listen:data];
|
|
|
+ [data.listener listen:data];
|
|
|
|
|
|
if ([nswindow isVisible]) {
|
|
|
window->flags |= SDL_WINDOW_SHOWN;
|
|
@@ -1646,7 +1650,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, NSView *nsview,
|
|
|
|
|
|
if ([nswindow isKeyWindow]) {
|
|
|
window->flags |= SDL_WINDOW_INPUT_FOCUS;
|
|
|
- SDL_SetKeyboardFocus(data->window);
|
|
|
+ SDL_SetKeyboardFocus(data.window);
|
|
|
}
|
|
|
|
|
|
/* Prevents the window's "window device" from being destroyed when it is
|
|
@@ -1655,7 +1659,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, NSView *nsview,
|
|
|
[nswindow setOneShot:NO];
|
|
|
|
|
|
/* All done! */
|
|
|
- window->driverdata = data;
|
|
|
+ window->driverdata = (void *)CFBridgingRetain(data);
|
|
|
return 0;
|
|
|
}}
|
|
|
|
|
@@ -1663,7 +1667,7 @@ int
|
|
|
Cocoa_CreateWindow(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata;
|
|
|
+ SDL_VideoData *videodata = (__bridge SDL_VideoData *) _this->driverdata;
|
|
|
NSWindow *nswindow;
|
|
|
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
|
|
NSRect rect;
|
|
@@ -1708,7 +1712,7 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
- if (videodata->allow_spaces) {
|
|
|
+ if (videodata.allow_spaces) {
|
|
|
SDL_assert(floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6);
|
|
|
SDL_assert([nswindow respondsToSelector:@selector(toggleFullScreen:)]);
|
|
|
/* we put FULLSCREEN_DESKTOP windows in their own Space, without a toggle button or menubar, later */
|
|
@@ -1751,10 +1755,8 @@ Cocoa_CreateWindow(_THIS, SDL_Window * window)
|
|
|
#endif /* SDL_VIDEO_OPENGL_EGL */
|
|
|
#endif /* SDL_VIDEO_OPENGL_ES2 */
|
|
|
[nswindow setContentView:contentView];
|
|
|
- [contentView release];
|
|
|
|
|
|
if (SetupWindowData(_this, window, nswindow, contentView, SDL_TRUE) < 0) {
|
|
|
- [nswindow release];
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -1786,11 +1788,11 @@ Cocoa_CreateWindowFrom(_THIS, SDL_Window * window, const void *data)
|
|
|
NSView* nsview = nil;
|
|
|
NSWindow *nswindow = nil;
|
|
|
|
|
|
- if ([(id)data isKindOfClass:[NSWindow class]]) {
|
|
|
- nswindow = (NSWindow*)data;
|
|
|
+ if ([(__bridge id)data isKindOfClass:[NSWindow class]]) {
|
|
|
+ nswindow = (__bridge NSWindow*)data;
|
|
|
nsview = [nswindow contentView];
|
|
|
- } else if ([(id)data isKindOfClass:[NSView class]]) {
|
|
|
- nsview = (NSView*)data;
|
|
|
+ } else if ([(__bridge id)data isKindOfClass:[NSView class]]) {
|
|
|
+ nsview = (__bridge NSView*)data;
|
|
|
nswindow = [nsview window];
|
|
|
} else {
|
|
|
SDL_assert(false);
|
|
@@ -1827,10 +1829,9 @@ Cocoa_SetWindowTitle(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
const char *title = window->title ? window->title : "";
|
|
|
- NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
|
|
|
+ NSWindow *nswindow = ((__bridge SDL_WindowData *) window->driverdata).nswindow;
|
|
|
NSString *string = [[NSString alloc] initWithUTF8String:title];
|
|
|
[nswindow setTitle:string];
|
|
|
- [string release];
|
|
|
}}
|
|
|
|
|
|
void
|
|
@@ -1848,8 +1849,8 @@ void
|
|
|
Cocoa_SetWindowPosition(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *windata = (SDL_WindowData *) window->driverdata;
|
|
|
- NSWindow *nswindow = windata->nswindow;
|
|
|
+ SDL_WindowData *windata = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ NSWindow *nswindow = windata.nswindow;
|
|
|
NSRect rect;
|
|
|
Uint32 moveHack;
|
|
|
|
|
@@ -1871,8 +1872,8 @@ void
|
|
|
Cocoa_SetWindowSize(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *windata = (SDL_WindowData *) window->driverdata;
|
|
|
- NSWindow *nswindow = windata->nswindow;
|
|
|
+ SDL_WindowData *windata = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ NSWindow *nswindow = windata.nswindow;
|
|
|
NSRect rect;
|
|
|
Uint32 moveHack;
|
|
|
|
|
@@ -1898,39 +1899,39 @@ void
|
|
|
Cocoa_SetWindowMinimumSize(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *windata = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *windata = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
NSSize minSize;
|
|
|
minSize.width = window->min_w;
|
|
|
minSize.height = window->min_h;
|
|
|
|
|
|
- [windata->nswindow setContentMinSize:minSize];
|
|
|
+ [windata.nswindow setContentMinSize:minSize];
|
|
|
}}
|
|
|
|
|
|
void
|
|
|
Cocoa_SetWindowMaximumSize(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *windata = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *windata = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
NSSize maxSize;
|
|
|
maxSize.width = window->max_w;
|
|
|
maxSize.height = window->max_h;
|
|
|
|
|
|
- [windata->nswindow setContentMaxSize:maxSize];
|
|
|
+ [windata.nswindow setContentMaxSize:maxSize];
|
|
|
}}
|
|
|
|
|
|
void
|
|
|
Cocoa_ShowWindow(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *windowData = ((SDL_WindowData *) window->driverdata);
|
|
|
- NSWindow *nswindow = windowData->nswindow;
|
|
|
+ SDL_WindowData *windowData = ((__bridge SDL_WindowData *) window->driverdata);
|
|
|
+ NSWindow *nswindow = windowData.nswindow;
|
|
|
|
|
|
if (![nswindow isMiniaturized]) {
|
|
|
- [windowData->listener pauseVisibleObservation];
|
|
|
+ [windowData.listener pauseVisibleObservation];
|
|
|
[nswindow makeKeyAndOrderFront:nil];
|
|
|
- [windowData->listener resumeVisibleObservation];
|
|
|
+ [windowData.listener resumeVisibleObservation];
|
|
|
}
|
|
|
}}
|
|
|
|
|
@@ -1938,7 +1939,7 @@ void
|
|
|
Cocoa_HideWindow(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
|
|
|
+ NSWindow *nswindow = ((__bridge SDL_WindowData *) window->driverdata).nswindow;
|
|
|
|
|
|
[nswindow orderOut:nil];
|
|
|
}}
|
|
@@ -1947,26 +1948,26 @@ void
|
|
|
Cocoa_RaiseWindow(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *windowData = ((SDL_WindowData *) window->driverdata);
|
|
|
- NSWindow *nswindow = windowData->nswindow;
|
|
|
+ SDL_WindowData *windowData = ((__bridge SDL_WindowData *) window->driverdata);
|
|
|
+ NSWindow *nswindow = windowData.nswindow;
|
|
|
|
|
|
/* makeKeyAndOrderFront: has the side-effect of deminiaturizing and showing
|
|
|
a minimized or hidden window, so check for that before showing it.
|
|
|
*/
|
|
|
- [windowData->listener pauseVisibleObservation];
|
|
|
+ [windowData.listener pauseVisibleObservation];
|
|
|
if (![nswindow isMiniaturized] && [nswindow isVisible]) {
|
|
|
[NSApp activateIgnoringOtherApps:YES];
|
|
|
[nswindow makeKeyAndOrderFront:nil];
|
|
|
}
|
|
|
- [windowData->listener resumeVisibleObservation];
|
|
|
+ [windowData.listener resumeVisibleObservation];
|
|
|
}}
|
|
|
|
|
|
void
|
|
|
Cocoa_MaximizeWindow(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *windata = (SDL_WindowData *) window->driverdata;
|
|
|
- NSWindow *nswindow = windata->nswindow;
|
|
|
+ SDL_WindowData *windata = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ NSWindow *nswindow = windata.nswindow;
|
|
|
|
|
|
[nswindow zoom:nil];
|
|
|
|
|
@@ -1977,10 +1978,10 @@ void
|
|
|
Cocoa_MinimizeWindow(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
- NSWindow *nswindow = data->nswindow;
|
|
|
- if ([data->listener isInFullscreenSpaceTransition]) {
|
|
|
- [data->listener addPendingWindowOperation:PENDING_OPERATION_MINIMIZE];
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ NSWindow *nswindow = data.nswindow;
|
|
|
+ if ([data.listener isInFullscreenSpaceTransition]) {
|
|
|
+ [data.listener addPendingWindowOperation:PENDING_OPERATION_MINIMIZE];
|
|
|
} else {
|
|
|
[nswindow miniaturize:nil];
|
|
|
}
|
|
@@ -1990,7 +1991,7 @@ void
|
|
|
Cocoa_RestoreWindow(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
|
|
|
+ NSWindow *nswindow = ((__bridge SDL_WindowData *) window->driverdata).nswindow;
|
|
|
|
|
|
if ([nswindow isMiniaturized]) {
|
|
|
[nswindow deminiaturize:nil];
|
|
@@ -2018,14 +2019,14 @@ Cocoa_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable)
|
|
|
* The window will get permanently stuck if resizable is false.
|
|
|
* -flibit
|
|
|
*/
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
- Cocoa_WindowListener *listener = data->listener;
|
|
|
- NSWindow *nswindow = data->nswindow;
|
|
|
- SDL_VideoData *videodata = ((SDL_WindowData *) window->driverdata)->videodata;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ Cocoa_WindowListener *listener = data.listener;
|
|
|
+ NSWindow *nswindow = data.nswindow;
|
|
|
+ SDL_VideoData *videodata = data.videodata;
|
|
|
if (![listener isInFullscreenSpace]) {
|
|
|
SetWindowStyle(window, GetWindowStyle(window));
|
|
|
}
|
|
|
- if (videodata->allow_spaces) {
|
|
|
+ if (videodata.allow_spaces) {
|
|
|
if (resizable) {
|
|
|
/* resizable windows are Spaces-friendly: they get the "go fullscreen" toggle button on their titlebar. */
|
|
|
[nswindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
|
|
@@ -2039,7 +2040,7 @@ void
|
|
|
Cocoa_SetWindowAlwaysOnTop(_THIS, SDL_Window * window, SDL_bool on_top)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
|
|
|
+ NSWindow *nswindow = ((__bridge SDL_WindowData *) window->driverdata).nswindow;
|
|
|
if (on_top) {
|
|
|
[nswindow setLevel:NSFloatingWindowLevel];
|
|
|
} else {
|
|
@@ -2051,13 +2052,13 @@ void
|
|
|
Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
- NSWindow *nswindow = data->nswindow;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ NSWindow *nswindow = data.nswindow;
|
|
|
NSRect rect;
|
|
|
|
|
|
/* The view responder chain gets messed with during setStyleMask */
|
|
|
- if ([data->sdlContentView nextResponder] == data->listener) {
|
|
|
- [data->sdlContentView setNextResponder:nil];
|
|
|
+ if ([data.sdlContentView nextResponder] == data.listener) {
|
|
|
+ [data.sdlContentView setNextResponder:nil];
|
|
|
}
|
|
|
|
|
|
if (fullscreen) {
|
|
@@ -2103,8 +2104,8 @@ Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
|
|
|
}
|
|
|
|
|
|
/* The view responder chain gets messed with during setStyleMask */
|
|
|
- if ([data->sdlContentView nextResponder] != data->listener) {
|
|
|
- [data->sdlContentView setNextResponder:data->listener];
|
|
|
+ if ([data.sdlContentView nextResponder] != data.listener) {
|
|
|
+ [data.sdlContentView setNextResponder:data.listener];
|
|
|
}
|
|
|
|
|
|
s_moveHack = 0;
|
|
@@ -2127,9 +2128,9 @@ Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
|
|
|
}
|
|
|
|
|
|
if ([nswindow isVisible] || fullscreen) {
|
|
|
- [data->listener pauseVisibleObservation];
|
|
|
+ [data.listener pauseVisibleObservation];
|
|
|
[nswindow makeKeyAndOrderFront:nil];
|
|
|
- [data->listener resumeVisibleObservation];
|
|
|
+ [data.listener resumeVisibleObservation];
|
|
|
}
|
|
|
|
|
|
ScheduleContextUpdates(data);
|
|
@@ -2137,6 +2138,7 @@ Cocoa_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
|
|
|
|
|
|
int
|
|
|
Cocoa_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp)
|
|
|
+{ @autoreleasepool
|
|
|
{
|
|
|
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
|
|
CGDirectDisplayID display_id = ((SDL_DisplayData *)display->driverdata)->display;
|
|
@@ -2159,13 +2161,14 @@ Cocoa_SetWindowGammaRamp(_THIS, SDL_Window * window, const Uint16 * ramp)
|
|
|
return SDL_SetError("CGSetDisplayTransferByTable()");
|
|
|
}
|
|
|
return 0;
|
|
|
-}
|
|
|
+}}
|
|
|
|
|
|
void*
|
|
|
Cocoa_GetWindowICCProfile(_THIS, SDL_Window * window, size_t * size)
|
|
|
+{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
- NSWindow *nswindow = data->nswindow;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ NSWindow *nswindow = data.nswindow;
|
|
|
NSScreen *screen = [nswindow screen];
|
|
|
NSData* iccProfileData = nil;
|
|
|
void* retIccProfileData = NULL;
|
|
@@ -2195,10 +2198,13 @@ Cocoa_GetWindowICCProfile(_THIS, SDL_Window * window, size_t * size)
|
|
|
[iccProfileData getBytes:retIccProfileData length:[iccProfileData length]];
|
|
|
*size = [iccProfileData length];
|
|
|
return retIccProfileData;
|
|
|
-}
|
|
|
+}}
|
|
|
|
|
|
-int Cocoa_GetWindowDisplayIndex(_THIS, SDL_Window * window){
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+int
|
|
|
+Cocoa_GetWindowDisplayIndex(_THIS, SDL_Window * window)
|
|
|
+{ @autoreleasepool
|
|
|
+{
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
/* Not recognized via CHECK_WINDOW_MAGIC */
|
|
|
if (data == NULL){
|
|
@@ -2210,7 +2216,7 @@ int Cocoa_GetWindowDisplayIndex(_THIS, SDL_Window * window){
|
|
|
instead of checking in which display the window is placed, we should check which SDL display matches the display described
|
|
|
via displayframe.
|
|
|
*/
|
|
|
- NSRect displayframe = data->nswindow.screen.frame;
|
|
|
+ NSRect displayframe = data.nswindow.screen.frame;
|
|
|
SDL_Point display_center;
|
|
|
SDL_Rect sdl_display_rect;
|
|
|
|
|
@@ -2225,7 +2231,7 @@ int Cocoa_GetWindowDisplayIndex(_THIS, SDL_Window * window){
|
|
|
}
|
|
|
SDL_SetError("Couldn't find the display where the window is attached to.");
|
|
|
return -1;
|
|
|
-}
|
|
|
+}}
|
|
|
|
|
|
int
|
|
|
Cocoa_GetWindowGammaRamp(_THIS, SDL_Window * window, Uint16 * ramp)
|
|
@@ -2259,59 +2265,58 @@ Cocoa_SetWindowMouseRect(_THIS, SDL_Window * window)
|
|
|
|
|
|
void
|
|
|
Cocoa_SetWindowMouseGrab(_THIS, SDL_Window * window, SDL_bool grabbed)
|
|
|
+{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
Cocoa_UpdateClipCursor(window);
|
|
|
|
|
|
if (data && (window->flags & SDL_WINDOW_FULLSCREEN)) {
|
|
|
if (SDL_ShouldAllowTopmost() && (window->flags & SDL_WINDOW_INPUT_FOCUS)
|
|
|
- && ![data->listener isInFullscreenSpace]) {
|
|
|
+ && ![data.listener isInFullscreenSpace]) {
|
|
|
/* OpenGL is rendering to the window, so make it visible! */
|
|
|
/* Doing this in 10.11 while in a Space breaks things (bug #3152) */
|
|
|
- [data->nswindow setLevel:CGShieldingWindowLevel()];
|
|
|
+ [data.nswindow setLevel:CGShieldingWindowLevel()];
|
|
|
} else if (window->flags & SDL_WINDOW_ALWAYS_ON_TOP) {
|
|
|
- [data->nswindow setLevel:NSFloatingWindowLevel];
|
|
|
+ [data.nswindow setLevel:NSFloatingWindowLevel];
|
|
|
} else {
|
|
|
- [data->nswindow setLevel:kCGNormalWindowLevel];
|
|
|
+ [data.nswindow setLevel:kCGNormalWindowLevel];
|
|
|
}
|
|
|
}
|
|
|
-}
|
|
|
+}}
|
|
|
|
|
|
void
|
|
|
Cocoa_DestroyWindow(_THIS, SDL_Window * window)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *data = (SDL_WindowData *) CFBridgingRelease(window->driverdata);
|
|
|
|
|
|
if (data) {
|
|
|
- if ([data->listener isInFullscreenSpace]) {
|
|
|
+ if ([data.listener isInFullscreenSpace]) {
|
|
|
[NSMenu setMenuBarVisible:YES];
|
|
|
}
|
|
|
- [data->listener close];
|
|
|
- [data->listener release];
|
|
|
- if (data->created) {
|
|
|
+ [data.listener close];
|
|
|
+ data.listener = nil;
|
|
|
+ if (data.created) {
|
|
|
/* Release the content view to avoid further updateLayer callbacks */
|
|
|
- [data->nswindow setContentView:nil];
|
|
|
- [data->nswindow close];
|
|
|
+ [data.nswindow setContentView:nil];
|
|
|
+ [data.nswindow close];
|
|
|
}
|
|
|
|
|
|
- NSArray *contexts = [[data->nscontexts copy] autorelease];
|
|
|
+ NSArray *contexts = [data.nscontexts copy];
|
|
|
for (SDLOpenGLContext *context in contexts) {
|
|
|
/* Calling setWindow:NULL causes the context to remove itself from the context list. */
|
|
|
[context setWindow:NULL];
|
|
|
}
|
|
|
- [data->nscontexts release];
|
|
|
-
|
|
|
- SDL_free(data);
|
|
|
}
|
|
|
window->driverdata = NULL;
|
|
|
}}
|
|
|
|
|
|
SDL_bool
|
|
|
Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
|
|
|
+{ @autoreleasepool
|
|
|
{
|
|
|
- NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow;
|
|
|
+ NSWindow *nswindow = ((__bridge SDL_WindowData *) window->driverdata).nswindow;
|
|
|
|
|
|
if (info->version.major <= SDL_MAJOR_VERSION) {
|
|
|
info->subsystem = SDL_SYSWM_COCOA;
|
|
@@ -2322,33 +2327,34 @@ Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
|
|
|
SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
|
|
|
return SDL_FALSE;
|
|
|
}
|
|
|
-}
|
|
|
+}}
|
|
|
|
|
|
SDL_bool
|
|
|
Cocoa_IsWindowInFullscreenSpace(SDL_Window * window)
|
|
|
+{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
- if ([data->listener isInFullscreenSpace]) {
|
|
|
+ if ([data.listener isInFullscreenSpace]) {
|
|
|
return SDL_TRUE;
|
|
|
} else {
|
|
|
return SDL_FALSE;
|
|
|
}
|
|
|
-}
|
|
|
+}}
|
|
|
|
|
|
SDL_bool
|
|
|
Cocoa_SetWindowFullscreenSpace(SDL_Window * window, SDL_bool state)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
SDL_bool succeeded = SDL_FALSE;
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
- if (data->inWindowFullscreenTransition) {
|
|
|
+ if (data.inWindowFullscreenTransition) {
|
|
|
return SDL_FALSE;
|
|
|
}
|
|
|
|
|
|
- data->inWindowFullscreenTransition = SDL_TRUE;
|
|
|
- if ([data->listener setFullscreenSpace:(state ? YES : NO)]) {
|
|
|
+ data.inWindowFullscreenTransition = SDL_TRUE;
|
|
|
+ if ([data.listener setFullscreenSpace:(state ? YES : NO)]) {
|
|
|
const int maxattempts = 3;
|
|
|
int attempt = 0;
|
|
|
while (++attempt <= maxattempts) {
|
|
@@ -2357,7 +2363,7 @@ Cocoa_SetWindowFullscreenSpace(SDL_Window * window, SDL_bool state)
|
|
|
*/
|
|
|
const int limit = 10000;
|
|
|
int count = 0;
|
|
|
- while ([data->listener isInFullscreenSpaceTransition]) {
|
|
|
+ while ([data.listener isInFullscreenSpaceTransition]) {
|
|
|
if ( ++count == limit ) {
|
|
|
/* Uh oh, transition isn't completing. Should we assert? */
|
|
|
break;
|
|
@@ -2365,16 +2371,16 @@ Cocoa_SetWindowFullscreenSpace(SDL_Window * window, SDL_bool state)
|
|
|
SDL_Delay(1);
|
|
|
SDL_PumpEvents();
|
|
|
}
|
|
|
- if ([data->listener isInFullscreenSpace] == (state ? YES : NO))
|
|
|
+ if ([data.listener isInFullscreenSpace] == (state ? YES : NO))
|
|
|
break;
|
|
|
/* Try again, the last attempt was interrupted by user gestures */
|
|
|
- if (![data->listener setFullscreenSpace:(state ? YES : NO)])
|
|
|
+ if (![data.listener setFullscreenSpace:(state ? YES : NO)])
|
|
|
break; /* ??? */
|
|
|
}
|
|
|
/* Return TRUE to prevent non-space fullscreen logic from running */
|
|
|
succeeded = SDL_TRUE;
|
|
|
}
|
|
|
- data->inWindowFullscreenTransition = SDL_FALSE;
|
|
|
+ data.inWindowFullscreenTransition = SDL_FALSE;
|
|
|
|
|
|
return succeeded;
|
|
|
}}
|
|
@@ -2387,25 +2393,26 @@ Cocoa_SetWindowHitTest(SDL_Window * window, SDL_bool enabled)
|
|
|
|
|
|
void
|
|
|
Cocoa_AcceptDragAndDrop(SDL_Window * window, SDL_bool accept)
|
|
|
+{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
if (accept) {
|
|
|
- [data->nswindow registerForDraggedTypes:[NSArray arrayWithObject:(NSString *)kUTTypeFileURL]];
|
|
|
+ [data.nswindow registerForDraggedTypes:[NSArray arrayWithObject:(NSString *)kUTTypeFileURL]];
|
|
|
} else {
|
|
|
- [data->nswindow unregisterDraggedTypes];
|
|
|
+ [data.nswindow unregisterDraggedTypes];
|
|
|
}
|
|
|
-}
|
|
|
+}}
|
|
|
|
|
|
int
|
|
|
Cocoa_FlashWindow(_THIS, SDL_Window *window, SDL_FlashOperation operation)
|
|
|
{ @autoreleasepool
|
|
|
{
|
|
|
/* Note that this is app-wide and not window-specific! */
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
|
|
|
- if (data->flash_request) {
|
|
|
- [NSApp cancelUserAttentionRequest:data->flash_request];
|
|
|
- data->flash_request = 0;
|
|
|
+ if (data.flash_request) {
|
|
|
+ [NSApp cancelUserAttentionRequest:data.flash_request];
|
|
|
+ data.flash_request = 0;
|
|
|
}
|
|
|
|
|
|
switch (operation) {
|
|
@@ -2413,10 +2420,10 @@ Cocoa_FlashWindow(_THIS, SDL_Window *window, SDL_FlashOperation operation)
|
|
|
/* Canceled above */
|
|
|
break;
|
|
|
case SDL_FLASH_BRIEFLY:
|
|
|
- data->flash_request = [NSApp requestUserAttention:NSInformationalRequest];
|
|
|
+ data.flash_request = [NSApp requestUserAttention:NSInformationalRequest];
|
|
|
break;
|
|
|
case SDL_FLASH_UNTIL_FOCUSED:
|
|
|
- data->flash_request = [NSApp requestUserAttention:NSCriticalRequest];
|
|
|
+ data.flash_request = [NSApp requestUserAttention:NSCriticalRequest];
|
|
|
break;
|
|
|
default:
|
|
|
return SDL_Unsupported();
|
|
@@ -2426,11 +2433,12 @@ Cocoa_FlashWindow(_THIS, SDL_Window *window, SDL_FlashOperation operation)
|
|
|
|
|
|
int
|
|
|
Cocoa_SetWindowOpacity(_THIS, SDL_Window * window, float opacity)
|
|
|
+{ @autoreleasepool
|
|
|
{
|
|
|
- SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
|
- [data->nswindow setAlphaValue:opacity];
|
|
|
+ SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
|
|
|
+ [data.nswindow setAlphaValue:opacity];
|
|
|
return 0;
|
|
|
-}
|
|
|
+}}
|
|
|
|
|
|
#endif /* SDL_VIDEO_DRIVER_COCOA */
|
|
|
|