Mercurial > hg > openjdk > aarch64-port > jdk
changeset 10739:a119e519df70
8020443: Frame is not created on the specified GraphicsDevice with two monitors
Reviewed-by: serb, azvegint, pchelko
author | bagiras |
---|---|
date | Thu, 06 Feb 2014 19:03:36 +0400 |
parents | a7ee8157daa6 |
children | 98b38d0d7c92 |
files | src/solaris/classes/sun/awt/X11/XToolkit.java test/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java |
diffstat | 2 files changed, 115 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/solaris/classes/sun/awt/X11/XToolkit.java Tue Mar 10 09:37:56 2015 +0100 +++ b/src/solaris/classes/sun/awt/X11/XToolkit.java Thu Feb 06 19:03:36 2014 +0400 @@ -814,10 +814,32 @@ // managers don't set this hint correctly, so we just get intersection with windowBounds if (windowBounds != null && windowBounds.intersects(screenBounds)) { - insets.left = Math.max((int)Native.getLong(native_ptr, 0), insets.left); - insets.right = Math.max((int)Native.getLong(native_ptr, 1), insets.right); - insets.top = Math.max((int)Native.getLong(native_ptr, 2), insets.top); - insets.bottom = Math.max((int)Native.getLong(native_ptr, 3), insets.bottom); + int left = (int)Native.getLong(native_ptr, 0); + int right = (int)Native.getLong(native_ptr, 1); + int top = (int)Native.getLong(native_ptr, 2); + int bottom = (int)Native.getLong(native_ptr, 3); + + /* + * struts could be relative to root window bounds, so + * make them relative to the screen bounds in this case + */ + left = rootBounds.x + left > screenBounds.x ? + rootBounds.x + left - screenBounds.x : 0; + right = rootBounds.x + rootBounds.width - right < + screenBounds.x + screenBounds.width ? + screenBounds.x + screenBounds.width - + (rootBounds.x + rootBounds.width - right) : 0; + top = rootBounds.y + top > screenBounds.y ? + rootBounds.y + top - screenBounds.y : 0; + bottom = rootBounds.y + rootBounds.height - bottom < + screenBounds.y + screenBounds.height ? + screenBounds.y + screenBounds.height - + (rootBounds.y + rootBounds.height - bottom) : 0; + + insets.left = Math.max(left, insets.left); + insets.right = Math.max(right, insets.right); + insets.top = Math.max(top, insets.top); + insets.bottom = Math.max(bottom, insets.bottom); } } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java Thu Feb 06 19:03:36 2014 +0400 @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2014, 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 8020443 + @summary Frame is not created on the specified GraphicsDevice with two +monitors + @author Oleg Pekhovskiy + @run main MultiScreenInsetsTest + */ + +import java.awt.Frame; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.Toolkit; +import sun.awt.OSInfo; + +public class MultiScreenInsetsTest { + private static final int SIZE = 100; + + public static void main(String[] args) throws InterruptedException { + OSInfo.OSType type = OSInfo.getOSType(); + if (type != OSInfo.OSType.LINUX && type != OSInfo.OSType.SOLARIS) { + System.out.println("This test is for Solaris and Linux only..." + + "skipping!"); + return; + } + + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gds = ge.getScreenDevices(); + if (gds.length < 2) { + System.out.println("It's a multi-screen test... skipping!"); + return; + } + + for (int screen = 0; screen < gds.length; ++screen) { + GraphicsDevice gd = gds[screen]; + GraphicsConfiguration gc = gd.getDefaultConfiguration(); + Rectangle bounds = gc.getBounds(); + Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gc); + + Frame frame = new Frame(gc); + frame.setLocation(bounds.x + (bounds.width - SIZE) / 2, + bounds.y + (bounds.height - SIZE) / 2); + frame.setSize(SIZE, SIZE); + frame.setUndecorated(true); + frame.setVisible(true); + + // Maximize Frame to reach the struts + frame.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); + Thread.sleep(2000); + + Rectangle frameBounds = frame.getBounds(); + frame.dispose(); + if (bounds.x + insets.left != frameBounds.x + || bounds.y + insets.top != frameBounds.y + || bounds.width - insets.right - insets.left != frameBounds.width + || bounds.height - insets.bottom - insets.top != frameBounds.height) { + throw new RuntimeException("Test FAILED! Wrong screen #" + + screen + " insets: " + insets); + } + } + System.out.println("Test PASSED!"); + } +}