Skip to content

Commit a5d9f49

Browse files
author
Andrew Lu
committed
8296972: [macos13] java/awt/Frame/MaximizedToIconified/MaximizedToIconified.java: getExtendedState() != 6 as expected.
Reviewed-by: goetz Backport-of: f0c2f098150335fce736708354d58bae383cc4a1
1 parent 7161e29 commit a5d9f49

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java

+31
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.awt.Window;
4343
import java.awt.event.FocusEvent;
4444
import java.awt.event.WindowEvent;
45+
import java.awt.event.WindowStateListener;
4546
import java.beans.PropertyChangeEvent;
4647
import java.beans.PropertyChangeListener;
4748
import java.lang.reflect.InvocationTargetException;
@@ -964,6 +965,33 @@ public boolean isFullScreenMode() {
964965
return isFullScreenMode;
965966
}
966967

968+
private void waitForWindowState(int state) {
969+
if (peer.getState() == state) {
970+
return;
971+
}
972+
973+
Object lock = new Object();
974+
WindowStateListener wsl = new WindowStateListener() {
975+
public void windowStateChanged(WindowEvent e) {
976+
synchronized (lock) {
977+
if (e.getNewState() == state) {
978+
lock.notifyAll();
979+
}
980+
}
981+
}
982+
};
983+
984+
target.addWindowStateListener(wsl);
985+
if (peer.getState() != state) {
986+
synchronized (lock) {
987+
try {
988+
lock.wait();
989+
} catch (InterruptedException ie) {}
990+
}
991+
}
992+
target.removeWindowStateListener(wsl);
993+
}
994+
967995
@Override
968996
public void setWindowState(int windowState) {
969997
if (peer == null || !peer.isVisible()) {
@@ -985,13 +1013,16 @@ public void setWindowState(int windowState) {
9851013
// let's return into the normal states first
9861014
// the zoom call toggles between the normal and the max states
9871015
unmaximize();
1016+
waitForWindowState(Frame.NORMAL);
9881017
}
9891018
execute(CWrapper.NSWindow::miniaturize);
9901019
break;
9911020
case Frame.MAXIMIZED_BOTH:
9921021
if (prevWindowState == Frame.ICONIFIED) {
9931022
// let's return into the normal states first
9941023
execute(CWrapper.NSWindow::deminiaturize);
1024+
waitForWindowState(Frame.NORMAL);
1025+
9951026
}
9961027
maximize();
9971028
break;

test/jdk/java/awt/Frame/MaximizedToIconified/MaximizedToIconified.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
public class MaximizedToIconified
4747
{
48-
static volatile int lastFrameState = Frame.NORMAL;
48+
static volatile int lastFrameState;
4949
static volatile boolean failed = false;
5050
static volatile Toolkit myKit;
5151
private static Robot robot;
@@ -77,6 +77,8 @@ private static void examineStates(int states[]) {
7777
frame.setSize(200, 200);
7878
frame.setVisible(true);
7979

80+
lastFrameState = Frame.NORMAL;
81+
8082
robot.waitForIdle();
8183

8284
frame.addWindowStateListener(new WindowStateListener() {
@@ -114,7 +116,12 @@ private static void doTest() {
114116
// because Toolkit.isFrameStateSupported() method reports these states
115117
// as not supported. And such states will simply be skipped.
116118
examineStates(new int[] {Frame.MAXIMIZED_BOTH, Frame.ICONIFIED, Frame.NORMAL});
119+
System.out.println("------");
117120
examineStates(new int[] {Frame.ICONIFIED, Frame.MAXIMIZED_BOTH, Frame.NORMAL});
121+
System.out.println("------");
122+
examineStates(new int[] {Frame.NORMAL, Frame.MAXIMIZED_BOTH, Frame.ICONIFIED});
123+
System.out.println("------");
124+
examineStates(new int[] {Frame.NORMAL, Frame.ICONIFIED, Frame.MAXIMIZED_BOTH});
118125

119126
}
120127

0 commit comments

Comments
 (0)