--- 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];
}
}];