diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java index b708fa56753..52e8e33cdcc 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java @@ -51,9 +51,9 @@ abstract class XDecoratedPeer extends XWindowPeer { boolean insets_corrected; XIconWindow iconWindow; - WindowDimensions dimensions; + volatile WindowDimensions dimensions; XContentWindow content; - Insets currentInsets; + volatile Insets currentInsets; XFocusProxyWindow focusProxy; static final Map,Insets> lastKnownInsets = Collections.synchronizedMap(new HashMap<>()); @@ -106,7 +106,7 @@ abstract class XDecoratedPeer extends XWindowPeer { // The lines that follow need to be in a postInit, so they // happen after the X window is created. - initResizability(); + setResizable(winAttr.initialResizability); XWM.requestWMExtents(getWindow()); content = XContentWindow.createContent(this); @@ -130,7 +130,12 @@ abstract class XDecoratedPeer extends XWindowPeer { public void updateMinimumSize() { super.updateMinimumSize(); - updateMinSizeHints(); + XToolkit.awtLock(); + try { + updateMinSizeHints(); + } finally { + XToolkit.awtUnlock(); + } } private void updateMinSizeHints() { @@ -193,8 +198,13 @@ abstract class XDecoratedPeer extends XWindowPeer { if (log.isLoggable(PlatformLogger.Level.FINE)) { log.fine("Title is " + title); } - winAttr.title = title; - updateWMName(); + XToolkit.awtLock(); + try { + winAttr.title = title; + updateWMName(); + } finally { + XToolkit.awtUnlock(); + } } protected String getWMName() { @@ -206,10 +216,10 @@ abstract class XDecoratedPeer extends XWindowPeer { } void updateWMName() { - super.updateWMName(); - String name = getWMName(); XToolkit.awtLock(); try { + super.updateWMName(); + String name = getWMName(); if (name == null || name.trim().equals("")) { name = "Java"; } @@ -304,6 +314,8 @@ abstract class XDecoratedPeer extends XWindowPeer { if (XWM.getWMID() != XWM.UNITY_COMPIZ_WM) { currentInsets = new Insets(0, 0, 0, 0); wm_set_insets = null; + } else { + insets_corrected = false; } } @@ -330,7 +342,7 @@ abstract class XDecoratedPeer extends XWindowPeer { if (XWM.getWMID() != XWM.UNITY_COMPIZ_WM) { getWMSetInsets(XAtom.get(ev.get_atom())); } else { - if(!isReparented()) { + if (!isReparented()) { return; } wm_set_insets = null; @@ -377,137 +389,127 @@ abstract class XDecoratedPeer extends XWindowPeer { insLog.fine(xe.toString()); } reparent_serial = xe.get_serial(); - XToolkit.awtLock(); - try { - long root = XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber()); + long root = XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber()); - if (isEmbedded()) { - setReparented(true); - insets_corrected = true; + if (isEmbedded()) { + setReparented(true); + insets_corrected = true; + return; + } + if (getDecorations() == XWindowAttributesData.AWT_DECOR_NONE) { + setReparented(true); + insets_corrected = true; + reshape(dimensions, SET_SIZE, false); + } else if (xe.get_parent() == root) { + configure_seen = false; + insets_corrected = false; + + /* + * We can be repareted to root for two reasons: + * . setVisible(false) + * . WM exited + */ + if (isVisible()) { /* WM exited */ + /* Work around 4775545 */ + XWM.getWM().unshadeKludge(this); + insLog.fine("- WM exited"); + } else { + insLog.fine(" - reparent due to hide"); + } + } else { /* reparented to WM frame, figure out our insets */ + setReparented(true); + insets_corrected = false; + if (XWM.getWMID() == XWM.UNITY_COMPIZ_WM) { return; } - Component t = target; - if (getDecorations() == XWindowAttributesData.AWT_DECOR_NONE) { - setReparented(true); - insets_corrected = true; - reshape(dimensions, SET_SIZE, false); - } else if (xe.get_parent() == root) { - configure_seen = false; - insets_corrected = false; - /* - * We can be repareted to root for two reasons: - * . setVisible(false) - * . WM exited - */ - if (isVisible()) { /* WM exited */ - /* Work around 4775545 */ - XWM.getWM().unshadeKludge(this); - insLog.fine("- WM exited"); - } else { - insLog.fine(" - reparent due to hide"); + // Check if we have insets provided by the WM + Insets correctWM = getWMSetInsets(null); + if (correctWM != null) { + if (insLog.isLoggable(PlatformLogger.Level.FINER)) { + insLog.finer("wm-provided insets {0}", correctWM); } - } else { /* reparented to WM frame, figure out our insets */ - setReparented(true); - insets_corrected = false; - if (XWM.getWMID() == XWM.UNITY_COMPIZ_WM) { + // If these insets are equal to our current insets - no actions are necessary + Insets dimInsets = dimensions.getInsets(); + if (correctWM.equals(dimInsets)) { + insLog.finer("Insets are the same as estimated - no additional reshapes necessary"); + no_reparent_artifacts = true; + insets_corrected = true; + applyGuessedInsets(); return; } - - // Check if we have insets provided by the WM - Insets correctWM = getWMSetInsets(null); - if (correctWM != null) { - if (insLog.isLoggable(PlatformLogger.Level.FINER)) { - insLog.finer("wm-provided insets {0}", correctWM); - } - // If these insets are equal to our current insets - no actions are necessary - Insets dimInsets = dimensions.getInsets(); - if (correctWM.equals(dimInsets)) { - insLog.finer("Insets are the same as estimated - no additional reshapes necessary"); - no_reparent_artifacts = true; - insets_corrected = true; - applyGuessedInsets(); - return; - } - } else { - correctWM = XWM.getWM().getInsets(this, xe.get_window(), xe.get_parent()); - if (correctWM != null) { - correctWM = copyAndScaleDown(correctWM); - } - - if (insLog.isLoggable(PlatformLogger.Level.FINER)) { - if (correctWM != null) { - insLog.finer("correctWM {0}", correctWM); - } else { - insLog.finer("correctWM insets are not available, waiting for configureNotify"); - } - } - } - - if (correctWM != null) { - handleCorrectInsets(correctWM); - } - } - } finally { - XToolkit.awtUnlock(); - } - } - - protected void handleCorrectInsets(Insets correctWM) { - XToolkit.awtLock(); - try { - /* - * Ok, now see if we need adjust window size because - * initial insets were wrong (most likely they were). - */ - Insets correction = difference(correctWM, currentInsets); - if (insLog.isLoggable(PlatformLogger.Level.FINEST)) { - insLog.finest("Corrention {0}", correction); - } - if (!isNull(correction)) { - currentInsets = copy(correctWM); - applyGuessedInsets(); - - //Fix for 6318109: PIT: Min Size is not honored properly when a - //smaller size is specified in setSize(), XToolkit - //update minimum size hints - updateMinSizeHints(); - } - if (insLog.isLoggable(PlatformLogger.Level.FINER)) { - insLog.finer("Dimensions before reparent: " + dimensions); - } - - dimensions.setInsets(getRealInsets()); - insets_corrected = true; - - if (isMaximized()) { - return; - } - - /* - * If this window has been sized by a pack() we need - * to keep the interior geometry intact. Since pack() - * computed width and height with wrong insets, we - * must adjust the target dimensions appropriately. - */ - if ((getHints().get_flags() & (XUtilConstants.USPosition | XUtilConstants.PPosition)) != 0) { - reshape(dimensions, SET_BOUNDS, false); } else { - reshape(dimensions, SET_SIZE, false); + correctWM = XWM.getWM().getInsets(this, xe.get_window(), xe.get_parent()); + if (correctWM != null) { + correctWM = copyAndScaleDown(correctWM); + } + + if (insLog.isLoggable(PlatformLogger.Level.FINER)) { + if (correctWM != null) { + insLog.finer("correctWM {0}", correctWM); + } else { + insLog.finer("correctWM insets are not available, waiting for configureNotify"); + } + } + } + + if (correctWM != null) { + handleCorrectInsets(correctWM); } - } finally { - XToolkit.awtUnlock(); } } - public void handleMoved(WindowDimensions dims) { + private void handleCorrectInsets(Insets correctWM) { + /* + * Ok, now see if we need adjust window size because + * initial insets were wrong (most likely they were). + */ + Insets correction = difference(correctWM, currentInsets); + if (insLog.isLoggable(PlatformLogger.Level.FINEST)) { + insLog.finest("Corrention {0}", correction); + } + if (!isNull(correction)) { + currentInsets = copy(correctWM); + applyGuessedInsets(); + + //Fix for 6318109: PIT: Min Size is not honored properly when a + //smaller size is specified in setSize(), XToolkit + //update minimum size hints + updateMinSizeHints(); + } + if (insLog.isLoggable(PlatformLogger.Level.FINER)) { + insLog.finer("Dimensions before reparent: " + dimensions); + } + WindowDimensions newDimensions = new WindowDimensions(dimensions); + newDimensions.setInsets(getRealInsets()); + dimensions = newDimensions; + insets_corrected = true; + + if (isMaximized()) { + return; + } + + /* + * If this window has been sized by a pack() we need + * to keep the interior geometry intact. Since pack() + * computed width and height with wrong insets, we + * must adjust the target dimensions appropriately. + */ + if ((getHints().get_flags() & (XUtilConstants.USPosition | XUtilConstants.PPosition)) != 0) { + reshape(dimensions, SET_BOUNDS, false); + } else { + reshape(dimensions, SET_SIZE, false); + } + } + + void handleMoved(WindowDimensions dims) { Point loc = dims.getLocation(); AWTAccessor.getComponentAccessor().setLocation(target, loc.x, loc.y); postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_MOVED)); } - protected Insets guessInsets() { + private Insets guessInsets() { if (isEmbedded() || isTargetUndecorated()) { return new Insets(0, 0, 0, 0); } else { @@ -532,16 +534,7 @@ abstract class XDecoratedPeer extends XWindowPeer { currentInsets = copy(guessed); } - public void revalidate() { - XToolkit.executeOnEventHandlerThread(target, new Runnable() { - public void run() { - target.invalidate(); - target.validate(); - } - }); - } - - Insets getRealInsets() { + private Insets getRealInsets() { if (isNull(currentInsets)) { applyGuessedInsets(); } @@ -578,7 +571,7 @@ abstract class XDecoratedPeer extends XWindowPeer { // Coordinates are that of the target // Called only on Toolkit thread - public void reshape(WindowDimensions newDimensions, int op, + private void reshape(WindowDimensions newDimensions, int op, boolean userReshape) { if (insLog.isLoggable(PlatformLogger.Level.FINE)) { @@ -599,81 +592,75 @@ abstract class XDecoratedPeer extends XWindowPeer { } newDimensions = new WindowDimensions(newBounds, insets, newDimensions.isClientSizeSet()); } - XToolkit.awtLock(); - try { - if (!isReparented() || !isVisible()) { - if (insLog.isLoggable(PlatformLogger.Level.FINE)) { - insLog.fine("- not reparented({0}) or not visible({1}), default reshape", - Boolean.valueOf(isReparented()), Boolean.valueOf(visible)); - } - - // Fix for 6323293. - // This actually is needed to preserve compatibility with previous releases - - // some of licensees are expecting componentMoved event on invisible one while - // its location changes. - Point oldLocation = getLocation(); - - Point newLocation = new Point(AWTAccessor.getComponentAccessor().getX(target), - AWTAccessor.getComponentAccessor().getY(target)); - - if (!newLocation.equals(oldLocation)) { - handleMoved(newDimensions); - } - - dimensions = new WindowDimensions(newDimensions); - updateSizeHints(dimensions); - Rectangle client = dimensions.getClientRect(); - checkShellRect(client); - setShellBounds(client); - if (content != null && - !content.getSize().equals(newDimensions.getSize())) - { - reconfigureContentWindow(newDimensions); - } - return; + if (!isReparented() || !isVisible()) { + if (insLog.isLoggable(PlatformLogger.Level.FINE)) { + insLog.fine("- not reparented({0}) or not visible({1}), default reshape", + Boolean.valueOf(isReparented()), Boolean.valueOf(visible)); } - int wm = XWM.getWMID(); - updateChildrenSizes(); - applyGuessedInsets(); + // Fix for 6323293. + // This actually is needed to preserve compatibility with previous releases - + // some of licensees are expecting componentMoved event on invisible one while + // its location changes. + Point oldLocation = getLocation(); - Rectangle shellRect = newDimensions.getClientRect(); + Point newLocation = new Point(AWTAccessor.getComponentAccessor().getX(target), + AWTAccessor.getComponentAccessor().getY(target)); - if (gravityBug()) { - Insets in = newDimensions.getInsets(); - shellRect.translate(in.left, in.top); + if (!newLocation.equals(oldLocation)) { + handleMoved(newDimensions); } - if ((op & NO_EMBEDDED_CHECK) == 0 && isEmbedded()) { - shellRect.setLocation(0, 0); + dimensions = new WindowDimensions(newDimensions); + updateSizeHints(dimensions); + Rectangle client = dimensions.getClientRect(); + checkShellRect(client); + setShellBounds(client); + if (content != null && + !content.getSize().equals(newDimensions.getSize())) + { + reconfigureContentWindow(newDimensions); } - - checkShellRectSize(shellRect); - if (!isEmbedded()) { - checkShellRectPos(shellRect); - } - - op = op & ~NO_EMBEDDED_CHECK; - - if (op == SET_LOCATION) { - setShellPosition(shellRect); - } else if (isResizable()) { - if (op == SET_BOUNDS) { - setShellBounds(shellRect); - } else { - setShellSize(shellRect); - } - } else { - XWM.setShellNotResizable(this, newDimensions, shellRect, true); - if (op == SET_BOUNDS) { - setShellPosition(shellRect); - } - } - - reconfigureContentWindow(newDimensions); - } finally { - XToolkit.awtUnlock(); + return; } + + updateChildrenSizes(); + applyGuessedInsets(); + + Rectangle shellRect = newDimensions.getClientRect(); + + if (gravityBug()) { + Insets in = newDimensions.getInsets(); + shellRect.translate(in.left, in.top); + } + + if ((op & NO_EMBEDDED_CHECK) == 0 && isEmbedded()) { + shellRect.setLocation(0, 0); + } + + checkShellRectSize(shellRect); + if (!isEmbedded()) { + checkShellRectPos(shellRect); + } + + op = op & ~NO_EMBEDDED_CHECK; + + if (op == SET_LOCATION) { + setShellPosition(shellRect); + } else if (isResizable()) { + if (op == SET_BOUNDS) { + setShellBounds(shellRect); + } else { + setShellSize(shellRect); + } + } else { + XWM.setShellNotResizable(this, newDimensions, shellRect, true); + if (op == SET_BOUNDS) { + setShellPosition(shellRect); + } + } + + reconfigureContentWindow(newDimensions); } /** @@ -682,8 +669,6 @@ abstract class XDecoratedPeer extends XWindowPeer { private void reshape(int x, int y, int width, int height, int operation, boolean userReshape) { - Rectangle newRec; - boolean setClient = false; WindowDimensions dims = new WindowDimensions(dimensions); switch (operation & (~NO_EMBEDDED_CHECK)) { case SET_LOCATION: @@ -726,7 +711,12 @@ abstract class XDecoratedPeer extends XWindowPeer { */ public void setBounds(int x, int y, int width, int height, int op) { // TODO: Rewrite with WindowDimensions - reshape(x, y, width, height, op, true); + XToolkit.awtLock(); + try { + reshape(x, y, width, height, op, true); + } finally { + XToolkit.awtUnlock(); + } validateSurface(); } @@ -861,81 +851,74 @@ abstract class XDecoratedPeer extends XWindowPeer { checkShellRectPos(shellRect); } - public void setShellBounds(Rectangle rec) { + private void setShellBounds(Rectangle rec) { if (insLog.isLoggable(PlatformLogger.Level.FINE)) { insLog.fine("Setting shell bounds on " + this + " to " + rec); } - XToolkit.awtLock(); - try { - updateSizeHints(rec.x, rec.y, rec.width, rec.height); - XlibWrapper.XMoveResizeWindow(XToolkit.getDisplay(), getShell(), - scaleUp(rec.x), scaleUp(rec.y), - scaleUp(rec.width), scaleUp(rec.height)); - } - finally { - XToolkit.awtUnlock(); - } + updateSizeHints(rec.x, rec.y, rec.width, rec.height); + XlibWrapper.XMoveResizeWindow(XToolkit.getDisplay(), getShell(), + scaleUp(rec.x), scaleUp(rec.y), + scaleUp(rec.width), scaleUp(rec.height)); } - public void setShellSize(Rectangle rec) { + + private void setShellSize(Rectangle rec) { if (insLog.isLoggable(PlatformLogger.Level.FINE)) { insLog.fine("Setting shell size on " + this + " to " + rec); } - XToolkit.awtLock(); - try { - updateSizeHints(rec.x, rec.y, rec.width, rec.height); - XlibWrapper.XResizeWindow(XToolkit.getDisplay(), getShell(), - scaleUp(rec.width), scaleUp(rec.height)); - } - finally { - XToolkit.awtUnlock(); - } + updateSizeHints(rec.x, rec.y, rec.width, rec.height); + XlibWrapper.XResizeWindow(XToolkit.getDisplay(), getShell(), + scaleUp(rec.width), scaleUp(rec.height)); } - public void setShellPosition(Rectangle rec) { + + private void setShellPosition(Rectangle rec) { if (insLog.isLoggable(PlatformLogger.Level.FINE)) { insLog.fine("Setting shell position on " + this + " to " + rec); } - XToolkit.awtLock(); - try { - updateSizeHints(rec.x, rec.y, rec.width, rec.height); - XlibWrapper.XMoveWindow(XToolkit.getDisplay(), getShell(), - scaleUp(rec.x), scaleUp(rec.y)); - } - finally { - XToolkit.awtUnlock(); - } + updateSizeHints(rec.x, rec.y, rec.width, rec.height); + XlibWrapper.XMoveWindow(XToolkit.getDisplay(), getShell(), + scaleUp(rec.x), scaleUp(rec.y)); } - void initResizability() { - setResizable(winAttr.initialResizability); - } public void setResizable(boolean resizable) { - int fs = winAttr.functions; - if (!isResizable() && resizable) { - resetWMSetInsets(); - if (!isEmbedded()) { - setReparented(false); + XToolkit.awtLock(); + try { + int fs = winAttr.functions; + if (!isResizable() && resizable) { + resetWMSetInsets(); + if (!isEmbedded()) { + setReparented(false); + } + winAttr.isResizable = resizable; + if ((fs & MWMConstants.MWM_FUNC_ALL) != 0) { + fs &= ~(MWMConstants.MWM_FUNC_RESIZE + | MWMConstants.MWM_FUNC_MAXIMIZE); + } else { + fs |= (MWMConstants.MWM_FUNC_RESIZE + | MWMConstants.MWM_FUNC_MAXIMIZE); + } + winAttr.functions = fs; + XWM.setShellResizable(this); + } else if (isResizable() && !resizable) { + resetWMSetInsets(); + if (!isEmbedded()) { + setReparented(false); + } + winAttr.isResizable = resizable; + if ((fs & MWMConstants.MWM_FUNC_ALL) != 0) { + fs |= (MWMConstants.MWM_FUNC_RESIZE + | MWMConstants.MWM_FUNC_MAXIMIZE); + } else { + fs &= ~(MWMConstants.MWM_FUNC_RESIZE + | MWMConstants.MWM_FUNC_MAXIMIZE); + } + winAttr.functions = fs; + XWM.setShellNotResizable(this, dimensions, + XWM.getWMID() == XWM.UNITY_COMPIZ_WM && configure_seen ? + dimensions.getScreenBounds() : + dimensions.getBounds(), false); } - winAttr.isResizable = resizable; - if ((fs & MWMConstants.MWM_FUNC_ALL) != 0) { - fs &= ~(MWMConstants.MWM_FUNC_RESIZE | MWMConstants.MWM_FUNC_MAXIMIZE); - } else { - fs |= (MWMConstants.MWM_FUNC_RESIZE | MWMConstants.MWM_FUNC_MAXIMIZE); - } - winAttr.functions = fs; - XWM.setShellResizable(this); - } else if (isResizable() && !resizable) { - resetWMSetInsets(); - if (!isEmbedded()) { - setReparented(false); - } - winAttr.isResizable = resizable; - if ((fs & MWMConstants.MWM_FUNC_ALL) != 0) { - fs |= (MWMConstants.MWM_FUNC_RESIZE | MWMConstants.MWM_FUNC_MAXIMIZE); - } else { - fs &= ~(MWMConstants.MWM_FUNC_RESIZE | MWMConstants.MWM_FUNC_MAXIMIZE); - } - winAttr.functions = fs; - XWM.setShellNotResizable(this, dimensions, dimensions.getBounds(), false); + } finally { + XToolkit.awtUnlock(); } } @@ -990,17 +973,16 @@ abstract class XDecoratedPeer extends XWindowPeer { try { if (configure_seen) { return toGlobal(0,0); - } else { - Point location = target.getLocation(); - if (insLog.isLoggable(PlatformLogger.Level.FINE)) { - insLog.fine("getLocationOnScreen {0} not reparented: {1} ", - this, location); - } - return location; } } finally { XToolkit.awtUnlock(); } + Point location = target.getLocation(); + if (insLog.isLoggable(PlatformLogger.Level.FINE)) { + insLog.fine("getLocationOnScreen {0} not reparented: {1} ", + this, location); + } + return location; } @@ -1134,7 +1116,7 @@ abstract class XDecoratedPeer extends XWindowPeer { return focusProxy; } - public void handleQuit() { + private void handleQuit() { postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_CLOSING)); } diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java index 52771620736..974888986ef 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XWM.java @@ -1029,8 +1029,14 @@ final class XWM } XToolkit.awtLock(); try { - Rectangle shellBounds = window.getShellBounds(); - shellBounds.translate(-window.currentInsets.left, -window.currentInsets.top); + Rectangle shellBounds; + if (getWMID() != UNITY_COMPIZ_WM) { + shellBounds = window.getShellBounds(); + shellBounds.translate(-window.currentInsets.left, + -window.currentInsets.top); + } else { + shellBounds = window.getDimensions().getScreenBounds(); + } window.updateSizeHints(window.getDimensions()); requestWMExtents(window.getWindow()); XlibWrapper.XMoveResizeWindow(XToolkit.getDisplay(), diff --git a/jdk/test/java/awt/Window/ChangeWindowResizabilty/ChangeWindowResizabiltyTest.java b/jdk/test/java/awt/Window/ChangeWindowResizabilty/ChangeWindowResizabiltyTest.java index f2e0e95273e..d7ef91778b0 100644 --- a/jdk/test/java/awt/Window/ChangeWindowResizabilty/ChangeWindowResizabiltyTest.java +++ b/jdk/test/java/awt/Window/ChangeWindowResizabilty/ChangeWindowResizabiltyTest.java @@ -23,7 +23,7 @@ /* @test @key headful - @bug 8166897 + @bug 8166897 8167652 @summary Some font overlap in the Optionpane dialog. @run main ChangeWindowResizabiltyTest */ @@ -34,41 +34,75 @@ import java.awt.Dimension; import java.awt.Frame; import java.awt.Panel; import java.awt.Robot; +import java.awt.Point; public class ChangeWindowResizabiltyTest { public static void main(String[] args) throws Exception { Robot robot = new Robot(); for(int i = 0; i < 10; i++) { Dialog dialog = new Dialog((Frame) null); + dialog.setLocation(100, 100); Component panel = new Panel(); panel.setPreferredSize(new Dimension(200, 100)); dialog.add(panel); dialog.pack(); dialog.setVisible(true); + robot.waitForIdle(); + robot.delay(200); + + Point frameLoc = dialog.getLocationOnScreen(); + Point contentLoc = panel.getLocationOnScreen(); + + System.out.println("Decor location " + frameLoc); + System.out.println("Content location " + contentLoc); dialog.setResizable(false); robot.waitForIdle(); robot.delay(200); - System.out.println(panel.getLocationOnScreen()); - System.out.println(dialog.getLocationOnScreen()); + Point l = dialog.getLocationOnScreen(); + if (!l.equals(frameLoc)) { + dialog.dispose(); + throw new RuntimeException("Decorated frame location moved " + + "after setResizable(false)" + l); + } + + l = panel.getLocationOnScreen(); + if (!l.equals(contentLoc)) { + dialog.dispose(); + throw new RuntimeException("Content location moved after " + + "setResizable(false)" + l); + } + if (panel.getLocationOnScreen().y < - dialog.getLocationOnScreen().y + dialog.getInsets().top) { + dialog.getLocationOnScreen().y + dialog.getInsets().top) { dialog.dispose(); throw new RuntimeException( - "Wrong content position after setResizable(false)"); + "Wrong content position after setResizable(false)"); } dialog.setResizable(true); robot.waitForIdle(); robot.delay(200); - System.out.println(panel.getLocationOnScreen()); - System.out.println(dialog.getLocationOnScreen()); + + l = dialog.getLocationOnScreen(); + if (!l.equals(frameLoc)) { + dialog.dispose(); + throw new RuntimeException("Decorated frame location moved " + + "after setResizable(true)" + l); + } + + l = panel.getLocationOnScreen(); + if (!l.equals(contentLoc)) { + dialog.dispose(); + throw new RuntimeException("Content location moved after " + + "setResizable(true)" + l); + } if (panel.getLocationOnScreen().y < - dialog.getLocationOnScreen().y + dialog.getInsets().top) { + dialog.getLocationOnScreen().y + dialog.getInsets().top) { dialog.dispose(); throw new RuntimeException( - "Wrong content position after setResizable(true)"); + "Wrong content position after setResizable(true)"); } dialog.dispose();