提交 3c6bff65 编写于 作者: D dmarkov

8171949: [macosx] AWT_ZoomFrame Automated tests fail with error: The bitwise...

8171949: [macosx] AWT_ZoomFrame Automated tests fail with error: The bitwise mask Frame.ICONIFIED is not setwhen the frame is in ICONIFIED state
Reviewed-by: ssadetsky, serb
上级 61a45b20
...@@ -212,6 +212,8 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -212,6 +212,8 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
private volatile boolean isFullScreenMode; private volatile boolean isFullScreenMode;
private boolean isFullScreenAnimationOn; private boolean isFullScreenAnimationOn;
private volatile boolean isIconifyAnimationActive;
private Window target; private Window target;
private LWWindowPeer peer; private LWWindowPeer peer;
protected CPlatformView contentView; protected CPlatformView contentView;
...@@ -992,6 +994,9 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -992,6 +994,9 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
if (peer != null) { if (peer != null) {
peer.notifyIconify(iconify); peer.notifyIconify(iconify);
} }
if (iconify) {
isIconifyAnimationActive = false;
}
} }
private void deliverZoom(final boolean isZoomed) { private void deliverZoom(final boolean isZoomed) {
...@@ -1061,6 +1066,17 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -1061,6 +1066,17 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
return true; return true;
} }
private boolean isIconified() {
boolean isIconified = false;
if (target instanceof Frame) {
int state = ((Frame)target).getExtendedState();
if ((state & Frame.ICONIFIED) != 0) {
isIconified = true;
}
}
return isIconifyAnimationActive || isIconified;
}
private boolean isOneOfOwnersOrSelf(CPlatformWindow window) { private boolean isOneOfOwnersOrSelf(CPlatformWindow window) {
while (window != null) { while (window != null) {
if (this == window) { if (this == window) {
...@@ -1084,11 +1100,14 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -1084,11 +1100,14 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
// the windows are ordered above their nearest owner; ancestors of the window, // the windows are ordered above their nearest owner; ancestors of the window,
// which is going to become 'main window', are placed above their siblings. // which is going to become 'main window', are placed above their siblings.
CPlatformWindow rootOwner = getRootOwner(); CPlatformWindow rootOwner = getRootOwner();
if (rootOwner.isVisible()) { if (rootOwner.isVisible() && !rootOwner.isIconified()) {
rootOwner.execute(CWrapper.NSWindow::orderFront); rootOwner.execute(CWrapper.NSWindow::orderFront);
} }
final WindowAccessor windowAccessor = AWTAccessor.getWindowAccessor(); // Do not order child windows of iconified owner.
orderAboveSiblingsImpl(windowAccessor.getOwnedWindows(rootOwner.target)); if (!rootOwner.isIconified()) {
final WindowAccessor windowAccessor = AWTAccessor.getWindowAccessor();
orderAboveSiblingsImpl(windowAccessor.getOwnedWindows(rootOwner.target));
}
} }
private void orderAboveSiblingsImpl(Window[] windows) { private void orderAboveSiblingsImpl(Window[] windows) {
...@@ -1099,10 +1118,12 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -1099,10 +1118,12 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
// Go through the list of windows and perform ordering. // Go through the list of windows and perform ordering.
for (Window w : windows) { for (Window w : windows) {
boolean iconified = false;
final Object p = componentAccessor.getPeer(w); final Object p = componentAccessor.getPeer(w);
if (p instanceof LWWindowPeer) { if (p instanceof LWWindowPeer) {
CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow(); CPlatformWindow pw = (CPlatformWindow)((LWWindowPeer)p).getPlatformWindow();
if (pw != null && pw.isVisible()) { iconified = isIconified();
if (pw != null && pw.isVisible() && !iconified) {
// If the window is one of ancestors of 'main window' or is going to become main by itself, // If the window is one of ancestors of 'main window' or is going to become main by itself,
// the window should be ordered above its siblings; otherwise the window is just ordered // the window should be ordered above its siblings; otherwise the window is just ordered
// above its nearest parent. // above its nearest parent.
...@@ -1118,10 +1139,13 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -1118,10 +1139,13 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
pw.applyWindowLevel(w); pw.applyWindowLevel(w);
} }
} }
// Retrieve the child windows for each window from the list and store them for future use. // Retrieve the child windows for each window from the list except iconified ones
// and store them for future use.
// Note: we collect data about child windows even for invisible owners, since they may have // Note: we collect data about child windows even for invisible owners, since they may have
// visible children. // visible children.
childWindows.addAll(Arrays.asList(windowAccessor.getOwnedWindows(w))); if (!iconified) {
childWindows.addAll(Arrays.asList(windowAccessor.getOwnedWindows(w)));
}
} }
// If some windows, which have just been ordered, have any child windows, let's start new iteration // If some windows, which have just been ordered, have any child windows, let's start new iteration
// and order these child windows. // and order these child windows.
...@@ -1142,6 +1166,10 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -1142,6 +1166,10 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
// NATIVE CALLBACKS // NATIVE CALLBACKS
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
private void windowWillMiniaturize() {
isIconifyAnimationActive = true;
}
private void windowDidBecomeMain() { private void windowDidBecomeMain() {
assert CThreading.assertAppKit(); assert CThreading.assertAppKit();
......
...@@ -614,6 +614,14 @@ AWT_ASSERT_APPKIT_THREAD; ...@@ -614,6 +614,14 @@ AWT_ASSERT_APPKIT_THREAD;
AWT_ASSERT_APPKIT_THREAD; AWT_ASSERT_APPKIT_THREAD;
self.isMinimizing = YES; self.isMinimizing = YES;
JNIEnv *env = [ThreadUtilities getJNIEnv];
jobject platformWindow = [self.javaPlatformWindow jObjectWithEnv:env];
if (platformWindow != NULL) {
static JNF_MEMBER_CACHE(jm_windowWillMiniaturize, jc_CPlatformWindow, "windowWillMiniaturize", "()V");
JNFCallVoidMethod(env, platformWindow, jm_windowWillMiniaturize);
(*env)->DeleteLocalRef(env, platformWindow);
}
// Excplicitly make myself a key window to avoid possible // Excplicitly make myself a key window to avoid possible
// negative visual effects during iconify operation // negative visual effects during iconify operation
[self.nsWindow makeKeyAndOrderFront:self.nsWindow]; [self.nsWindow makeKeyAndOrderFront:self.nsWindow];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册