From fa30d212707fd22d8a9a12e6560e7993110a61e1 Mon Sep 17 00:00:00 2001 From: "J?rgen P. Tjern?" Date: Mon, 22 Apr 2013 12:07:13 -0700 Subject: [PATCH] Properly reflect hidden/shown windows on OSX. This fixes a bug where windows would always be considered to be in the shown/hidden state they were originally created in. --- src/video/cocoa/SDL_cocoawindow.m | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index f2803dad3..47dc1052e 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -65,6 +65,14 @@ - (void)listen:(SDL_WindowData *)data [window setDelegate:self]; } + // Haven't found a delegate / notification that triggers when the window is + // ordered out (is not visible any more). You can be ordered out without + // minimizing, so DidMiniaturize doesn't work. (e.g. -[NSWindow orderOut:]) + [window addObserver:self + forKeyPath:@"visible" + options:NSKeyValueObservingOptionNew + context:NULL]; + [window setNextResponder:self]; [window setAcceptsMouseMovedEvents:YES]; @@ -77,6 +85,21 @@ - (void)listen:(SDL_WindowData *)data #endif } +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context +{ + if (object == _data->nswindow && [keyPath isEqualToString:@"visible"]) { + int newVisibility = [[change objectForKey:@"new"] intValue]; + if (newVisibility) { + SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_SHOWN, 0, 0); + } else { + SDL_SendWindowEvent(_data->window, SDL_WINDOWEVENT_HIDDEN, 0, 0); + } + } +} + - (void)close { NSNotificationCenter *center; @@ -97,6 +120,9 @@ - (void)close [window setDelegate:nil]; } + [window removeObserver:self + forKeyPath:@"visible"]; + if ([window nextResponder] == self) { [window setNextResponder:nil]; } @@ -531,6 +557,7 @@ - (void)rightMouseDown:(NSEvent *)theEvent } else { window->flags &= ~SDL_WINDOW_SHOWN; } + { unsigned int style = [nswindow styleMask]; @@ -545,17 +572,20 @@ - (void)rightMouseDown:(NSEvent *)theEvent window->flags &= ~SDL_WINDOW_RESIZABLE; } } + /* isZoomed always returns true if the window is not resizable */ if ((window->flags & SDL_WINDOW_RESIZABLE) && [nswindow isZoomed]) { window->flags |= SDL_WINDOW_MAXIMIZED; } else { window->flags &= ~SDL_WINDOW_MAXIMIZED; } + if ([nswindow isMiniaturized]) { window->flags |= SDL_WINDOW_MINIMIZED; } else { window->flags &= ~SDL_WINDOW_MINIMIZED; } + if ([nswindow isKeyWindow]) { window->flags |= SDL_WINDOW_INPUT_FOCUS; SDL_SetKeyboardFocus(data->window);