src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java
Print this page
*** 201,210 ****
--- 201,212 ----
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);
}
*** 279,290 ****
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);
}
// 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);
--- 281,292 ----
styleBits = SET(styleBits, MINIMIZABLE, false);
}
// Either java.awt.Frame or java.awt.Dialog can be undecorated, however java.awt.Window always is undecorated.
{
! 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);
*** 466,475 ****
--- 468,501 ----
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) {
*** 486,496 ****
switch (peer.getState()) {
case Frame.ICONIFIED:
CWrapper.NSWindow.deminiaturize(nsWindowPtr);
break;
case Frame.MAXIMIZED_BOTH:
! CWrapper.NSWindow.zoom(nsWindowPtr);
break;
}
}
LWWindowPeer blocker = peer.getBlocker();
--- 512,522 ----
switch (peer.getState()) {
case Frame.ICONIFIED:
CWrapper.NSWindow.deminiaturize(nsWindowPtr);
break;
case Frame.MAXIMIZED_BOTH:
! zoom();
break;
}
}
LWWindowPeer blocker = peer.getBlocker();
*** 519,529 ****
switch (((Frame)target).getExtendedState()) {
case Frame.ICONIFIED:
CWrapper.NSWindow.miniaturize(nsWindowPtr);
break;
case Frame.MAXIMIZED_BOTH:
! CWrapper.NSWindow.zoom(nsWindowPtr);
break;
}
}
}
--- 545,555 ----
switch (((Frame)target).getExtendedState()) {
case Frame.ICONIFIED:
CWrapper.NSWindow.miniaturize(nsWindowPtr);
break;
case Frame.MAXIMIZED_BOTH:
! zoom();
break;
}
}
}
*** 680,706 ****
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);
}
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);
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);
}
break;
default:
throw new RuntimeException("Unknown window state: " + windowState);
}
--- 706,732 ----
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
! 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);
}
! 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
! zoom();
}
break;
default:
throw new RuntimeException("Unknown window state: " + windowState);
}