From 3d4b517425b3a120153d92896fc8b53e655a66d2 Mon Sep 17 00:00:00 2001 From: pchelko Date: Thu, 19 Dec 2013 16:40:28 +0400 Subject: [PATCH] 8024185: [macosx] Fullscreen button freezes application when started with -splash Reviewed-by: anthony, serb --- .../sun/awt/splashscreen/splashscreen_sys.m | 7 +- .../FullScreenAfterSplash.java | 140 ++++++++++++++++++ .../awt/SplashScreen/GenerateTestImage.java | 49 ++++++ 3 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java create mode 100644 test/java/awt/SplashScreen/GenerateTestImage.java diff --git a/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m b/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m index 44b28f032..40f380bde 100644 --- a/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m +++ b/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m @@ -142,10 +142,9 @@ SplashInitPlatform(Splash * splash) { splash->screenFormat.byteOrder = 1 ? BYTE_ORDER_LSBFIRST : BYTE_ORDER_MSBFIRST; splash->screenFormat.depthBytes = 4; - dispatch_async(dispatch_get_main_queue(), ^(void) { - NSApplication * app = [NSApplicationAWT sharedApplication]; - [NSApplicationAWT runAWTLoopWithApp: app]; - }); + [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^() { + [NSApplicationAWT runAWTLoopWithApp:[NSApplicationAWT sharedApplication]]; + }]; } void diff --git a/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java b/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java new file mode 100644 index 000000000..b5e019ec7 --- /dev/null +++ b/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java @@ -0,0 +1,140 @@ +/* +* Copyright (c) 2013, 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. +*/ + +import sun.awt.OSInfo; + +import java.awt.*; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.lang.InterruptedException; +import java.lang.System; +import java.lang.Thread; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import javax.swing.*; + +/* + * @test + * @bug 8024185 + * @summary Native Mac OS X full screen does not work after showing the splash + * @library ../ + * @build GenerateTestImage + * @run main GenerateTestImage + * @author Petr Pchelko area=awt.event + * @run main/othervm -splash:test.png FullScreenAfterSplash + */ +public class FullScreenAfterSplash { + + private static JFrame frame; + + private static volatile boolean windowEnteringFullScreen = false; + private static volatile boolean windowEnteredFullScreen = false; + + public static void main(String[] args) throws Exception { + + if (OSInfo.getOSType() != OSInfo.OSType.MACOSX) { + System.out.println("The test is applicable only to Mac OS X. Passed"); + return; + } + try { + //Move the mouse out, because it could interfere with the test. + Robot r = new Robot(); + r.mouseMove(0, 0); + sleep(); + + SwingUtilities.invokeAndWait(FullScreenAfterSplash::createAndShowGUI); + sleep(); + + Point fullScreenButtonPos = frame.getLocation(); + fullScreenButtonPos.translate(frame.getWidth() - 10, 10); + r.mouseMove(fullScreenButtonPos.x, fullScreenButtonPos.y); + + //Cant use waitForIdle for full screen transition. + int waitCount = 0; + while (!windowEnteringFullScreen) { + r.mousePress(InputEvent.BUTTON1_MASK); + r.mouseRelease(InputEvent.BUTTON1_MASK); + Thread.sleep(100); + if (waitCount++ > 10) { + System.err.println("Can't enter full screen mode. Failed."); + System.exit(1); + } + } + + waitCount = 0; + while (!windowEnteredFullScreen) { + Thread.sleep(100); + if (waitCount++ > 10) { + System.err.println("Can't enter full screen mode. Failed."); + System.exit(1); + } + } + } finally { + if (frame != null) { + frame.dispose(); + } + } + } + + private static void createAndShowGUI() { + frame = new JFrame(" Fullscreen OSX Bug "); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + enableFullScreen(frame); + frame.setBounds(100, 100, 100, 100); + frame.pack(); + frame.setVisible(true); + } + + /* + * Use reflection to make a test compilable on not Mac OS X + */ + private static void enableFullScreen(Window window) { + try { + Class fullScreenUtilities = Class.forName("com.apple.eawt.FullScreenUtilities"); + Method setWindowCanFullScreen = fullScreenUtilities.getMethod("setWindowCanFullScreen", Window.class, boolean.class); + setWindowCanFullScreen.invoke(fullScreenUtilities, window, true); + Class fullScreenListener = Class.forName("com.apple.eawt.FullScreenListener"); + Object listenerObject = Proxy.newProxyInstance(fullScreenListener.getClassLoader(), new Class[]{fullScreenListener}, (proxy, method, args) -> { + switch (method.getName()) { + case "windowEnteringFullScreen": + windowEnteringFullScreen = true; + break; + case "windowEnteredFullScreen": + windowEnteredFullScreen = true; + break; + } + return null; + }); + Method addFullScreenListener = fullScreenUtilities.getMethod("addFullScreenListenerTo", Window.class, fullScreenListener); + addFullScreenListener.invoke(fullScreenUtilities, window, listenerObject); + } catch (Exception e) { + throw new RuntimeException("FullScreen utilities not available", e); + } + } + + private static void sleep() { + try { + Thread.sleep(500); + } catch (InterruptedException ignored) { } + } +} diff --git a/test/java/awt/SplashScreen/GenerateTestImage.java b/test/java/awt/SplashScreen/GenerateTestImage.java new file mode 100644 index 000000000..9c0613398 --- /dev/null +++ b/test/java/awt/SplashScreen/GenerateTestImage.java @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2013, 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. +*/ + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileOutputStream; + +/** + * A utility to generate a test image for the SplashScreen test + */ +public class GenerateTestImage { + private static final int IMAGE_SIZE = 20; + + public static void main(String[] args) throws Exception { + String path = System.getProperty("test.classes") + File.separator + "test.png"; + + BufferedImage image = new BufferedImage(IMAGE_SIZE, IMAGE_SIZE, BufferedImage.TYPE_INT_ARGB); + Graphics2D graphics2D = image.createGraphics(); + graphics2D.setColor(Color.red); + graphics2D.fillOval(0, 0, IMAGE_SIZE, IMAGE_SIZE); + graphics2D.dispose();; + + try(FileOutputStream fos = new FileOutputStream(path)) { + ImageIO.write(image, "png", fos); + } + } +} -- GitLab