# HG changeset patch # User pchelko # Date 1387456828 -14400 # Node ID e4c63212ac0960dfcfeb59c61951eb6fdb55e78b # Parent e1de5002b069d21289331fe24f66342bcc6ad3fe 8024185: [macosx] Fullscreen button freezes application when started with -splash Reviewed-by: anthony, serb diff -r e1de5002b069 -r e4c63212ac09 jdk/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m --- a/jdk/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m Wed Dec 18 18:52:07 2013 +0400 +++ b/jdk/src/macosx/native/sun/awt/splashscreen/splashscreen_sys.m Thu Dec 19 16:40:28 2013 +0400 @@ -142,10 +142,9 @@ 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 -r e1de5002b069 -r e4c63212ac09 jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/SplashScreen/FullscreenAfterSplash/FullScreenAfterSplash.java Thu Dec 19 16:40:28 2013 +0400 @@ -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 -r e1de5002b069 -r e4c63212ac09 jdk/test/java/awt/SplashScreen/GenerateTestImage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/SplashScreen/GenerateTestImage.java Thu Dec 19 16:40:28 2013 +0400 @@ -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); + } + } +}