From 8a5260f24cbcc8a05fc72469e9b2f1a966f700ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C5=93ur?= Date: Fri, 23 Dec 2022 10:07:45 +0800 Subject: [PATCH] Fixed DragOverlayWindow file icon and name (#4428) * Fixed DragOverlayWindow file icon and name * Fixed dragging for BitComet torrents --- Transmission.xcodeproj/project.pbxproj | 2 ++ macosx/DragOverlayWindow.mm | 15 ++++++++++++--- macosx/NSStringAdditions.h | 2 ++ macosx/NSStringAdditions.mm | 20 ++++++++++++++++++++ macosx/QuickLookPlugin/CMakeLists.txt | 1 + macosx/Torrent.mm | 15 +-------------- 6 files changed, 38 insertions(+), 17 deletions(-) diff --git a/Transmission.xcodeproj/project.pbxproj b/Transmission.xcodeproj/project.pbxproj index a2f3e449a..b2673cac3 100644 --- a/Transmission.xcodeproj/project.pbxproj +++ b/Transmission.xcodeproj/project.pbxproj @@ -399,6 +399,7 @@ C3D9062A27B7EAC600EF2386 /* libpsl.h in Headers */ = {isa = PBXBuildFile; fileRef = C3D9061B27B7E31100EF2386 /* libpsl.h */; }; C3D9062F27B7F7E200EF2386 /* libpsl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D9062127B7E3C900EF2386 /* libpsl.a */; }; C809AEE7291ECFD000BFDBE1 /* NSDataAdditions.mm in Sources */ = {isa = PBXBuildFile; fileRef = C809AEE6291ECFD000BFDBE1 /* NSDataAdditions.mm */; }; + C82B30312953337B0001BD6E /* NSDataAdditions.mm in Sources */ = {isa = PBXBuildFile; fileRef = C809AEE6291ECFD000BFDBE1 /* NSDataAdditions.mm */; }; C841A28129197724009F18E8 /* NSKeyedUnarchiverAdditions.mm in Sources */ = {isa = PBXBuildFile; fileRef = C841A28029197724009F18E8 /* NSKeyedUnarchiverAdditions.mm */; }; C86BCD9928228A9600F45599 /* SparkleProxy.mm in Sources */ = {isa = PBXBuildFile; fileRef = C86BCD9828228A9600F45599 /* SparkleProxy.mm */; }; C87369652809984200573C90 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C87369642809984200573C90 /* UserNotifications.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; @@ -3201,6 +3202,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C82B30312953337B0001BD6E /* NSDataAdditions.mm in Sources */, A29304EE15D7497C00B1F726 /* main.cc in Sources */, A2D8CFBB15F82E030056E93D /* NSStringAdditions.mm in Sources */, A2F35BCA15C5A0A100EBF632 /* GenerateThumbnailForURL.mm in Sources */, diff --git a/macosx/DragOverlayWindow.mm b/macosx/DragOverlayWindow.mm index ae56beb97..c8c0abf45 100644 --- a/macosx/DragOverlayWindow.mm +++ b/macosx/DragOverlayWindow.mm @@ -77,9 +77,17 @@ auto const n_files = metainfo.fileCount(); fileCount += n_files; - if (n_files == 1) + // only useful when one torrent + if (count == 1) { - name = @(metainfo.name().c_str()); + if (n_files == 1) + { + name = [NSString convertedStringFromCString:metainfo.fileSubpath(0).c_str()]; + } + else + { + name = @(metainfo.name().c_str()); + } } } } @@ -109,7 +117,8 @@ NSImage* icon; if (count == 1) { - icon = [NSWorkspace.sharedWorkspace iconForFileType:name ? name.pathExtension : NSFileTypeForHFSTypeCode(kGenericFolderIcon)]; + icon = [NSWorkspace.sharedWorkspace + iconForFileType:fileCount <= 1 ? name.pathExtension : NSFileTypeForHFSTypeCode(kGenericFolderIcon)]; } else { diff --git a/macosx/NSStringAdditions.h b/macosx/NSStringAdditions.h index 77ad3409f..cc57c6d6c 100644 --- a/macosx/NSStringAdditions.h +++ b/macosx/NSStringAdditions.h @@ -24,6 +24,8 @@ // like componentsSeparatedByCharactersInSet:, but excludes blank values - (NSArray*)nonEmptyComponentsSeparatedByCharactersInSet:(NSCharacterSet*)separators; ++ (NSString*)convertedStringFromCString:(char const*)bytes; + @end __attribute__((annotate("returns_localized_nsstring"))) static inline NSString* LocalizationNotNeeded(NSString* s) diff --git a/macosx/NSStringAdditions.mm b/macosx/NSStringAdditions.mm index 2dcd1fe9e..b904df490 100644 --- a/macosx/NSStringAdditions.mm +++ b/macosx/NSStringAdditions.mm @@ -6,6 +6,7 @@ #include #import "NSStringAdditions.h" +#import "NSDataAdditions.h" @interface NSString (Private) @@ -134,6 +135,25 @@ return components; } ++ (NSString*)convertedStringFromCString:(nonnull char const*)bytes +{ + // UTF-8 encoding + NSString* fullPath = @(bytes); + if (fullPath) + { + return fullPath; + } + // autodetection of the encoding (#3434) + NSData* data = [NSData dataWithBytes:(void const*)bytes length:sizeof(unsigned char) * strlen(bytes)]; + [NSString stringEncodingForData:data encodingOptions:nil convertedString:&fullPath usedLossyConversion:nil]; + if (fullPath) + { + return fullPath; + } + // hexa encoding + return data.hexString; +} + @end @implementation NSString (Private) diff --git a/macosx/QuickLookPlugin/CMakeLists.txt b/macosx/QuickLookPlugin/CMakeLists.txt index 8a4c81ef5..1e5c36d70 100644 --- a/macosx/QuickLookPlugin/CMakeLists.txt +++ b/macosx/QuickLookPlugin/CMakeLists.txt @@ -1,6 +1,7 @@ project(trmacql) set(${PROJECT_NAME}_SOURCES + ../NSDataAdditions.mm ../NSStringAdditions.mm GeneratePreviewForURL.mm GenerateThumbnailForURL.mm diff --git a/macosx/Torrent.mm b/macosx/Torrent.mm index af1027413..7969c3b20 100644 --- a/macosx/Torrent.mm +++ b/macosx/Torrent.mm @@ -16,7 +16,6 @@ #import "Torrent.h" #import "GroupsController.h" #import "FileListNode.h" -#import "NSDataAdditions.h" #import "NSStringAdditions.h" #import "TrackerNode.h" @@ -1786,19 +1785,7 @@ bool trashDataFile(char const* filename, void* /*user_data*/, tr_error** error) { auto const file = tr_torrentFile(self.fHandle, i); - // UTF-8 encoding - NSString* fullPath = @(file.name); - if (!fullPath) - { - // autodetection of the encoding (#3434) - NSData* data = [NSData dataWithBytes:(void const*)file.name length:sizeof(unsigned char) * strlen(file.name)]; - [NSString stringEncodingForData:data encodingOptions:nil convertedString:&fullPath usedLossyConversion:nil]; - if (!fullPath) - { - // hexa encoding - fullPath = data.hexString; - } - } + NSString* fullPath = [NSString convertedStringFromCString:file.name]; NSArray* pathComponents = fullPath.pathComponents; while (pathComponents.count <= 1) {