diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CClipboard.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CClipboard.java index 19f9a408220..4499151d545 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CClipboard.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CClipboard.java @@ -89,7 +89,11 @@ final class CClipboard extends SunClipboard { try { byte[] bytes = DataTransferer.getInstance().translateTransferable(contents, flavor, format); - setData(bytes, format); + if (DataFlavor.javaFileListFlavor.equals(flavor)) { + writeFileObjects(bytes); + } else { + setData(bytes, format); + } } catch (IOException e) { // Fix 4696186: don't print exception if data with // javaJVMLocalObjectMimeType failed to serialize. @@ -127,6 +131,7 @@ final class CClipboard extends SunClipboard { private native void declareTypes(long[] formats, SunClipboard newOwner); private native void setData(byte[] data, long format); + private native void writeFileObjects(byte[] data); void checkPasteboardAndNotify() { if (checkPasteboardWithoutNotification()) { diff --git a/src/java.desktop/macosx/native/libawt_lwawt/awt/CClipboard.m b/src/java.desktop/macosx/native/libawt_lwawt/awt/CClipboard.m index 9818300f6a6..a3edadc2629 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/CClipboard.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/CClipboard.m @@ -174,6 +174,39 @@ JNI_COCOA_ENTER(env); JNI_COCOA_EXIT(env); } +/* + * Class: sun_lwawt_macosx_CClipboard + * Method: writeFileObjects + * Signature: ([B)V +*/ +JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CClipboard_writeFileObjects +(JNIEnv *env, jobject inObject, jbyteArray inBytes) +{ + CHECK_NULL(inBytes); + +JNI_COCOA_ENTER(env); + jint nBytes = (*env)->GetArrayLength(env, inBytes); + jbyte *rawBytes = (*env)->GetPrimitiveArrayCritical(env, inBytes, NULL); + CHECK_NULL(rawBytes); + NSMutableArray *formatArray = [NSMutableArray arrayWithCapacity:2]; + int i = 0; + for (int j = 0; j < nBytes; j++) { + if (rawBytes[j] == 0) { + NSString *path = [NSString stringWithUTF8String:(const char*)(rawBytes + i)]; + NSURL *fileURL = [NSURL fileURLWithPath:path]; + [formatArray addObject:fileURL.absoluteURL]; + i = j + 1; + } + } + (*env)->ReleasePrimitiveArrayCritical(env, inBytes, rawBytes, JNI_ABORT); + + [ThreadUtilities performOnMainThreadWaiting:YES block:^() { + [[NSPasteboard generalPasteboard] writeObjects:formatArray]; + }]; +JNI_COCOA_EXIT(env); +} + + /* * Class: sun_lwawt_macosx_CClipboard * Method: getClipboardFormats