On Mon, 12 Jun 2023 22:29:25 GMT, Alisen Chung <[email protected]> wrote:
>> added displayChanged call to CPlatformWindow when frame first needs to
>> deiconify or unmaximize
>> All client tests passed after change
>
> Alisen Chung has updated the pull request incrementally with one additional
> commit since the last revision:
>
> use realsync to flush native queue
Changes requested by dmarkov (Reviewer).
src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java line 989:
> 987: // the zoom call toggles between the normal and the
> max states
> 988: unmaximize();
> 989: peer.getLWToolkit().realSync();
Well.. `realSync()` works here but I am not sure if that invocation really
fixes the issue or just hides it by introducing a delay.
I believe we need some function which ensures that the frame is in correct
(`NORMAL`) state right after `unmaximize()` call and before
`execute(CWrapper.NSWindow::miniaturize)` invocation.
Possible implementation of that method below:
private void waitForWindowState(int state) {
Object lock = new Object();
target.addWindowStateListener(new WindowStateListener() {
public void windowStateChanged(WindowEvent e) {
synchronized(lock) {
if (e.getNewState() == state) {
lock.notifyAll();
}
}
}
});
if (peer.getState() != state) {
synchronized(lock) {
try {
lock.wait();
} catch(InterruptedException ie) {}
}
}
}
So in code you will call `waitForWindowState(Frame.NORMAL)` instead of
`realSync()`
-------------
PR Review: https://git.openjdk.org/jdk/pull/14226#pullrequestreview-1477327791
PR Review Comment: https://git.openjdk.org/jdk/pull/14226#discussion_r1228226627