From 49806fc4cca56b8edaef18c8ccaae6bf26ac424b Mon Sep 17 00:00:00 2001 From: Lukas <134181853+bo2themax@users.noreply.github.com> Date: Fri, 3 Jul 2026 12:45:16 +0200 Subject: [PATCH] macOS: read string contents per pasteboard item in order Pasteboards mixing file URLs with other items will now be pasted as joined string. --- .../Extensions/NSPasteboard+Extension.swift | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/macos/Sources/Helpers/Extensions/NSPasteboard+Extension.swift b/macos/Sources/Helpers/Extensions/NSPasteboard+Extension.swift index a54735fde..9dbed4614 100644 --- a/macos/Sources/Helpers/Extensions/NSPasteboard+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSPasteboard+Extension.swift @@ -38,14 +38,20 @@ extension NSPasteboard { /// - Tries to get any string from the pasteboard. /// If all of the above fail, returns None. func getOpinionatedStringContents() -> String? { - if let urls = readObjects(forClasses: [NSURL.self]) as? [URL], - urls.count > 0 { - return urls - .map { $0.isFileURL ? Ghostty.Shell.escape($0.path) : $0.absoluteString } - .joined(separator: " ") + let strings = (pasteboardItems ?? []).compactMap { item in + if let plist = item.propertyList(forType: .fileURL), + let fileURL = NSURL(pasteboardPropertyList: plist, ofType: .fileURL) as URL?, + fileURL.isFileURL { + return Ghostty.Shell.escape(fileURL.path) + } else { + return item.string(forType: .string) + } } - return self.string(forType: .string) + guard !strings.isEmpty else { + return nil + } + return strings.joined(separator: " ") } /// The pasteboard for the Ghostty enum type.