Browse Source

Merge pull request #44619 from bruvzg/m1_dragdrop_4

[4.0] Fix file drag-drop on M1 Macs.
Rémi Verschelde 4 years ago
parent
commit
719e4b1156
1 changed files with 21 additions and 17 deletions
  1. 21 17
      platform/osx/display_server_osx.mm

+ 21 - 17
platform/osx/display_server_osx.mm

@@ -751,28 +751,32 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
 	ERR_FAIL_COND_V(!DS_OSX->windows.has(window_id), NO);
 	ERR_FAIL_COND_V(!DS_OSX->windows.has(window_id), NO);
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 	DisplayServerOSX::WindowData &wd = DS_OSX->windows[window_id];
 
 
-	NSPasteboard *pboard = [sender draggingPasteboard];
-#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101400
-	NSArray<NSURL *> *filenames = [pboard propertyListForType:NSPasteboardTypeFileURL];
-#else
-	NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];
-#endif
+	if (!wd.drop_files_callback.is_null()) {
+		Vector<String> files;
+		NSPasteboard *pboard = [sender draggingPasteboard];
 
 
-	Vector<String> files;
-	for (NSUInteger i = 0; i < filenames.count; i++) {
 #if MAC_OS_X_VERSION_MIN_REQUIRED >= 101400
 #if MAC_OS_X_VERSION_MIN_REQUIRED >= 101400
-		NSString *ns = [[filenames objectAtIndex:i] path];
+		NSArray *items = pboard.pasteboardItems;
+		for (NSPasteboardItem *item in items) {
+			NSString *path = [item stringForType:NSPasteboardTypeFileURL];
+			NSString *ns = [NSURL URLWithString:path].path;
+			char *utfs = strdup([ns UTF8String]);
+			String ret;
+			ret.parse_utf8(utfs);
+			free(utfs);
+			files.push_back(ret);
+		}
 #else
 #else
-		NSString *ns = [filenames objectAtIndex:i];
+		NSArray *filenames = [pboard propertyListForType:NSFilenamesPboardType];
+		for (NSString *ns in filenames) {
+			char *utfs = strdup([ns UTF8String]);
+			String ret;
+			ret.parse_utf8(utfs);
+			free(utfs);
+			files.push_back(ret);
+		}
 #endif
 #endif
-		char *utfs = strdup([ns UTF8String]);
-		String ret;
-		ret.parse_utf8(utfs);
-		free(utfs);
-		files.push_back(ret);
-	}
 
 
-	if (!wd.drop_files_callback.is_null()) {
 		Variant v = files;
 		Variant v = files;
 		Variant *vp = &v;
 		Variant *vp = &v;
 		Variant ret;
 		Variant ret;