OpenJDK / jdk / hs
changeset 6822:0a6eba317c96
6895647: Frame may jump to an unpredicted location upon entering the non-opaque mode on X11
Summary: Make sure the size hints are set before mapping the window on the screen
Reviewed-by: art, dcherepanov
author | anthony |
---|---|
date | Tue, 12 Oct 2010 15:52:58 +0400 |
parents | f5949f5159ec |
children | cff6c85026c4 |
files | jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java jdk/test/java/awt/Frame/FrameLocation/FrameLocation.java |
diffstat | 2 files changed, 73 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Wed Oct 06 16:42:15 2010 +0400 +++ b/jdk/src/solaris/classes/sun/awt/X11/XDecoratedPeer.java Tue Oct 12 15:52:58 2010 +0400 @@ -87,11 +87,15 @@ } void postInit(XCreateWindowParams params) { + // The size hints must be set BEFORE mapping the window (see 6895647) + updateSizeHints(dimensions); + + // The super method maps the window if it's visible on the shared level super.postInit(params); + // The lines that follow need to be in a postInit, so they // happen after the X window is created. initResizability(); - updateSizeHints(dimensions); XWM.requestWMExtents(getWindow()); content = XContentWindow.createContent(this);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Frame/FrameLocation/FrameLocation.java Tue Oct 12 15:52:58 2010 +0400 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + @test + @bug 6895647 + @summary X11 Frame locations should be what we set them to + @author anthony.petrov@oracle.com: area=awt.toplevel + @run main FrameLocation + */ + +import java.awt.*; + +public class FrameLocation { + private static final int X = 250; + private static final int Y = 250; + + public static void main(String[] args) { + Frame f = new Frame("test"); + f.setBounds(X, Y, 250, 250); // the size doesn't matter + f.setVisible(true); + + for (int i = 0; i < 10; i++) { + // 2 seconds must be enough for the WM to show the window + try { + Thread.sleep(2000); + } catch (InterruptedException ex) { + } + + // Check the location + int x = f.getX(); + int y = f.getY(); + + if (x != X || y != Y) { + throw new RuntimeException("The frame location is wrong! Current: " + x + ", " + y + "; expected: " + X + ", " + Y); + } + + // Emulate what happens when setGraphicsConfiguration() is called + synchronized (f.getTreeLock()) { + f.removeNotify(); + f.addNotify(); + } + } + + f.dispose(); + } +} +