提交 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.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -29,6 +29,7 @@ import java.awt.AWTPermission;
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 @@ public final class CGraphicsDevice extends GraphicsDevice {
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 @@ public final class CGraphicsDevice extends GraphicsDevice {
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.
*
* This code is free software; you can redistribute it and/or modify it
......@@ -351,22 +351,7 @@ public final class LWCToolkit extends LWToolkit {
@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
......
/*
* 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
......@@ -146,6 +147,47 @@ Java_sun_awt_CGraphicsDevice_nativeGetYResolution
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
* Method: nativeSetDisplayMode
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册