# HG changeset patch # User pchelko # Date 1384522834 -14400 # Node ID c85e36decad60f07896420fe3679d49330e12c1c # Parent 501d145f696069d093fc6433a0472b329ce7d571 7124253: [macosx] Flavor change notification not coming Reviewed-by: anthony, serb diff -r 501d145f6960 -r c85e36decad6 src/macosx/classes/sun/lwawt/macosx/CClipboard.java --- a/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Fri Jul 03 16:42:25 2015 +0100 +++ b/src/macosx/classes/sun/lwawt/macosx/CClipboard.java Fri Nov 15 17:40:34 2013 +0400 @@ -25,8 +25,10 @@ package sun.lwawt.macosx; +import java.awt.*; import java.awt.datatransfer.*; import java.io.IOException; +import java.io.NotSerializableException; import java.util.*; import sun.awt.datatransfer.*; @@ -65,12 +67,10 @@ long[] formatArray = dataTransferer.getFormatsForTransferableAsArray(contents, flavorMap); declareTypes(formatArray, this); - Map formatMap = DataTransferer.getInstance().getFormatsForTransferable(contents, flavorMap); - - for (Iterator iter = formatMap.keySet().iterator(); iter.hasNext(); ) { - Long lFormat = iter.next(); - long format = lFormat.longValue(); - DataFlavor flavor = formatMap.get(lFormat); + Map formatMap = dataTransferer.getFormatsForTransferable(contents, flavorMap); + for (Map.Entry entry : formatMap.entrySet()) { + long format = entry.getKey(); + DataFlavor flavor = entry.getValue(); try { byte[] bytes = DataTransferer.getInstance().translateTransferable(contents, flavor, format); @@ -80,17 +80,27 @@ // javaJVMLocalObjectMimeType failed to serialize. // May remove this if-check when 5078787 is fixed. if (!(flavor.isMimeTypeEqual(DataFlavor.javaJVMLocalObjectMimeType) && - e instanceof java.io.NotSerializableException)) { + e instanceof NotSerializableException)) { e.printStackTrace(); } } } + + notifyChanged(); } - private void lostSelectionOwnershipImpl() { + private void notifyLostOwnership() { lostOwnershipImpl(); } + private static void notifyChanged() { + CClipboard clipboard = (CClipboard) Toolkit.getDefaultToolkit().getSystemClipboard(); + if (!clipboard.areFlavorListenersRegistered()) { + return; + } + clipboard.checkChange(clipboard.getClipboardFormats()); + } + protected native long[] getClipboardFormats(); protected native byte[] getClipboardData(long format) throws IOException; diff -r 501d145f6960 -r c85e36decad6 src/macosx/native/sun/awt/CClipboard.h --- a/src/macosx/native/sun/awt/CClipboard.h Fri Jul 03 16:42:25 2015 +0100 +++ b/src/macosx/native/sun/awt/CClipboard.h Fri Nov 15 17:40:34 2013 +0400 @@ -43,6 +43,4 @@ - (NSArray *) javaGetTypes; - (NSData *) javaGetDataForType:(NSString *)inFormat; -- (void) pasteboardChangedOwner:(NSPasteboard *)sender; - @end diff -r 501d145f6960 -r c85e36decad6 src/macosx/native/sun/awt/CClipboard.m --- a/src/macosx/native/sun/awt/CClipboard.m Fri Jul 03 16:42:25 2015 +0100 +++ b/src/macosx/native/sun/awt/CClipboard.m Fri Nov 15 17:40:34 2013 +0400 @@ -91,7 +91,9 @@ { if (sClipboard == nil) { sClipboard = [[CClipboard alloc] init]; - [[NSNotificationCenter defaultCenter] addObserver:sClipboard selector: @selector(checkPasteboard:) name: NSApplicationDidBecomeActiveNotification object: nil]; + [[NSNotificationCenter defaultCenter] addObserver:sClipboard selector: @selector(checkPasteboard:) + name: NSApplicationDidBecomeActiveNotification + object: nil]; } return sClipboard; @@ -110,8 +112,6 @@ - (void) javaDeclareTypes:(NSArray *)inTypes withOwner:(jobject)inClipboard jniEnv:(JNIEnv *)inEnv { - //NSLog(@"CClipboard javaDeclareTypes %@ withOwner", inTypes); - @synchronized(self) { if (inClipboard != NULL) { if (fClipboardOwner != NULL) { @@ -126,8 +126,6 @@ - (void) _nativeDeclareTypes:(NSArray *)inTypes { AWT_ASSERT_APPKIT_THREAD; - //NSLog(@"CClipboard _nativeDeclareTypes %@ withOwner", inTypes); - fChangeCount = [[NSPasteboard generalPasteboard] declareTypes:inTypes owner:self]; } @@ -136,8 +134,6 @@ NSMutableArray *args = [NSMutableArray arrayWithCapacity:1]; [ThreadUtilities performOnMainThread:@selector(_nativeGetTypes:) on:self withObject:args waitUntilDone:YES]; - - //NSLog(@"CClipboard getTypes returns %@", [args lastObject]); return [args lastObject]; } @@ -145,8 +141,6 @@ AWT_ASSERT_APPKIT_THREAD; [args addObject:[[NSPasteboard generalPasteboard] types]]; - - //NSLog(@"CClipboard getTypes returns %@", [args lastObject]); } - (void) javaSetData:(NSData *)inData forType:(NSString *) inFormat { @@ -154,25 +148,18 @@ CClipboardUpdate *newUpdate = [[CClipboardUpdate alloc] initWithData:inData withFormat:inFormat]; [ThreadUtilities performOnMainThread:@selector(_nativeSetData:) on:self withObject:newUpdate waitUntilDone:YES]; [newUpdate release]; - - //NSLog(@"CClipboard javaSetData forType %@", inFormat); } - (void) _nativeSetData:(CClipboardUpdate *)newUpdate { AWT_ASSERT_APPKIT_THREAD; [[NSPasteboard generalPasteboard] setData:[newUpdate data] forType:[newUpdate format]]; - - //NSLog(@"CClipboard _nativeSetData setData %@", [newUpdate data]); - //NSLog(@"CClipboard _nativeSetData forType %@", [newUpdate format]); } - (NSData *) javaGetDataForType:(NSString *) inFormat { NSMutableArray *args = [NSMutableArray arrayWithObject:inFormat]; [ThreadUtilities performOnMainThread:@selector(_nativeGetDataForType:) on:self withObject:args waitUntilDone:YES]; - - //NSLog(@"CClipboard javaGetDataForType %@ returns an NSData", inFormat); return [args lastObject]; } @@ -183,15 +170,11 @@ if (returnValue) [args replaceObjectAtIndex:0 withObject:returnValue]; else [args removeLastObject]; - - //NSLog(@"CClipboard _nativeGetDataForType"); } - (void) checkPasteboard:(id)application { AWT_ASSERT_APPKIT_THREAD; - //NSLog(@"CClipboard checkPasteboard oldCount %d newCount %d newTypes %@", fChangeCount, [[NSPasteboard generalPasteboard] changeCount], [[NSPasteboard generalPasteboard] types]); - // This is called via NSApplicationDidBecomeActiveNotification. // If the change count on the general pasteboard is different than when we set it @@ -199,27 +182,23 @@ NSInteger newChangeCount = [[NSPasteboard generalPasteboard] changeCount]; if (fChangeCount != newChangeCount) { - fChangeCount = newChangeCount; - - [self pasteboardChangedOwner:[NSPasteboard generalPasteboard]]; - } -} + fChangeCount = newChangeCount; -- (void)pasteboardChangedOwner:(NSPasteboard *)sender; { - AWT_ASSERT_APPKIT_THREAD; + // Notify that the content might be changed + static JNF_CLASS_CACHE(jc_CClipboard, "sun/lwawt/macosx/CClipboard"); + static JNF_STATIC_MEMBER_CACHE(jm_contentChanged, jc_CClipboard, "notifyChanged", "()V"); + JNIEnv *env = [ThreadUtilities getJNIEnv]; + JNFCallStaticVoidMethod(env, jm_contentChanged); - static JNF_CLASS_CACHE(jc_CClipboard, "sun/lwawt/macosx/CClipboard"); - static JNF_MEMBER_CACHE(jm_lostOwnership, jc_CClipboard, "lostSelectionOwnershipImpl", "()V"); - - //NSLog(@"CClipboard pasteboardChangedOwner"); - - // If we have a Java pasteboard owner, tell it that it doesn't own the pasteboard anymore. - @synchronized(self) { - if (fClipboardOwner) { - JNIEnv *env = [ThreadUtilities getJNIEnv]; - JNFCallVoidMethod(env, fClipboardOwner, jm_lostOwnership); // AWT_THREADING Safe (event) - JNFDeleteGlobalRef(env, fClipboardOwner); - fClipboardOwner = NULL; + // If we have a Java pasteboard owner, tell it that it doesn't own the pasteboard anymore. + static JNF_MEMBER_CACHE(jm_lostOwnership, jc_CClipboard, "notifyLostOwnership", "()V"); + @synchronized(self) { + if (fClipboardOwner) { + JNIEnv *env = [ThreadUtilities getJNIEnv]; + JNFCallVoidMethod(env, fClipboardOwner, jm_lostOwnership); // AWT_THREADING Safe (event) + JNFDeleteGlobalRef(env, fClipboardOwner); + fClipboardOwner = NULL; + } } } } @@ -265,9 +244,6 @@ } JNF_COCOA_ENTER(env); - - //NSLog(@"Java_sun_lwawt_macosx_CClipboard_setData"); - jint nBytes = (*env)->GetArrayLength(env, inBytes); jbyte *rawBytes = (*env)->GetPrimitiveArrayCritical(env, inBytes, NULL); NSData *bytesAsData = [NSData dataWithBytes:rawBytes length:nBytes]; @@ -288,8 +264,6 @@ jlongArray returnValue = NULL; JNF_COCOA_ENTER(env); - //NSLog(@"Java_sun_lwawt_macosx_CClipboard_getClipboardFormats"); - NSArray *dataTypes = [[CClipboard sharedClipboard] javaGetTypes]; NSUInteger nFormats = [dataTypes count]; NSUInteger knownFormats = 0; @@ -346,8 +320,6 @@ // a byte array back to Java. CDataTransferer will do that if necessary. JNF_COCOA_ENTER(env); - //NSLog(@"Java_sun_lwawt_macosx_CClipboard_getClipboardData"); - NSString *formatAsString = formatForIndex(format); NSData *clipData = [[CClipboard sharedClipboard] javaGetDataForType:formatAsString];