|
@@ -66,11 +66,19 @@
|
|
|
{
|
|
|
self = [super init];
|
|
|
if (self) {
|
|
|
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
|
|
+
|
|
|
seenFirstActivate = NO;
|
|
|
- [[NSNotificationCenter defaultCenter] addObserver:self
|
|
|
- selector:@selector(focusSomeWindow:)
|
|
|
- name:NSApplicationDidBecomeActiveNotification
|
|
|
- object:nil];
|
|
|
+
|
|
|
+ [center addObserver:self
|
|
|
+ selector:@selector(windowWillClose:)
|
|
|
+ name:NSWindowWillCloseNotification
|
|
|
+ object:nil];
|
|
|
+
|
|
|
+ [center addObserver:self
|
|
|
+ selector:@selector(focusSomeWindow:)
|
|
|
+ name:NSApplicationDidBecomeActiveNotification
|
|
|
+ object:nil];
|
|
|
}
|
|
|
|
|
|
return self;
|
|
@@ -78,16 +86,65 @@
|
|
|
|
|
|
- (void)dealloc
|
|
|
{
|
|
|
- [[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
|
+ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
|
|
+
|
|
|
+ [center removeObserver:self name:NSWindowWillCloseNotification object:nil];
|
|
|
+ [center removeObserver:self name:NSApplicationDidBecomeActiveNotification object:nil];
|
|
|
+
|
|
|
[super dealloc];
|
|
|
}
|
|
|
|
|
|
+- (void)windowWillClose:(NSNotification *)notification;
|
|
|
+{
|
|
|
+ NSWindow *win = (NSWindow*)[notification object];
|
|
|
+
|
|
|
+ if (![win isKeyWindow]) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* HACK: Make the next window in the z-order key when the key window is
|
|
|
+ * closed. The custom event loop and/or windowing code we have seems to
|
|
|
+ * prevent the normal behavior: https://bugzilla.libsdl.org/show_bug.cgi?id=1825
|
|
|
+ */
|
|
|
+
|
|
|
+ /* +[NSApp orderedWindows] never includes the 'About' window, but we still
|
|
|
+ * want to try its list first since the behavior in other apps is to only
|
|
|
+ * make the 'About' window key if no other windows are on-screen.
|
|
|
+ */
|
|
|
+ for (NSWindow *window in [NSApp orderedWindows]) {
|
|
|
+ if (window != win && [window canBecomeKeyWindow]) {
|
|
|
+ if ([window respondsToSelector:@selector(isOnActiveSpace)]) {
|
|
|
+ if (![window isOnActiveSpace]) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ [window makeKeyAndOrderFront:self];
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* If a window wasn't found above, iterate through all visible windows
|
|
|
+ * (including the 'About' window, if it's shown) and make the first one key.
|
|
|
+ * Note that +[NSWindow windowNumbersWithOptions:] was added in 10.6.
|
|
|
+ */
|
|
|
+ if ([NSWindow respondsToSelector:@selector(windowNumbersWithOptions:)]) {
|
|
|
+ /* Get all visible windows in the active Space, in z-order. */
|
|
|
+ for (NSNumber *num in [NSWindow windowNumbersWithOptions:0]) {
|
|
|
+ NSWindow *window = [NSApp windowWithWindowNumber:[num integerValue]];
|
|
|
+ if (window && window != win && [window canBecomeKeyWindow]) {
|
|
|
+ [window makeKeyAndOrderFront:self];
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
- (void)focusSomeWindow:(NSNotification *)aNotification
|
|
|
{
|
|
|
/* HACK: Ignore the first call. The application gets a
|
|
|
* applicationDidBecomeActive: a little bit after the first window is
|
|
|
* created, and if we don't ignore it, a window that has been created with
|
|
|
- * SDL_WINDOW_MINIZED will ~immediately be restored.
|
|
|
+ * SDL_WINDOW_MINIMIZED will ~immediately be restored.
|
|
|
*/
|
|
|
if (!seenFirstActivate) {
|
|
|
seenFirstActivate = YES;
|