--- old/src/macosx/classes/sun/lwawt/LWToolkit.java 2012-12-04 16:20:59.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/LWToolkit.java 2012-12-04 16:20:59.000000000 +0400 @@ -210,9 +210,9 @@ * and DialogPeer interfaces. */ private LWWindowPeer createDelegatedPeer(Window target, PlatformComponent platformComponent, - PlatformWindow platformWindow) + PlatformWindow platformWindow, LWWindowPeer.PeerType peerType) { - LWWindowPeer peer = new LWWindowPeer(target, platformComponent, platformWindow); + LWWindowPeer peer = new LWWindowPeer(target, platformComponent, platformWindow, peerType); targetCreatedPeer(target, peer); peer.initialize(); return peer; @@ -222,21 +222,28 @@ public WindowPeer createWindow(Window target) { PlatformComponent platformComponent = createPlatformComponent(); PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.SIMPLEWINDOW); - return createDelegatedPeer(target, platformComponent, platformWindow); + return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.SIMPLEWINDOW); } @Override public FramePeer createFrame(Frame target) { PlatformComponent platformComponent = createPlatformComponent(); PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.FRAME); - return createDelegatedPeer(target, platformComponent, platformWindow); + return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.FRAME); } public LWWindowPeer createEmbeddedFrame(CEmbeddedFrame target) { PlatformComponent platformComponent = createPlatformComponent(); PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.EMBEDDEDFRAME); - return createDelegatedPeer(target, platformComponent, platformWindow); + return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.EMBEDDEDFRAME); } + + public LWWindowPeer createEmbeddedFrame(CViewEmbeddedFrame target) { + PlatformComponent platformComponent = createPlatformComponent(); + PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.VIEWEMBEDDEDFRAME); + return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.VIEWEMBEDDEDFRAME); + } + CPrinterDialogPeer createCPrinterDialog(CPrinterDialog target) { PlatformComponent platformComponent = createPlatformComponent(); @@ -254,7 +261,7 @@ PlatformComponent platformComponent = createPlatformComponent(); PlatformWindow platformWindow = createPlatformWindow(LWWindowPeer.PeerType.DIALOG); - return createDelegatedPeer(target, platformComponent, platformWindow); + return createDelegatedPeer(target, platformComponent, platformWindow, LWWindowPeer.PeerType.DIALOG); } @Override --- old/src/macosx/classes/sun/lwawt/LWWindowPeer.java 2012-12-04 16:21:00.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/LWWindowPeer.java 2012-12-04 16:21:00.000000000 +0400 @@ -47,7 +47,8 @@ SIMPLEWINDOW, FRAME, DIALOG, - EMBEDDEDFRAME + EMBEDDEDFRAME, + VIEWEMBEDDEDFRAME } private static final PlatformLogger focusLog = PlatformLogger.getLogger("sun.lwawt.focus.LWWindowPeer"); @@ -108,19 +109,22 @@ private volatile boolean textured; + private final PeerType peerType; + /** * Current modal blocker or null. * * Synchronization: peerTreeLock. */ private LWWindowPeer blocker; - + public LWWindowPeer(Window target, PlatformComponent platformComponent, - PlatformWindow platformWindow) + PlatformWindow platformWindow, PeerType peerType) { super(target, platformComponent); this.platformWindow = platformWindow; - + this.peerType = peerType; + Window owner = target.getOwner(); LWWindowPeer ownerPeer = (owner != null) ? (LWWindowPeer)owner.getPeer() : null; PlatformWindow ownerDelegate = (ownerPeer != null) ? ownerPeer.getPlatformWindow() : null; @@ -275,6 +279,11 @@ @Override public void setBounds(int x, int y, int w, int h, int op) { + + if((op & NO_EMBEDDED_CHECK) == 0 && getPeerType() == PeerType.VIEWEMBEDDEDFRAME) { + return; + } + if ((op & SET_CLIENT_SIZE) != 0) { // SET_CLIENT_SIZE is only applicable to window peers, so handle it here // instead of pulling 'insets' field up to LWComponentPeer @@ -490,7 +499,7 @@ public Rectangle getBoundsPrivate() { throw new RuntimeException("not implemented"); } - + // ---- DIALOG PEER METHODS ---- // @Override @@ -1191,7 +1200,7 @@ public long getLayerPtr() { return getPlatformWindow().getLayerPtr(); } - + void grab() { if (grabbingWindow != null && !isGrabbing()) { grabbingWindow.ungrab(); @@ -1210,6 +1219,10 @@ return this == grabbingWindow; } + public PeerType getPeerType() { + return peerType; + } + @Override public String toString() { return super.toString() + " [target is " + getTarget() + "]"; --- old/src/macosx/classes/sun/lwawt/PlatformWindow.java 2012-12-04 16:21:01.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/PlatformWindow.java 2012-12-04 16:21:01.000000000 +0400 @@ -151,4 +151,6 @@ public long getLayerPtr(); public LWWindowPeer getPeer(); + + public boolean isUnderMouse(); } --- old/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java 2012-12-04 16:21:02.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CMouseInfoPeer.java 2012-12-04 16:21:01.000000000 +0400 @@ -26,7 +26,6 @@ package sun.lwawt.macosx; import java.awt.Window; - import sun.lwawt.LWMouseInfoPeer; import sun.lwawt.LWWindowPeer; @@ -41,10 +40,6 @@ return false; } - LWWindowPeer peer = (LWWindowPeer)w.getPeer(); - CPlatformWindow platformWindow = (CPlatformWindow)peer.getPlatformWindow(); - return nativeIsWindowUnderMouse(platformWindow.getNSWindowPtr()); + return ((LWWindowPeer)w.getPeer()).getPlatformWindow().isUnderMouse(); } - - private static native boolean nativeIsWindowUnderMouse(long ptr); } --- old/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java 2012-12-04 16:21:02.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java 2012-12-04 16:21:02.000000000 +0400 @@ -25,16 +25,13 @@ package sun.lwawt.macosx; -import sun.lwawt.PlatformWindow; -import sun.lwawt.LWWindowPeer; - -import sun.java2d.opengl.CGLLayer; -import sun.java2d.SurfaceData; - -import sun.awt.CausedFocusEvent; - import java.awt.*; - +import sun.awt.CausedFocusEvent; +import sun.java2d.SurfaceData; +import sun.java2d.opengl.CGLLayer; +import sun.lwawt.LWWindowPeer; +import sun.lwawt.LWWindowPeer.PeerType; +import sun.lwawt.PlatformWindow; import sun.util.logging.PlatformLogger; /* @@ -134,6 +131,7 @@ // This method should be properly implemented for applets. // It returns null just as a stub. + @Override public PlatformWindow getTopmostPlatformWindowUnderMouse() { return null; } @Override @@ -192,4 +190,13 @@ @Override public void setModalBlocked(boolean blocked) {} + + /* + * The method could not be implemented due to CALayer restrictions. + * The exeption enforce clients not to use it. + */ + @Override + public boolean isUnderMouse() { + throw new RuntimeException("Not implemented"); + } } --- old/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java 2012-12-04 16:21:03.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CPlatformView.java 2012-12-04 16:21:03.000000000 +0400 @@ -26,8 +26,11 @@ package sun.lwawt.macosx; import java.awt.*; +import java.awt.geom.Rectangle2D; +import java.awt.image.VolatileImage; import sun.awt.CGraphicsConfig; +import sun.awt.CGraphicsEnvironment; import sun.lwawt.LWWindowPeer; import sun.lwawt.macosx.event.NSEvent; @@ -37,6 +40,10 @@ public class CPlatformView extends CFRetainedResource { private native long nativeCreateView(int x, int y, int width, int height, long windowLayerPtr); + private static native void nativeSetAutoResizable(long awtView, boolean toResize); + private static native int nativeGetNSViewDisplayID(long awtView); + private static native Rectangle2D nativeGetLocationOnScreen(long awtView); + private static native boolean nativeIsViewUnderMouse(long ptr); private LWWindowPeer peer; private SurfaceData surfaceData; @@ -59,7 +66,7 @@ public long getAWTView() { return ptr; - } + } public boolean isOpaque() { return !peer.isTranslucent(); @@ -157,11 +164,47 @@ return 0; } } + + public void setAutoResizable(boolean toResize) { + nativeSetAutoResizable(this.getAWTView(), toResize); + } + + public boolean isUnderMouse() { + return nativeIsViewUnderMouse(getAWTView()); + } + + public GraphicsDevice getGraphicsDevice() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + CGraphicsEnvironment cge = (CGraphicsEnvironment)ge; + int displayID = nativeGetNSViewDisplayID(getAWTView()); + GraphicsDevice gd = cge.getScreenDevice(displayID); + if (gd == null) { + // this could possibly happen during device removal + // use the default screen device in this case + gd = ge.getDefaultScreenDevice(); + } + return gd; + } + + public Point getLocationOnScreen() { + Rectangle r = nativeGetLocationOnScreen(this.getAWTView()).getBounds(); + return new Point(r.x, r.y); + } // ---------------------------------------------------------------------- // NATIVE CALLBACKS // ---------------------------------------------------------------------- + /* + * The callback is called only in the embedded case when the view is + * automatically resized by the superview. + * In normal mode this method is never called. + */ + private void deliverResize(int x, int y, int w, int h) { + peer.notifyReshape(x, y, w, h); + } + + private void deliverMouseEvent(NSEvent event) { int x = event.getX(); int y = getBounds().height - event.getY(); --- old/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2012-12-04 16:21:04.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2012-12-04 16:21:04.000000000 +0400 @@ -64,8 +64,6 @@ private static native void nativeDispose(long nsWindowPtr); private static native CPlatformWindow nativeGetTopmostPlatformWindowUnderMouse(); - private static native int nativeGetNSWindowDisplayID(long nsWindowPtr); - // Loger to report issues happened during execution but that do not affect functionality private static final PlatformLogger logger = PlatformLogger.getLogger("sun.lwawt.macosx.CPlatformWindow"); private static final PlatformLogger focusLogger = PlatformLogger.getLogger("sun.lwawt.macosx.focus.CPlatformWindow"); @@ -136,7 +134,7 @@ static final int SHOULD_BECOME_KEY = 1 << 12; static final int SHOULD_BECOME_MAIN = 1 << 13; static final int MODAL_EXCLUDED = 1 << 16; - + static final int _CALLBACK_PROP_BITMASK = SHOULD_BECOME_KEY | SHOULD_BECOME_MAIN | MODAL_EXCLUDED; static int SET(final int bits, final int mask, final boolean value) { @@ -211,9 +209,8 @@ private CPlatformResponder responder; private volatile boolean zoomed = false; // from native perspective - public CPlatformWindow(final PeerType peerType) { + public CPlatformWindow() { super(0, true); - assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME); } /* @@ -429,16 +426,7 @@ @Override public GraphicsDevice getGraphicsDevice() { - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - CGraphicsEnvironment cge = (CGraphicsEnvironment)ge; - int displayID = nativeGetNSWindowDisplayID(getNSWindowPtr()); - GraphicsDevice gd = cge.getScreenDevice(displayID); - if (gd == null) { - // this could possibly happen during device removal - // use the default screen device in this case - gd = ge.getDefaultScreenDevice(); - } - return gd; + return contentView.getGraphicsDevice(); } @Override // PlatformWindow @@ -635,7 +623,7 @@ } return nsWindowPtr; } - + public SurfaceData getSurfaceData() { return contentView.getSurfaceData(); } @@ -833,6 +821,11 @@ return peer; } + @Override + public boolean isUnderMouse() { + return contentView.isUnderMouse(); + } + public CPlatformView getContentView() { return contentView; } --- old/src/macosx/classes/sun/lwawt/macosx/CPrinterDialogPeer.java 2012-12-04 16:21:05.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CPrinterDialogPeer.java 2012-12-04 16:21:05.000000000 +0400 @@ -41,7 +41,7 @@ public CPrinterDialogPeer(CPrinterDialog target, PlatformComponent platformComponent, PlatformWindow platformWindow) { - super(target, platformComponent, platformWindow); + super(target, platformComponent, platformWindow, LWWindowPeer.PeerType.DIALOG); //super(target); fTarget = target; super.initialize(); --- old/src/macosx/classes/sun/lwawt/macosx/CWrapper.java 2012-12-04 16:21:06.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CWrapper.java 2012-12-04 16:21:06.000000000 +0400 @@ -85,6 +85,8 @@ public static native void enterFullScreenMode(long view); public static native void exitFullScreenMode(long view); + + public static native void setHidden(long view, boolean hidden); } public static final class NSObject { --- old/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java 2012-12-04 16:21:07.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java 2012-12-04 16:21:07.000000000 +0400 @@ -158,8 +158,11 @@ protected PlatformWindow createPlatformWindow(PeerType peerType) { if (peerType == PeerType.EMBEDDEDFRAME) { return new CPlatformEmbeddedFrame(); + } else if (peerType == PeerType.VIEWEMBEDDEDFRAME) { + return new CViewPlatformEmbeddedFrame(); } else { - return new CPlatformWindow(peerType); + assert (peerType == PeerType.SIMPLEWINDOW || peerType == PeerType.DIALOG || peerType == PeerType.FRAME); + return new CPlatformWindow(); } } --- old/src/macosx/native/sun/awt/AWTSurfaceLayers.m 2012-12-04 16:21:08.000000000 +0400 +++ new/src/macosx/native/sun/awt/AWTSurfaceLayers.m 2012-12-04 16:21:08.000000000 +0400 @@ -99,17 +99,16 @@ __block AWTSurfaceLayers *surfaceLayers = nil; JNF_COCOA_ENTER(env); -AWT_ASSERT_NOT_APPKIT_THREAD; - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ - AWT_ASSERT_APPKIT_THREAD; - - CALayer *windowLayer = jlong_to_ptr(windowLayerPtr); - surfaceLayers = [[AWTSurfaceLayers alloc] initWithWindowLayer: windowLayer]; - CFRetain(surfaceLayers); - [surfaceLayers release]; + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + AWT_ASSERT_APPKIT_THREAD; + + CALayer *windowLayer = jlong_to_ptr(windowLayerPtr); + surfaceLayers = [[AWTSurfaceLayers alloc] initWithWindowLayer: windowLayer]; + CFRetain(surfaceLayers); + [surfaceLayers release]; }]; - + JNF_COCOA_EXIT(env); return ptr_to_jlong(surfaceLayers); @@ -126,12 +125,13 @@ JNF_COCOA_ENTER(env); AWTSurfaceLayers *surfaceLayers = OBJC(surfaceLayersPtr); - [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ + + [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ AWT_ASSERT_APPKIT_THREAD; CGRect rect = CGRectMake(x, y, width, height); [surfaceLayers setBounds: rect]; - }]; + }]; JNF_COCOA_EXIT(env); } --- old/src/macosx/native/sun/awt/AWTView.m 2012-12-04 16:21:08.000000000 +0400 +++ new/src/macosx/native/sun/awt/AWTView.m 2012-12-04 16:21:08.000000000 +0400 @@ -83,6 +83,7 @@ mouseIsOver = NO; [self resetTrackingArea]; + [self setAutoresizesSubviews:NO]; if (windowLayer != nil) { self.cglLayer = windowLayer; @@ -174,6 +175,11 @@ * Automatically triggered functions. */ +- (void)resizeWithOldSuperviewSize:(NSSize)oldBoundsSize { + [super resizeWithOldSuperviewSize: oldBoundsSize]; + [self deliverResize: [self frame]]; +} + /* * MouseEvents support */ @@ -437,6 +443,18 @@ } } +-(void) deliverResize: (NSRect) rect { + jint x = (jint) rect.origin.x; + jint y = (jint) rect.origin.y; + jint w = (jint) rect.size.width; + jint h = (jint) rect.size.height; + JNIEnv *env = [ThreadUtilities getJNIEnv]; + static JNF_CLASS_CACHE(jc_PlatformView, "sun/lwawt/macosx/CPlatformView"); + static JNF_MEMBER_CACHE(jm_deliverResize, jc_PlatformView, "deliverResize", "(IIII)V"); + JNFCallVoidMethod(env, m_cPlatformView, jm_deliverResize, x,y,w,h); +} + + - (void) drawRect:(NSRect)dirtyRect { AWT_ASSERT_APPKIT_THREAD; @@ -1220,21 +1238,19 @@ __block AWTView *newView = nil; JNF_COCOA_ENTER(env); -AWT_ASSERT_NOT_APPKIT_THREAD; NSRect rect = NSMakeRect(originX, originY, width, height); jobject cPlatformView = (*env)->NewGlobalRef(env, obj); - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ AWT_ASSERT_APPKIT_THREAD; - + CALayer *windowLayer = jlong_to_ptr(windowLayerPtr); AWTView *view = [[AWTView alloc] initWithRect:rect platformView:cPlatformView windowLayer:windowLayer]; CFRetain(view); [view release]; // GC - newView = view; }]; @@ -1242,3 +1258,125 @@ return ptr_to_jlong(newView); } + +/* + * Class: sun_lwawt_macosx_CPlatformView + * Method: nativeSetAutoResizable + * Signature: (JZ)V; + */ + +JNIEXPORT void JNICALL +Java_sun_lwawt_macosx_CPlatformView_nativeSetAutoResizable +(JNIEnv *env, jclass cls, jlong viewPtr, jboolean toResize) +{ +JNF_COCOA_ENTER(env); + + NSView *view = (NSView *)jlong_to_ptr(viewPtr); + + [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ + AWT_ASSERT_APPKIT_THREAD; + + if (toResize) { + [view setAutoresizingMask: NSViewHeightSizable | NSViewWidthSizable]; + } else { + [view setAutoresizingMask: NSViewMinYMargin | NSViewMaxXMargin]; + } + + if ([view superview] != nil) { + [[view superview] setAutoresizesSubviews:(BOOL)toResize]; + } + + }]; +JNF_COCOA_EXIT(env); +} + +/* + * Class: sun_lwawt_macosx_CPlatformView + * Method: nativeGetNSViewDisplayID + * Signature: (J)I; + */ + +JNIEXPORT jint JNICALL +Java_sun_lwawt_macosx_CPlatformView_nativeGetNSViewDisplayID +(JNIEnv *env, jclass cls, jlong viewPtr) +{ + __block jint ret; //CGDirectDisplayID + +JNF_COCOA_ENTER(env); + + NSView *view = (NSView *)jlong_to_ptr(viewPtr); + NSWindow *window = [view window]; + + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + AWT_ASSERT_APPKIT_THREAD; + + ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue]; + }]; + +JNF_COCOA_EXIT(env); + + return ret; +} + +/* + * Class: sun_lwawt_macosx_CPlatformView + * Method: nativeGetLocationOnScreen + * Signature: (J)Ljava/awt/Rectangle; + */ + +JNIEXPORT jobject JNICALL +Java_sun_lwawt_macosx_CPlatformView_nativeGetLocationOnScreen +(JNIEnv *env, jclass cls, jlong viewPtr) +{ + jobject jRect = NULL; + +JNF_COCOA_ENTER(env); + + __block NSRect rect = NSZeroRect; + + NSView *view = (NSView *)jlong_to_ptr(viewPtr); + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + AWT_ASSERT_APPKIT_THREAD; + + NSRect viewBounds = [view bounds]; + NSRect frameInWindow = [view convertRect:viewBounds toView:nil]; + rect = [[view window] convertRectToScreen:frameInWindow]; + NSRect screenRect = [[NSScreen mainScreen] frame]; + //Convert coordinates to top-left corner origin + rect.origin.y = screenRect.size.height - rect.origin.y - viewBounds.size.height; + }]; + jRect = NSToJavaRect(env, rect); + +JNF_COCOA_EXIT(env); + + return jRect; +} + +/* + * Class: sun_lwawt_macosx_CPlatformView + * Method: nativeIsViewUnderMouse + * Signature: (J)Z; + */ + +JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_CPlatformView_nativeIsViewUnderMouse +(JNIEnv *env, jclass clazz, jlong viewPtr) +{ + __block jboolean underMouse = JNI_FALSE; + +JNF_COCOA_ENTER(env); + + NSView *nsView = OBJC(viewPtr); + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + AWT_ASSERT_APPKIT_THREAD; + + NSPoint ptWindowCoords = [[nsView window] mouseLocationOutsideOfEventStream]; + NSPoint ptViewCoords = [nsView convertPoint:ptWindowCoords fromView:nil]; + underMouse = [nsView hitTest:ptViewCoords] != nil; + }]; + +JNF_COCOA_EXIT(env); + + return underMouse; +} + + --- old/src/macosx/native/sun/awt/AWTWindow.m 2012-12-04 16:21:09.000000000 +0400 +++ new/src/macosx/native/sun/awt/AWTWindow.m 2012-12-04 16:21:09.000000000 +0400 @@ -1156,34 +1156,6 @@ /* * Class: sun_lwawt_macosx_CPlatformWindow - * Method: nativeGetDisplayID_AppKitThread - * Signature: (J)I - */ -JNIEXPORT jint JNICALL -Java_sun_lwawt_macosx_CPlatformWindow_nativeGetNSWindowDisplayID -(JNIEnv *env, jclass clazz, jlong windowPtr) -{ - __block jint ret; // CGDirectDisplayID - -JNF_COCOA_ENTER(env); - - NSWindow *window = OBJC(windowPtr); - - if ([NSThread isMainThread]) { - ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue]; - } else { - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ - ret = (jint)[[AWTWindow getNSWindowDisplayID_AppKitThread: window] intValue]; - }]; - } - -JNF_COCOA_EXIT(env); - - return ret; -} - -/* - * Class: sun_lwawt_macosx_CPlatformWindow * Method: _toggleFullScreenMode * Signature: (J)V */ @@ -1203,27 +1175,6 @@ JNF_COCOA_EXIT(env); } -JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_CMouseInfoPeer_nativeIsWindowUnderMouse -(JNIEnv *env, jclass clazz, jlong windowPtr) -{ - __block jboolean underMouse = JNI_FALSE; - -JNF_COCOA_ENTER(env); -AWT_ASSERT_NOT_APPKIT_THREAD; - - NSWindow *nsWindow = OBJC(windowPtr); - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^() { - AWT_ASSERT_APPKIT_THREAD; - - NSPoint pt = [nsWindow mouseLocationOutsideOfEventStream]; - underMouse = [[nsWindow contentView] hitTest:pt] != nil; - }]; - -JNF_COCOA_EXIT(env); - - return underMouse; -} - JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSetEnabled (JNIEnv *env, jclass clazz, jlong windowPtr, jboolean isEnabled) { --- old/src/macosx/native/sun/awt/CCursorManager.m 2012-12-04 16:21:10.000000000 +0400 +++ new/src/macosx/native/sun/awt/CCursorManager.m 2012-12-04 16:21:10.000000000 +0400 @@ -123,14 +123,15 @@ jobject jpt = NULL; JNF_COCOA_ENTER(env); -AWT_ASSERT_NOT_APPKIT_THREAD; __block NSPoint pt = NSZeroPoint; - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ - AWT_ASSERT_APPKIT_THREAD; - - pt = ConvertNSScreenPoint(env, [NSEvent mouseLocation]); + + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + AWT_ASSERT_APPKIT_THREAD; + + pt = ConvertNSScreenPoint(env, [NSEvent mouseLocation]); }]; + jpt = NSToJavaPoint(env, pt); JNF_COCOA_EXIT(env); --- old/src/macosx/native/sun/awt/CWrapper.m 2012-12-04 16:21:11.000000000 +0400 +++ new/src/macosx/native/sun/awt/CWrapper.m 2012-12-04 16:21:11.000000000 +0400 @@ -651,6 +651,26 @@ } /* + * Class: sun_lwawt_macosx_CWrapper$NSView + * Method: setHidden + * Signature: (JZ)V + */ +JNIEXPORT jlong JNICALL +Java_sun_lwawt_macosx_CWrapper_00024NSView_setHidden +(JNIEnv *env, jclass cls, jlong viewPtr, jboolean toHide) +{ + JNF_COCOA_ENTER(env); + + NSView *view = (NSView *)jlong_to_ptr(viewPtr); + [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ + [view setHidden:(BOOL)toHide]; + }]; + + JNF_COCOA_EXIT(env); +} + + +/* * Class: sun_lwawt_macosx_CWrapper$NSScreen * Method: frame * Signature: (J)Ljava/awt/Rectangle; --- old/src/macosx/native/sun/awt/awt.m 2012-12-04 16:21:12.000000000 +0400 +++ new/src/macosx/native/sun/awt/awt.m 2012-12-04 16:21:12.000000000 +0400 @@ -95,7 +95,7 @@ CFRelease(busyObserver); CFRelease(notBusyObserver); - + if (!headless) setBusy(YES); // Set the java name of the AppKit main thread appropriately. @@ -367,7 +367,8 @@ CFRunLoopRef runLoop = [[NSRunLoop currentRunLoop] getCFRunLoop]; CFRunLoopRemoveObserver(runLoop, busyObserver, kCFRunLoopDefaultMode); CFRunLoopRemoveObserver(runLoop, notBusyObserver, kCFRunLoopDefaultMode); - + // We don't track if the runloop is busy, so set it free to let AWT finish when it needs + setBusy(NO); busyObserver = NULL; notBusyObserver = NULL; } else { --- old/src/macosx/native/sun/java2d/opengl/CGLLayer.m 2012-12-04 16:21:13.000000000 +0400 +++ new/src/macosx/native/sun/java2d/opengl/CGLLayer.m 2012-12-04 16:21:13.000000000 +0400 @@ -151,16 +151,15 @@ __block CGLLayer *layer = nil; JNF_COCOA_ENTER(env); -AWT_ASSERT_NOT_APPKIT_THREAD; JNFJObjectWrapper *javaLayer = [JNFJObjectWrapper wrapperWithJObject:obj withEnv:env]; - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ - AWT_ASSERT_APPKIT_THREAD; - - layer = [[CGLLayer alloc] initWithJavaLayer: javaLayer]; + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ + AWT_ASSERT_APPKIT_THREAD; + + layer = [[CGLLayer alloc] initWithJavaLayer: javaLayer]; }]; - + JNF_COCOA_EXIT(env); return ptr_to_jlong(layer); --- old/src/macosx/native/sun/osxapp/ThreadUtilities.h 2012-12-04 16:21:14.000000000 +0400 +++ new/src/macosx/native/sun/osxapp/ThreadUtilities.h 2012-12-04 16:21:14.000000000 +0400 @@ -139,7 +139,7 @@ + (JNIEnv*)getJNIEnvUncached; + (void)performOnMainThread:(SEL)aSelector onObject:(id)target withObject:(id)arg waitUntilDone:(BOOL)wait awtMode:(BOOL)inAWT; - ++ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block; @end void OSXAPP_SetJavaVM(JavaVM *vm); --- old/src/macosx/native/sun/osxapp/ThreadUtilities.m 2012-12-04 16:21:15.000000000 +0400 +++ new/src/macosx/native/sun/osxapp/ThreadUtilities.m 2012-12-04 16:21:15.000000000 +0400 @@ -245,6 +245,14 @@ } } ++ (void)performOnMainThreadWaiting:(BOOL)wait block:(void (^)())block { + if ([NSThread isMainThread] && wait == YES) { + block(); + } else { + [JNFRunLoop performOnMainThreadWaiting:wait withBlock:block]; + } +} + @end --- /dev/null 2012-12-04 16:21:15.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CViewEmbeddedFrame.java 2012-12-04 16:21:15.000000000 +0400 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2012, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ +package sun.lwawt.macosx; + +import java.awt.AWTKeyStroke; +import java.awt.Toolkit; +import java.lang.reflect.InvocationTargetException; +import sun.awt.EmbeddedFrame; +import sun.lwawt.LWToolkit; +import sun.lwawt.LWWindowPeer; + +public class CViewEmbeddedFrame extends EmbeddedFrame { + + private final long nsViewPtr; + + private boolean isActive = false; + + public CViewEmbeddedFrame(long nsViewPtr) { + this.nsViewPtr = nsViewPtr; + } + + @SuppressWarnings("deprecation") + @Override + public void addNotify() { + if (getPeer() == null) { + LWToolkit toolkit = (LWToolkit) Toolkit.getDefaultToolkit(); + setPeer(toolkit.createEmbeddedFrame(this)); + } + super.addNotify(); + } + + public long getEmbedderHandle() { + return nsViewPtr; + } + + @Override + public void registerAccelerator(AWTKeyStroke awtks) { + } + + @Override + public void unregisterAccelerator(AWTKeyStroke awtks) { + } + + public boolean isParentWindowActive() { + return isActive; + } + + /* + * Synthetic event delivery for focus management + */ + @Override + public void synthesizeWindowActivation(boolean activated) { + if (isActive != activated) { + isActive = activated; + ((LWWindowPeer)getPeer()).notifyActivation(activated, null); + } + } + + /* + * Initializes the embedded frame bounds and validates a component. + * Designed to be called from the main thread + */ + @SuppressWarnings("deprecation") + public void validateWithBounds(final int x, final int y, final int width, final int height) { + try { + LWCToolkit.invokeAndWait(new Runnable() { + @Override + public void run() { + ((LWWindowPeer) getPeer()).setBoundsPrivate(0, 0, width, height); + validate(); + setVisible(false); + setVisible(true); + } + }, null); + } catch (InterruptedException | InvocationTargetException ex) {} + } +} --- /dev/null 2012-12-04 16:21:16.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CViewPlatformEmbeddedFrame.java 2012-12-04 16:21:16.000000000 +0400 @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2012, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ + +package sun.lwawt.macosx; + +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.GraphicsDevice; +import java.awt.Insets; +import java.awt.MenuBar; +import java.awt.Point; +import java.awt.Window; +import sun.awt.CausedFocusEvent.Cause; +import sun.java2d.SurfaceData; +import sun.lwawt.LWWindowPeer; +import sun.lwawt.PlatformWindow; + +public class CViewPlatformEmbeddedFrame implements PlatformWindow { + + private CPlatformView view; + private LWWindowPeer peer; + private CViewEmbeddedFrame target; + private CPlatformResponder responder; + + @Override // PlatformWindow + public void initialize(Window target, final LWWindowPeer peer, PlatformWindow owner) { + this.peer = peer; + this.target = (CViewEmbeddedFrame) target; + responder = new CPlatformResponder(peer, false); + + view = new CPlatformView(); + view.initialize(peer, responder); + + CWrapper.NSView.addSubview(this.target.getEmbedderHandle(), view.getAWTView()); + view.setAutoResizable(true); + } + + public long getNSViewPtr() { + return view.getAWTView(); + } + + @Override + public long getLayerPtr() { + return view.getWindowLayerPtr(); + } + + @Override + public LWWindowPeer getPeer() { + return peer; + } + + @Override + public void dispose() { + CWrapper.NSView.removeFromSuperview(view.getAWTView()); + view.dispose(); + } + + @Override + public void setVisible(boolean visible) { + CWrapper.NSView.setHidden(view.getAWTView(), !visible); + } + + @Override + public void setTitle(String title) { + } + + @Override + public void setBounds(int x, int y, int w, int h) { + view.setBounds(x, y, w, h); + peer.notifyReshape(x, y, w, h); + } + + @Override + public GraphicsDevice getGraphicsDevice() { + return view.getGraphicsDevice(); + } + + @Override + public Point getLocationOnScreen() { + return view.getLocationOnScreen(); + } + + @Override + public Insets getInsets() { + return new Insets(0, 0, 0, 0); + } + + @Override + public FontMetrics getFontMetrics(Font f) { + throw new RuntimeException("Not implemented"); + } + + @Override + public SurfaceData getScreenSurface() { + return view.getSurfaceData(); + } + + @Override + public SurfaceData replaceSurfaceData() { + return view.replaceSurfaceData(); + } + + @Override + public void setModalBlocked(boolean blocked) { + } + + @Override + public void toFront() { + } + + @Override + public void toBack() { + } + + @Override + public void setMenuBar(MenuBar mb) { + } + + @Override + public void setAlwaysOnTop(boolean value) { + } + + @Override + public PlatformWindow getTopmostPlatformWindowUnderMouse() { + return null; + } + + @Override + public void updateFocusableWindowState() { + } + + @Override + public boolean rejectFocusRequest(Cause cause) { + return false; + } + + @Override + public boolean requestWindowFocus() { + return true; + } + + @Override + public boolean isActive() { + return target.isParentWindowActive(); + } + + @Override + public void setResizable(boolean resizable) { + } + + @Override + public void setSizeConstraints(int minW, int minH, int maxW, int maxH) { + } + + @Override + public Graphics transformGraphics(Graphics g) { + return g; + } + + @Override + public void updateIconImages() { + } + + @Override + public void setOpacity(float opacity) { + } + + @Override + public void setOpaque(boolean isOpaque) { + } + + @Override + public void enterFullScreenMode() { + } + + @Override + public void exitFullScreenMode() { + } + + @Override + public void setWindowState(int windowState) { + } + + @Override + public boolean isUnderMouse() { + return view.isUnderMouse(); + } +}