Cocoa: Use NSURLs for drag and drop
Fixes #1377.
diff --git a/src/cocoa_window.m b/src/cocoa_window.m
index 43a38dd..cede088 100644
--- a/src/cocoa_window.m
+++ b/src/cocoa_window.m
@@ -51,7 +51,6 @@
#endif
#if MAC_OS_X_VERSION_MAX_ALLOWED < 101300
- #define NSPasteboardTypeFileURL NSFilenamesPboardType
#define NSPasteboardTypeString NSStringPboardType
#endif
@@ -442,8 +441,9 @@
markedText = [[NSMutableAttributedString alloc] init];
[self updateTrackingAreas];
- [self registerForDraggedTypes:[NSArray arrayWithObjects:
- NSPasteboardTypeFileURL, nil]];
+ // NOTE: kUTTypeURL corresponds to NSPasteboardTypeURL but is available
+ // on 10.7 without having been deprecated yet
+ [self registerForDraggedTypes:@[(__bridge NSString*) kUTTypeURL]];
}
return self;
@@ -713,45 +713,33 @@
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
- if ((NSDragOperationGeneric & [sender draggingSourceOperationMask])
- == NSDragOperationGeneric)
- {
- [self setNeedsDisplay:YES];
- return NSDragOperationGeneric;
- }
-
- return NSDragOperationNone;
-}
-
-- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender
-{
- [self setNeedsDisplay:YES];
- return YES;
+ // HACK: We don't know what to say here because we don't know what the
+ // application wants to do with the paths
+ return NSDragOperationGeneric;
}
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
{
- NSPasteboard* pasteboard = [sender draggingPasteboard];
- NSArray* files = [pasteboard propertyListForType:NSPasteboardTypeFileURL];
-
const NSRect contentRect = [window->ns.view frame];
_glfwInputCursorPos(window,
[sender draggingLocation].x,
contentRect.size.height - [sender draggingLocation].y);
- const NSUInteger count = [files count];
+ NSPasteboard* pasteboard = [sender draggingPasteboard];
+ NSDictionary* options = @{NSPasteboardURLReadingFileURLsOnlyKey:@YES};
+ NSArray* urls = [pasteboard readObjectsForClasses:@[[NSURL class]]
+ options:options];
+ const NSUInteger count = [urls count];
if (count)
{
- NSEnumerator* e = [files objectEnumerator];
char** paths = calloc(count, sizeof(char*));
- NSUInteger i;
- for (i = 0; i < count; i++)
- paths[i] = _glfw_strdup([[e nextObject] UTF8String]);
+ for (NSUInteger i = 0; i < count; i++)
+ paths[i] = _glfw_strdup([[urls objectAtIndex:i] fileSystemRepresentation]);
_glfwInputDrop(window, (int) count, (const char**) paths);
- for (i = 0; i < count; i++)
+ for (NSUInteger i = 0; i < count; i++)
free(paths[i]);
free(paths);
}
@@ -759,11 +747,6 @@
return YES;
}
-- (void)concludeDragOperation:(id <NSDraggingInfo>)sender
-{
- [self setNeedsDisplay:YES];
-}
-
- (BOOL)hasMarkedText
{
return [markedText length] > 0;