提交 67a01dda 编写于 作者: S serb

8003169: [macosx] JVM crash after disconnecting from projector

Reviewed-by: anthony, alexsch
上级 7ace10d5
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -29,6 +29,7 @@ import java.awt.AWTPermission; ...@@ -29,6 +29,7 @@ import java.awt.AWTPermission;
import java.awt.DisplayMode; import java.awt.DisplayMode;
import java.awt.GraphicsConfiguration; import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice; import java.awt.GraphicsDevice;
import java.awt.Insets;
import java.awt.Window; import java.awt.Window;
import java.util.Objects; import java.util.Objects;
...@@ -110,8 +111,9 @@ public final class CGraphicsDevice extends GraphicsDevice { ...@@ -110,8 +111,9 @@ public final class CGraphicsDevice extends GraphicsDevice {
return nativeGetYResolution(displayID); return nativeGetYResolution(displayID);
} }
private static native double nativeGetXResolution(int displayID); public Insets getScreenInsets() {
private static native double nativeGetYResolution(int displayID); return nativeGetScreenInsets(displayID);
}
/** /**
* Enters full-screen mode, or returns to windowed mode. * Enters full-screen mode, or returns to windowed mode.
...@@ -217,9 +219,15 @@ public final class CGraphicsDevice extends GraphicsDevice { ...@@ -217,9 +219,15 @@ public final class CGraphicsDevice extends GraphicsDevice {
return nativeGetDisplayModes(displayID); 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 native DisplayMode nativeGetDisplayMode(int displayID); private static native DisplayMode[] nativeGetDisplayModes(int displayID);
private static native double nativeGetXResolution(int displayID);
private static native double nativeGetYResolution(int displayID);
private native DisplayMode[] nativeGetDisplayModes(int displayID); private static native Insets nativeGetScreenInsets(int displayID);
} }
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -351,22 +351,7 @@ public final class LWCToolkit extends LWToolkit { ...@@ -351,22 +351,7 @@ public final class LWCToolkit extends LWToolkit {
@Override @Override
public Insets getScreenInsets(final GraphicsConfiguration gc) { public Insets getScreenInsets(final GraphicsConfiguration gc) {
final CGraphicsConfig cgc = (CGraphicsConfig) gc; return ((CGraphicsConfig) gc).getDevice().getScreenInsets();
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);
} }
@Override @Override
......
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -23,7 +23,8 @@ ...@@ -23,7 +23,8 @@
* questions. * questions.
*/ */
#include "LWCToolkit.h" #import "LWCToolkit.h"
#import "ThreadUtilities.h"
/* /*
* Convert the mode string to the more convinient bits per pixel value * Convert the mode string to the more convinient bits per pixel value
...@@ -146,6 +147,47 @@ Java_sun_awt_CGraphicsDevice_nativeGetYResolution ...@@ -146,6 +147,47 @@ Java_sun_awt_CGraphicsDevice_nativeGetYResolution
return dpi; return dpi;
} }
/*
* 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 * Class: sun_awt_CGraphicsDevice
* Method: nativeSetDisplayMode * Method: nativeSetDisplayMode
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册