Commit 65a1a3e7e90f10fea65aa47e5c821233c6bd87a0

Ryan C. Gordon 2015-07-04T14:09:09

Cocoa: support drag-and-drop of multiple objects.

diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m
index dc9cefd..8914fe8 100644
--- a/src/video/cocoa/SDL_cocoawindow.m
+++ b/src/video/cocoa/SDL_cocoawindow.m
@@ -106,42 +106,64 @@
 
 - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
 {
-    return NSDragOperationGeneric;
+    if (([sender draggingSourceOperationMask] & NSDragOperationGeneric) == NSDragOperationGeneric) {
+        return NSDragOperationGeneric;
+    }
+
+    return NSDragOperationNone; /* no idea what to do with this, reject it. */
 }
 
 - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
+{ @autoreleasepool
 {
-    NSURL *fileURL = [NSURL URLFromPasteboard:[sender draggingPasteboard]];
-    NSNumber *isAlias = nil;
+    NSPasteboard *pasteboard = [sender draggingPasteboard];
+    NSArray *types = [NSArray arrayWithObject:NSFilenamesPboardType];
+    NSString *desiredType = [pasteboard availableTypeFromArray:types];
+    if (desiredType == nil) {
+        return NO;  /* can't accept anything that's being dropped here. */
+    }
 
-    if (fileURL == nil) {
+    NSData *data = [pasteboard dataForType:desiredType];
+    if (data == nil) {
         return NO;
     }
 
-    /* Functionality for resolving URL aliases was added with OS X 10.6. */
-    if ([fileURL respondsToSelector:@selector(getResourceValue:forKey:error:)]) {
-        [fileURL getResourceValue:&isAlias forKey:NSURLIsAliasFileKey error:nil];
-    }
+    SDL_assert([desiredType isEqualToString:NSFilenamesPboardType]);
+    NSArray *array = [pasteboard propertyListForType:@"NSFilenamesPboardType"];
+
+    for (NSString *path in array) {
+        NSURL *fileURL = [[NSURL fileURLWithPath:path] autorelease];
+        NSNumber *isAlias = nil;
 
-    /* If the URL is an alias, resolve it. */
-    if ([isAlias boolValue]) {
-        NSURLBookmarkResolutionOptions opts = NSURLBookmarkResolutionWithoutMounting | NSURLBookmarkResolutionWithoutUI;
-        NSData *bookmark = [NSURL bookmarkDataWithContentsOfURL:fileURL error:nil];
-        if (bookmark != nil) {
-            NSURL *resolvedURL = [NSURL URLByResolvingBookmarkData:bookmark
-                                                           options:opts
-                                                     relativeToURL:nil
-                                               bookmarkDataIsStale:nil
-                                                             error:nil];
+        /* Functionality for resolving URL aliases was added with OS X 10.6. */
+        if ([fileURL respondsToSelector:@selector(getResourceValue:forKey:error:)]) {
+            [fileURL getResourceValue:&isAlias forKey:NSURLIsAliasFileKey error:nil];
+        }
 
-            if (resolvedURL != nil) {
-                fileURL = resolvedURL;
+        /* If the URL is an alias, resolve it. */
+        if ([isAlias boolValue]) {
+            NSURLBookmarkResolutionOptions opts = NSURLBookmarkResolutionWithoutMounting | NSURLBookmarkResolutionWithoutUI;
+            NSData *bookmark = [NSURL bookmarkDataWithContentsOfURL:fileURL error:nil];
+            if (bookmark != nil) {
+                NSURL *resolvedURL = [NSURL URLByResolvingBookmarkData:bookmark
+                                                               options:opts
+                                                         relativeToURL:nil
+                                                   bookmarkDataIsStale:nil
+                                                                 error:nil];
+
+                if (resolvedURL != nil) {
+                    fileURL = resolvedURL;
+                }
             }
         }
+
+        if (!SDL_SendDropFile([[fileURL path] UTF8String])) {
+            return NO;
+        }
     }
 
-    return (BOOL) SDL_SendDropFile([[fileURL path] UTF8String]);
-}
+    return YES;
+}}
 
 - (BOOL)wantsPeriodicDraggingUpdates
 {