diff --git a/glfw/cocoa_window.m b/glfw/cocoa_window.m index 42495081c..acd116e35 100644 --- a/glfw/cocoa_window.m +++ b/glfw/cocoa_window.m @@ -872,12 +872,13 @@ @interface GLFWFilePromiseProviderDelegate : NSObject mime_type fileName:NULL instanceId:_glfw.drag.instance_id] autorelease]; + initWithWindow:window mimeType:mime_item->mime_type fileName:NULL isDir:NO instanceId:_glfw.drag.instance_id] autorelease]; NSFilePromiseProvider *provider = [[[NSFilePromiseProvider alloc] initWithFileType:utiString delegate:delegate] autorelease]; w = provider; @@ -4590,7 +4593,7 @@ - (void)promised_data_ready:(const char*)path sz:(size_t)sz type:(int)type { if (file_handle) [file_handle release]; file_handle = nil; NSFileManager *fileManager = [NSFileManager defaultManager]; - // Erase the empty placeholder file created by writePromiseToURL: + // Erase the empty placeholder file/directory created by writePromiseToURL: [fileManager removeItemAtURL:file_url error:nil]; NSError *error = nil; NSURL *srcURL = [NSURL fileURLWithPath:@(path)]; @@ -4711,12 +4714,13 @@ - (void)request_drag_data { } } -- (instancetype)initWithWindow:(_GLFWwindow*)initWindow mimeType:(const char*)mime fileName: (const char*)name instanceId:(GLFWid) instance_id { +- (instancetype)initWithWindow:(_GLFWwindow*)initWindow mimeType:(const char*)mime fileName:(const char*)name isDir:(bool)is_dir instanceId:(GLFWid) instance_id { self = [super init]; if (self) { windowId = initWindow ? initWindow->id : 0; mimeType = _glfw_strdup(mime); file_name = name ? _glfw_strdup(name) : nil; + is_directory = is_dir; instanceId = instance_id; if (file_promise_providers == nil) file_promise_providers = [[NSMutableArray alloc] init]; [file_promise_providers addObject:self]; @@ -4758,23 +4762,26 @@ - (void)filePromiseProvider:(NSFilePromiseProvider*)filePromiseProvider return; } - // Create the file NSError* error = nil; - if (![[NSFileManager defaultManager] createFileAtPath:url.path contents:nil attributes:nil]) { - error = [NSError errorWithDomain:NSPOSIXErrorDomain code:EIO userInfo:nil]; + bool ok = is_directory ? [[NSFileManager defaultManager] + createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:&error] : + [[NSData data] writeToURL:url options:NSDataWritingAtomic error:&error]; + if (!ok) { + NSLog(@"Failed to create file to send drag file provider promise data to with error: %@", error); completionHandler(error); return; } - - NSFileHandle* fileHandle = [NSFileHandle fileHandleForWritingToURL:url error:&error]; - if (!fileHandle) { - completionHandler(error); - NSError *error; - NSFileManager *fileManager = [NSFileManager defaultManager]; - [fileManager removeItemAtURL:url error:&error]; - return; + if (!is_directory) { + NSFileHandle* fileHandle = [NSFileHandle fileHandleForWritingToURL:url error:&error]; + if (!fileHandle) { + completionHandler(error); + NSError *error; + NSFileManager *fileManager = [NSFileManager defaultManager]; + [fileManager removeItemAtURL:url error:&error]; + return; + } + file_handle = [fileHandle retain]; } - file_handle = [fileHandle retain]; completion_handler = Block_copy(completionHandler); file_url = [url retain]; [self request_drag_data];