8041734: JFrame in full screen mode leaves empty workspace after close
authorserb
Tue, 23 Sep 2014 07:13:34 +0400
changeset 27052 0b783c32e5c2
parent 27051 1d67c856f347
child 27053 b8def728da69
8041734: JFrame in full screen mode leaves empty workspace after close Reviewed-by: azvegint, alexsch
jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java
jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CWrapper.java
jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CWrapper.m
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Tue Sep 23 20:17:56 2014 +0400
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java	Tue Sep 23 07:13:34 2014 +0400
@@ -567,7 +567,10 @@
                     CWrapper.NSWindow.makeKeyWindow(nsWindowPtr);
                 }
             } else {
+                // immediately hide the window
                 CWrapper.NSWindow.orderOut(nsWindowPtr);
+                // process the close
+                CWrapper.NSWindow.close(nsWindowPtr);
             }
         } else {
             // otherwise, put it in a proper z-order
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CWrapper.java	Tue Sep 23 20:17:56 2014 +0400
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CWrapper.java	Tue Sep 23 07:13:34 2014 +0400
@@ -54,8 +54,26 @@
         static native void orderFront(long window);
         static native void orderFrontRegardless(long window);
         static native void orderWindow(long window, int ordered, long relativeTo);
+
+        /**
+         * Removes the window from the screen.
+         *
+         * @param window the pointer of the NSWindow
+         */
         static native void orderOut(long window);
 
+        /**
+         * Removes the window from the screen and releases it. According to
+         * documentation this method should be similar to {@link #orderOut},
+         * because we use ReleasedWhenClosed:NO, so the window shouldn't be
+         * released. But the close method works differently, for example it
+         * close the space if the window was in the full screen via
+         * {@link CPlatformWindow#toggleFullScreen()}.
+         *
+         * @param window the pointer of the NSWindow
+         */
+        static native void close(long window);
+
         static native void addChildWindow(long parent, long child, int ordered);
         static native void removeChildWindow(long parent, long child);
 
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CWrapper.m	Tue Sep 23 20:17:56 2014 +0400
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CWrapper.m	Tue Sep 23 07:13:34 2014 +0400
@@ -175,6 +175,23 @@
 
 /*
  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
+ * Method:    close
+ * Signature: (J)V
+ */
+JNIEXPORT void JNICALL
+Java_sun_lwawt_macosx_CWrapper_00024NSWindow_close
+        (JNIEnv *env, jclass cls, jlong windowPtr)
+{
+JNF_COCOA_ENTER(env);
+    NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
+    [ThreadUtilities performOnMainThreadWaiting:NO block:^(){
+        [window close];
+    }];
+JNF_COCOA_EXIT(env);
+}
+
+/*
+ * Class:     sun_lwawt_macosx_CWrapper$NSWindow
  * Method:    orderFrontRegardless
  * Signature: (J)V
  */