diff --git a/jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java b/jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java index c46cb52e19e..4bae314cec6 100644 --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CDragSourceContextPeer.java @@ -141,7 +141,7 @@ public final class CDragSourceContextPeer extends SunDragSourceContextPeer { // Create native dragging source: final long nativeDragSource = createNativeDragSource(component, nativeViewPtr, transferable, triggerEvent, (int) (dragOrigin.getX()), (int) (dragOrigin.getY()), extModifiers, - clickCount, timestamp, fDragCImage, dragImageOffset.x, dragImageOffset.y, + clickCount, timestamp, fDragCImage != null ? fDragCImage.ptr : 0L, dragImageOffset.x, dragImageOffset.y, getDragSourceContext().getSourceActions(), formats, formatMap); if (nativeDragSource == 0) @@ -484,7 +484,7 @@ public final class CDragSourceContextPeer extends SunDragSourceContextPeer { // Native support: private native long createNativeDragSource(Component component, long nativePeer, Transferable transferable, InputEvent triggerEvent, int dragPosX, int dragPosY, int extModifiers, int clickCount, long timestamp, - CImage nsDragImage, int dragImageOffsetX, int dragImageOffsetY, + long nsDragImagePtr, int dragImageOffsetX, int dragImageOffsetY, int sourceActions, long[] formats, Map formatMap); private native void doDragging(long nativeDragSource); diff --git a/jdk/src/macosx/native/sun/awt/CDragSource.h b/jdk/src/macosx/native/sun/awt/CDragSource.h index d18816abd41..9cc9b78a6b3 100644 --- a/jdk/src/macosx/native/sun/awt/CDragSource.h +++ b/jdk/src/macosx/native/sun/awt/CDragSource.h @@ -70,7 +70,7 @@ modifiers:(jint)extModifiers clickCount:(jint)clickCount timeStamp:(jlong)timeStamp - dragImage:(jobject)jDragImage + dragImage:(jlong)nsDragImagePtr dragImageOffsetX:(jint)jDragImageOffsetX dragImageOffsetY:(jint)jDragImageOffsetY sourceActions:(jint)jSourceActions diff --git a/jdk/src/macosx/native/sun/awt/CDragSource.m b/jdk/src/macosx/native/sun/awt/CDragSource.m index dc1507746be..992092a7a5d 100644 --- a/jdk/src/macosx/native/sun/awt/CDragSource.m +++ b/jdk/src/macosx/native/sun/awt/CDragSource.m @@ -97,7 +97,7 @@ static BOOL sNeedsEnter; modifiers:(jint)extModifiers clickCount:(jint)clickCount timeStamp:(jlong)timeStamp - dragImage:(jobject)jDragImage + dragImage:(jlong)nsDragImagePtr dragImageOffsetX:(jint)jDragImageOffsetX dragImageOffsetY:(jint)jDragImageOffsetY sourceActions:(jint)jSourceActions @@ -112,26 +112,21 @@ static BOOL sNeedsEnter; // Construct the object if we have a valid model for it: if (control != nil) { - JNIEnv *env = [ThreadUtilities getJNIEnv]; - fComponent = JNFNewGlobalRef(env, jComponent); - fDragSourceContextPeer = JNFNewGlobalRef(env, jDragSourceContextPeer); - - fTransferable = JNFNewGlobalRef(env, jTransferable); - fTriggerEvent = JNFNewGlobalRef(env, jTrigger); - - if (jDragImage) { - JNF_MEMBER_CACHE(nsImagePtr, CImageClass, "ptr", "J"); - jlong imgPtr = JNFGetLongField(env, jDragImage, nsImagePtr); - fDragImage = (NSImage*) jlong_to_ptr(imgPtr); // Double-casting prevents compiler 'd$|// + fComponent = jComponent; + fDragSourceContextPeer = jDragSourceContextPeer; + fTransferable = jTransferable; + fTriggerEvent = jTrigger; + if (nsDragImagePtr) { + fDragImage = (NSImage*) jlong_to_ptr(nsDragImagePtr); [fDragImage retain]; } fDragImageOffset = NSMakePoint(jDragImageOffsetX, jDragImageOffsetY); fSourceActions = jSourceActions; - fFormats = JNFNewGlobalRef(env, jFormats); - fFormatMap = JNFNewGlobalRef(env, jFormatMap); + fFormats = jFormats; + fFormatMap = jFormatMap; fTriggerEventTimeStamp = timeStamp; fDragPos = NSMakePoint(dragPosX, dragPosY); diff --git a/jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m b/jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m index 97720fb38ec..2b9f6e035dc 100644 --- a/jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m +++ b/jdk/src/macosx/native/sun/awt/CDragSourceContextPeer.m @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2014, 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 @@ -40,30 +40,39 @@ JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_CDragSourceContextPeer_createNativeDragSource (JNIEnv *env, jobject jthis, jobject jcomponent, jlong jnativepeer, jobject jtransferable, jobject jtrigger, jint jdragposx, jint jdragposy, jint jextmodifiers, jint jclickcount, jlong jtimestamp, - jobject jnsdragimage, jint jdragimageoffsetx, jint jdragimageoffsety, + jlong nsdragimageptr, jint jdragimageoffsetx, jint jdragimageoffsety, jint jsourceactions, jlongArray jformats, jobject jformatmap) { id controlObj = (id) jlong_to_ptr(jnativepeer); __block CDragSource* dragSource = nil; JNF_COCOA_ENTER(env); + + // Global references are disposed when the DragSource is removed + jobject gComponent = JNFNewGlobalRef(env, jcomponent); + jobject gDragSourceContextPeer = JNFNewGlobalRef(env, jthis); + jobject gTransferable = JNFNewGlobalRef(env, jtransferable); + jobject gTriggerEvent = JNFNewGlobalRef(env, jtrigger); + jlongArray gFormats = JNFNewGlobalRef(env, jformats); + jobject gFormatMap = JNFNewGlobalRef(env, jformatmap); + [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ - dragSource = [[CDragSource alloc] init:jthis - component:jcomponent + dragSource = [[CDragSource alloc] init:gDragSourceContextPeer + component:gComponent control:controlObj - transferable:jtransferable - triggerEvent:jtrigger + transferable:gTransferable + triggerEvent:gTriggerEvent dragPosX:jdragposx dragPosY:jdragposy modifiers:jextmodifiers clickCount:jclickcount timeStamp:jtimestamp - dragImage:jnsdragimage + dragImage:nsdragimageptr dragImageOffsetX:jdragimageoffsetx dragImageOffsetY:jdragimageoffsety sourceActions:jsourceactions - formats:jformats - formatMap:jformatmap]; + formats:gFormats + formatMap:gFormatMap]; }]; JNF_COCOA_EXIT(env);