From 9b6f619adfe37fe6d31b712b4cebe71234f8eeee Mon Sep 17 00:00:00 2001 From: bagiras Date: Thu, 6 Feb 2014 19:03:36 +0400 Subject: [PATCH] 8020443: Frame is not created on the specified GraphicsDevice with two monitors Reviewed-by: serb, azvegint, pchelko --- src/solaris/classes/sun/awt/X11/XToolkit.java | 30 ++++++- .../MultiScreenInsetsTest.java | 89 +++++++++++++++++++ 2 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 test/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java diff --git a/src/solaris/classes/sun/awt/X11/XToolkit.java b/src/solaris/classes/sun/awt/X11/XToolkit.java index 8a264d200..f8673f81c 100644 --- a/src/solaris/classes/sun/awt/X11/XToolkit.java +++ b/src/solaris/classes/sun/awt/X11/XToolkit.java @@ -814,10 +814,32 @@ public final class XToolkit extends UNIXToolkit implements Runnable { // 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); } } } diff --git a/test/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java b/test/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java new file mode 100644 index 000000000..8005c03de --- /dev/null +++ b/test/java/awt/Multiscreen/MultiScreenInsetsTest/MultiScreenInsetsTest.java @@ -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!"); + } +} -- GitLab