diff -r e2eff4dcebbd -r b933614e855e src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m Wed May 16 10:27:25 2018 -0700 +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m Wed May 16 16:46:51 2018 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -262,7 +262,7 @@ } else { [self.nsWindow setCollectionBehavior:NSWindowCollectionBehaviorDefault]; } - } + } } - (id) initWithPlatformWindow:(JNFWeakJObjectWrapper *)platformWindow @@ -465,7 +465,7 @@ // Tests whether window is blocked by modal dialog/window - (BOOL) isBlocked { BOOL isBlocked = NO; - + JNIEnv *env = [ThreadUtilities getJNIEnv]; jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env]; if (platformWindow != NULL) { @@ -473,7 +473,7 @@ isBlocked = JNFCallBooleanMethod(env, platformWindow, jm_isBlocked) == JNI_TRUE ? YES : NO; (*env)->DeleteLocalRef(env, platformWindow); } - + return isBlocked; } @@ -679,7 +679,7 @@ JNFCallVoidMethod(env, platformWindow, jm_windowWillMiniaturize); (*env)->DeleteLocalRef(env, platformWindow); } - // Excplicitly make myself a key window to avoid possible + // Explicitly make myself a key window to avoid possible // negative visual effects during iconify operation [self.nsWindow makeKeyAndOrderFront:self.nsWindow]; [self iconifyChildWindows:YES]; @@ -713,13 +713,47 @@ } } +- (void) windowDidBecomeMain: (NSNotification *) notification { +AWT_ASSERT_APPKIT_THREAD; + [AWTToolkit eventCountPlusPlus]; +#ifdef DEBUG + NSLog(@"became main: %d %@ %@", [self.nsWindow isKeyWindow], [self.nsWindow title], [self menuBarForWindow]); +#endif + + if (![self.nsWindow isKeyWindow]) { + [self activateWindowMenuBar]; + } + + JNIEnv *env = [ThreadUtilities getJNIEnv]; + jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env]; + if (platformWindow != NULL) { + static JNF_MEMBER_CACHE(jm_windowDidBecomeMain, jc_CPlatformWindow, "windowDidBecomeMain", "()V"); + JNFCallVoidMethod(env, platformWindow, jm_windowDidBecomeMain); + (*env)->DeleteLocalRef(env, platformWindow); + } +} - (void) windowDidBecomeKey: (NSNotification *) notification { AWT_ASSERT_APPKIT_THREAD; [AWTToolkit eventCountPlusPlus]; +#ifdef DEBUG + NSLog(@"became key: %d %@ %@", [self.nsWindow isMainWindow], [self.nsWindow title], [self menuBarForWindow]); +#endif AWTWindow *opposite = [AWTWindow lastKeyWindow]; - // Finds appropriate menubar in our hierarchy, + if (![self.nsWindow isMainWindow]) { + [self activateWindowMenuBar]; + } + + [AWTWindow setLastKeyWindow:nil]; + + [self _deliverWindowFocusEvent:YES oppositeWindow: opposite]; + [self orderChildWindows:YES]; +} + +- (void) activateWindowMenuBar { +AWT_ASSERT_APPKIT_THREAD; + // Finds appropriate menubar in our hierarchy AWTWindow *awtWindow = self; while (awtWindow.ownerWindow != nil) { awtWindow = awtWindow.ownerWindow; @@ -738,26 +772,48 @@ } [CMenuBar activate:menuBar modallyDisabled:isDisabled]; - - [AWTWindow setLastKeyWindow:nil]; +} - [self _deliverWindowFocusEvent:YES oppositeWindow: opposite]; - [self orderChildWindows:YES]; +#ifdef DEBUG +- (CMenuBar *) menuBarForWindow { +AWT_ASSERT_APPKIT_THREAD; + AWTWindow *awtWindow = self; + while (awtWindow.ownerWindow != nil) { + awtWindow = awtWindow.ownerWindow; + } + return awtWindow.javaMenuBar; } +#endif - (void) windowDidResignKey: (NSNotification *) notification { // TODO: check why sometimes at start is invoked *not* on AppKit main thread. AWT_ASSERT_APPKIT_THREAD; [AWTToolkit eventCountPlusPlus]; - [self.javaMenuBar deactivate]; +#ifdef DEBUG + NSLog(@"resigned key: %d %@ %@", [self.nsWindow isMainWindow], [self.nsWindow title], [self menuBarForWindow]); +#endif + if (![self.nsWindow isMainWindow]) { + [self deactivateWindow]; + } +} - // In theory, this might cause flickering if the window gaining focus - // has its own menu. However, I couldn't reproduce it on practice, so - // perhaps this is a non issue. - CMenuBar* defaultMenu = [[ApplicationDelegate sharedDelegate] defaultMenuBar]; - if (defaultMenu != nil) { - [CMenuBar activate:defaultMenu modallyDisabled:NO]; +- (void) windowDidResignMain: (NSNotification *) notification { +AWT_ASSERT_APPKIT_THREAD; + [AWTToolkit eventCountPlusPlus]; +#ifdef DEBUG + NSLog(@"resigned main: %d %@ %@", [self.nsWindow isKeyWindow], [self.nsWindow title], [self menuBarForWindow]); +#endif + if (![self.nsWindow isKeyWindow]) { + [self deactivateWindow]; } +} + +- (void) deactivateWindow { +AWT_ASSERT_APPKIT_THREAD; +#ifdef DEBUG + NSLog(@"deactivating window: %@", [self.nsWindow title]); +#endif + [self.javaMenuBar deactivate]; // the new key window NSWindow *keyWindow = [NSApp keyWindow]; @@ -773,19 +829,6 @@ [self orderChildWindows:NO]; } -- (void) windowDidBecomeMain: (NSNotification *) notification { -AWT_ASSERT_APPKIT_THREAD; - [AWTToolkit eventCountPlusPlus]; - - JNIEnv *env = [ThreadUtilities getJNIEnv]; - jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env]; - if (platformWindow != NULL) { - static JNF_MEMBER_CACHE(jm_windowDidBecomeMain, jc_CPlatformWindow, "windowDidBecomeMain", "()V"); - JNFCallVoidMethod(env, platformWindow, jm_windowDidBecomeMain); - (*env)->DeleteLocalRef(env, platformWindow); - } -} - - (BOOL)windowShouldClose:(id)sender { AWT_ASSERT_APPKIT_THREAD; [AWTToolkit eventCountPlusPlus]; @@ -1040,7 +1083,7 @@ AWTWindow *window = (AWTWindow*)[nsWindow delegate]; - if ([nsWindow isKeyWindow]) { + if ([nsWindow isKeyWindow] || [nsWindow isMainWindow]) { [window.javaMenuBar deactivate]; } @@ -1051,7 +1094,7 @@ actualMenuBar = [[ApplicationDelegate sharedDelegate] defaultMenuBar]; } - if ([nsWindow isKeyWindow]) { + if ([nsWindow isKeyWindow] || [nsWindow isMainWindow]) { [CMenuBar activate:actualMenuBar modallyDisabled:NO]; } }];