8003169: [macosx] JVM crash after disconnecting from projector
Reviewed-by: anthony, alexsch
--- a/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java Thu Feb 28 17:04:19 2013 +0400
+++ b/jdk/src/macosx/classes/sun/awt/CGraphicsDevice.java Thu Feb 28 20:27:38 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -29,6 +29,7 @@
import java.awt.DisplayMode;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
+import java.awt.Insets;
import java.awt.Window;
import java.util.Objects;
@@ -110,8 +111,9 @@
return nativeGetYResolution(displayID);
}
- private static native double nativeGetXResolution(int displayID);
- private static native double nativeGetYResolution(int displayID);
+ public Insets getScreenInsets() {
+ return nativeGetScreenInsets(displayID);
+ }
/**
* Enters full-screen mode, or returns to windowed mode.
@@ -217,9 +219,15 @@
return nativeGetDisplayModes(displayID);
}
- private native void nativeSetDisplayMode(int displayID, int w, int h, int bpp, int refrate);
+ private static native void nativeSetDisplayMode(int displayID, int w, int h, int bpp, int refrate);
+
+ private static native DisplayMode nativeGetDisplayMode(int displayID);
+
+ private static native DisplayMode[] nativeGetDisplayModes(int displayID);
- private native DisplayMode nativeGetDisplayMode(int displayID);
+ private static native double nativeGetXResolution(int displayID);
- private native DisplayMode[] nativeGetDisplayModes(int displayID);
+ private static native double nativeGetYResolution(int displayID);
+
+ private static native Insets nativeGetScreenInsets(int displayID);
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Thu Feb 28 17:04:19 2013 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Thu Feb 28 20:27:38 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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
@@ -351,22 +351,7 @@
@Override
public Insets getScreenInsets(final GraphicsConfiguration gc) {
- final CGraphicsConfig cgc = (CGraphicsConfig) gc;
- final int displayId = cgc.getDevice().getCGDisplayID();
- Rectangle fullScreen, workArea;
- final long screen = CWrapper.NSScreen.screenByDisplayId(displayId);
- try {
- fullScreen = CWrapper.NSScreen.frame(screen).getBounds();
- workArea = CWrapper.NSScreen.visibleFrame(screen).getBounds();
- } finally {
- CWrapper.NSObject.release(screen);
- }
- // Convert between Cocoa's coordinate system and Java.
- int bottom = workArea.y - fullScreen.y;
- int top = fullScreen.height - workArea.height - bottom;
- int left = workArea.x - fullScreen.x;
- int right = fullScreen.width - workArea.width - left;
- return new Insets(top, left, bottom, right);
+ return ((CGraphicsConfig) gc).getDevice().getScreenInsets();
}
@Override
--- a/jdk/src/macosx/native/sun/awt/CGraphicsDevice.m Thu Feb 28 17:04:19 2013 +0400
+++ b/jdk/src/macosx/native/sun/awt/CGraphicsDevice.m Thu Feb 28 20:27:38 2013 +0400
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 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
@@ -23,7 +23,8 @@
* questions.
*/
-#include "LWCToolkit.h"
+#import "LWCToolkit.h"
+#import "ThreadUtilities.h"
/*
* Convert the mode string to the more convinient bits per pixel value
@@ -148,6 +149,47 @@
/*
* Class: sun_awt_CGraphicsDevice
+ * Method: nativeGetScreenInsets
+ * Signature: (I)D
+ */
+JNIEXPORT jobject JNICALL
+Java_sun_awt_CGraphicsDevice_nativeGetScreenInsets
+ (JNIEnv *env, jclass class, jint displayID)
+{
+ jobject ret = NULL;
+ __block NSRect frame = NSZeroRect;
+ __block NSRect visibleFrame = NSZeroRect;
+JNF_COCOA_ENTER(env);
+
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
+ NSArray *screens = [NSScreen screens];
+ for (NSScreen *screen in screens) {
+ NSDictionary *screenInfo = [screen deviceDescription];
+ NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
+ if ([screenID pointerValue] == displayID){
+ frame = [screen frame];
+ visibleFrame = [screen visibleFrame];
+ break;
+ }
+ }
+ }];
+ // Convert between Cocoa's coordinate system and Java.
+ jint bottom = visibleFrame.origin.y - frame.origin.y;
+ jint top = frame.size.height - visibleFrame.size.height - bottom;
+ jint left = visibleFrame.origin.x - frame.origin.x;
+ jint right = frame.size.width - visibleFrame.size.width - left;
+
+ static JNF_CLASS_CACHE(jc_Insets, "java/awt/Insets");
+ static JNF_CTOR_CACHE(jc_Insets_ctor, jc_Insets, "(IIII)V");
+ ret = JNFNewObject(env, jc_Insets_ctor, top, left, bottom, right);
+
+JNF_COCOA_EXIT(env);
+
+ return ret;
+}
+
+/*
+ * Class: sun_awt_CGraphicsDevice
* Method: nativeSetDisplayMode
* Signature: (IIIII)V
*/