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.
This commit is contained in:
Jørgen P. Tjernø 2013-04-22 12:07:13 -07:00
parent 53c00d6cad
commit c59f7d106e

View file

@ -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);