提交 e5f431d0 编写于 作者: P pchelko

8020210: [macosx] JVM crashes in CWrapper$NSWindow.screen(long)

Reviewed-by: anthony, art
上级 1466a855
...@@ -479,12 +479,14 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -479,12 +479,14 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
deliverZoom(true); deliverZoom(true);
this.normalBounds = peer.getBounds(); this.normalBounds = peer.getBounds();
long screen = CWrapper.NSWindow.screen(getNSWindowPtr());
Rectangle toBounds = CWrapper.NSScreen.visibleFrame(screen).getBounds(); GraphicsConfiguration config = getPeer().getGraphicsConfiguration();
// Flip the y coordinate Insets i = ((CGraphicsDevice)config.getDevice()).getScreenInsets();
Rectangle frame = CWrapper.NSScreen.frame(screen).getBounds(); Rectangle toBounds = config.getBounds();
toBounds.y = frame.height - toBounds.y - toBounds.height; setBounds(toBounds.x + i.left,
setBounds(toBounds.x, toBounds.y, toBounds.width, toBounds.height); toBounds.y + i.top,
toBounds.width - i.left - i.right,
toBounds.height - i.top - i.bottom);
} }
} }
...@@ -751,13 +753,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -751,13 +753,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
// the move/size notification from the underlying system comes // the move/size notification from the underlying system comes
// but it contains a bounds smaller than the whole screen // but it contains a bounds smaller than the whole screen
// and therefore we need to create the synthetic notifications // and therefore we need to create the synthetic notifications
Rectangle screenBounds; Rectangle screenBounds = getPeer().getGraphicsConfiguration().getBounds();
final long screenPtr = CWrapper.NSWindow.screen(getNSWindowPtr());
try {
screenBounds = CWrapper.NSScreen.frame(screenPtr).getBounds();
} finally {
CWrapper.NSObject.release(screenPtr);
}
peer.notifyReshape(screenBounds.x, screenBounds.y, screenBounds.width, peer.notifyReshape(screenBounds.x, screenBounds.y, screenBounds.width,
screenBounds.height); screenBounds.height);
} }
......
...@@ -71,8 +71,6 @@ public final class CWrapper { ...@@ -71,8 +71,6 @@ public final class CWrapper {
public static native void zoom(long window); public static native void zoom(long window);
public static native void makeFirstResponder(long window, long responder); public static native void makeFirstResponder(long window, long responder);
public static native long screen(long window);
} }
public static final class NSView { public static final class NSView {
...@@ -95,12 +93,6 @@ public final class CWrapper { ...@@ -95,12 +93,6 @@ public final class CWrapper {
public static native void release(long object); public static native void release(long object);
} }
public static final class NSScreen {
public static native Rectangle2D frame(long screen);
public static native Rectangle2D visibleFrame(long screen);
public static native long screenByDisplayId(int displayID);
}
public static final class NSColor { public static final class NSColor {
public static native long clearColor(); public static native long clearColor();
} }
......
...@@ -396,31 +396,6 @@ JNF_COCOA_ENTER(env); ...@@ -396,31 +396,6 @@ JNF_COCOA_ENTER(env);
JNF_COCOA_EXIT(env); JNF_COCOA_EXIT(env);
} }
/*
* Class: sun_lwawt_macosx_CWrapper$NSWindow
* Method: screen
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL
Java_sun_lwawt_macosx_CWrapper_00024NSWindow_screen
(JNIEnv *env, jclass cls, jlong windowPtr)
{
__block jlong screenPtr = 0L;
JNF_COCOA_ENTER(env);
AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
const NSScreen *screen = [window screen];
CFRetain(screen); // GC
screenPtr = ptr_to_jlong(screen);
}];
JNF_COCOA_EXIT(env);
return screenPtr;
}
/* /*
* Method: miniaturize * Method: miniaturize
* Signature: (J)V * Signature: (J)V
...@@ -690,92 +665,6 @@ JNF_COCOA_ENTER(env); ...@@ -690,92 +665,6 @@ JNF_COCOA_ENTER(env);
JNF_COCOA_EXIT(env); JNF_COCOA_EXIT(env);
} }
/*
* Class: sun_lwawt_macosx_CWrapper$NSScreen
* Method: frame
* Signature: (J)Ljava/awt/Rectangle;
*/
JNIEXPORT jobject JNICALL
Java_sun_lwawt_macosx_CWrapper_00024NSScreen_frame
(JNIEnv *env, jclass cls, jlong screenPtr)
{
jobject jRect = NULL;
JNF_COCOA_ENTER(env);
__block NSRect rect = NSZeroRect;
NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
rect = [screen frame];
}];
jRect = NSToJavaRect(env, rect);
JNF_COCOA_EXIT(env);
return jRect;
}
/*
* Class: sun_lwawt_macosx_CWrapper_NSScreen
* Method: visibleFrame
* Signature: (J)Ljava/awt/geom/Rectangle2D;
*/
JNIEXPORT jobject JNICALL
Java_sun_lwawt_macosx_CWrapper_00024NSScreen_visibleFrame
(JNIEnv *env, jclass cls, jlong screenPtr)
{
jobject jRect = NULL;
JNF_COCOA_ENTER(env);
__block NSRect rect = NSZeroRect;
NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
rect = [screen visibleFrame];
}];
jRect = NSToJavaRect(env, rect);
JNF_COCOA_EXIT(env);
return jRect;
}
/*
* Class: sun_lwawt_macosx_CWrapper_NSScreen
* Method: screenByDisplayId
* Signature: (J)J
*/
JNIEXPORT jlong JNICALL
Java_sun_lwawt_macosx_CWrapper_00024NSScreen_screenByDisplayId
(JNIEnv *env, jclass cls, jint displayID)
{
__block jlong screenPtr = 0L;
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 intValue] == displayID){
CFRetain(screen); // GC
screenPtr = ptr_to_jlong(screen);
break;
}
}
}];
JNF_COCOA_EXIT(env);
return screenPtr;
}
/* /*
* Class: sun_lwawt_macosx_CWrapper$NSColor * Class: sun_lwawt_macosx_CWrapper$NSColor
* Method: clearColor * Method: clearColor
......
/*
* 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.
*/
/**
* @test @summary JVM crash if the frame maximized from offscreen
* @author Petr Pchelko
* @library ../../regtesthelpers
* @build Util
* @compile MaximizeOffscreenTest.java
* @run main/othervm MaximizeOffscreenTest
*/
import test.java.awt.regtesthelpers.Util;
import javax.swing.*;
import java.awt.*;
public class MaximizeOffscreenTest {
private static JFrame frame;
public static void main(String[] args) throws Throwable {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
constructTestUI();
}
});
Util.waitForIdle(null);
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
}
});
Util.waitForIdle(null);
}
private static void constructTestUI() {
frame = new JFrame("Test frame");
frame.setUndecorated(true);
frame.setBounds(-1000, -1000, 100, 100);
frame.setVisible(true);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册