From c59f7d106eb8378f38e489739fbc63a469871cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20P=2E=20Tjern=C3=B8?= 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 @@ static __inline__ void ConvertNSRect(NSRect *r) [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 @@ static __inline__ void ConvertNSRect(NSRect *r) #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 @@ static __inline__ void ConvertNSRect(NSRect *r) [window setDelegate:nil]; } + [window removeObserver:self + forKeyPath:@"visible"]; + if ([window nextResponder] == self) { [window setNextResponder:nil]; } @@ -531,6 +557,7 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created } else { window->flags &= ~SDL_WINDOW_SHOWN; } + { unsigned int style = [nswindow styleMask]; @@ -545,17 +572,20 @@ SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created 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);