src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java
Print this page
@@ -200,10 +200,12 @@
private Window target;
private LWWindowPeer peer;
private CPlatformView contentView;
private CPlatformWindow owner;
+ private boolean undecorated; // initialized in getInitialStyleBits()
+ private Rectangle normalBounds = null; // not-null only for undecorated maximized windows
public CPlatformWindow(final PeerType peerType) {
super(0, true);
assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME);
}
@@ -275,12 +277,12 @@
styleBits = SET(styleBits, MINIMIZABLE, false);
}
// Either java.awt.Frame or java.awt.Dialog can be undecorated, however java.awt.Window always is undecorated.
{
- final boolean undecorated = isFrame ? ((Frame)target).isUndecorated() : (isDialog ? ((Dialog)target).isUndecorated() : true);
- if (undecorated) styleBits = SET(styleBits, DECORATED, false);
+ this.undecorated = isFrame ? ((Frame)target).isUndecorated() : (isDialog ? ((Dialog)target).isUndecorated() : true);
+ if (this.undecorated) styleBits = SET(styleBits, DECORATED, false);
}
// Either java.awt.Frame or java.awt.Dialog can be resizable, however java.awt.Window is never resizable
{
final boolean resizable = isFrame ? ((Frame)target).isResizable() : (isDialog ? ((Dialog)target).isResizable() : false);
@@ -464,10 +466,34 @@
public void setBounds(int x, int y, int w, int h) {
// assert CThreading.assertEventQueue();
nativeSetNSWindowBounds(getNSWindowPtr(), x, y, w, h);
}
+ private void zoom() {
+ if (!undecorated) {
+ CWrapper.NSWindow.zoom(getNSWindowPtr());
+ } else {
+ // OS X handles -zoom incorrectly for undecorated windows
+ final boolean isZoomed = this.normalBounds == null;
+ deliverZoom(isZoomed);
+
+ Rectangle toBounds;
+ if (isZoomed) {
+ this.normalBounds = peer.getBounds();
+ long screen = CWrapper.NSWindow.screen(getNSWindowPtr());
+ toBounds = CWrapper.NSScreen.visibleFrame(screen).getBounds();
+ // Flip the y coordinate
+ Rectangle frame = CWrapper.NSScreen.frame(screen).getBounds();
+ toBounds.y = frame.height - toBounds.y - toBounds.height;
+ } else {
+ toBounds = normalBounds;
+ this.normalBounds = null;
+ }
+ setBounds(toBounds.x, toBounds.y, toBounds.width, toBounds.height);
+ }
+ }
+
@Override // PlatformWindow
public void setVisible(boolean visible) {
final long nsWindowPtr = getNSWindowPtr();
if (owner != null) {
@@ -484,11 +510,11 @@
switch (peer.getState()) {
case Frame.ICONIFIED:
CWrapper.NSWindow.deminiaturize(nsWindowPtr);
break;
case Frame.MAXIMIZED_BOTH:
- CWrapper.NSWindow.zoom(nsWindowPtr);
+ zoom();
break;
}
}
LWWindowPeer blocker = peer.getBlocker();
@@ -524,11 +550,11 @@
switch (((Frame)target).getExtendedState()) {
case Frame.ICONIFIED:
CWrapper.NSWindow.miniaturize(nsWindowPtr);
break;
case Frame.MAXIMIZED_BOTH:
- CWrapper.NSWindow.zoom(nsWindowPtr);
+ zoom();
break;
}
}
}
@@ -690,27 +716,27 @@
switch (windowState) {
case Frame.ICONIFIED:
if (prevWindowState == Frame.MAXIMIZED_BOTH) {
// let's return into the normal states first
// the zoom call toggles between the normal and the max states
- CWrapper.NSWindow.zoom(nsWindowPtr);
+ zoom();
}
CWrapper.NSWindow.miniaturize(nsWindowPtr);
break;
case Frame.MAXIMIZED_BOTH:
if (prevWindowState == Frame.ICONIFIED) {
// let's return into the normal states first
CWrapper.NSWindow.deminiaturize(nsWindowPtr);
}
- CWrapper.NSWindow.zoom(nsWindowPtr);
+ zoom();
break;
case Frame.NORMAL:
if (prevWindowState == Frame.ICONIFIED) {
CWrapper.NSWindow.deminiaturize(nsWindowPtr);
} else if (prevWindowState == Frame.MAXIMIZED_BOTH) {
// the zoom call toggles between the normal and the max states
- CWrapper.NSWindow.zoom(nsWindowPtr);
+ zoom();
}
break;
default:
throw new RuntimeException("Unknown window state: " + windowState);
}