diff --git a/CommandNotch/CommandNotch.xcodeproj/project.xcworkspace/xcuserdata/harvmaster.xcuserdatad/UserInterfaceState.xcuserstate b/CommandNotch/CommandNotch.xcodeproj/project.xcworkspace/xcuserdata/harvmaster.xcuserdatad/UserInterfaceState.xcuserstate index 181eef1..53017dc 100644 Binary files a/CommandNotch/CommandNotch.xcodeproj/project.xcworkspace/xcuserdata/harvmaster.xcuserdatad/UserInterfaceState.xcuserstate and b/CommandNotch/CommandNotch.xcodeproj/project.xcworkspace/xcuserdata/harvmaster.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/CommandNotch/CommandNotch/Models/TerminalSession.swift b/CommandNotch/CommandNotch/Models/TerminalSession.swift index 6eb7e0a..5b91a7d 100644 --- a/CommandNotch/CommandNotch/Models/TerminalSession.swift +++ b/CommandNotch/CommandNotch/Models/TerminalSession.swift @@ -88,6 +88,7 @@ class TerminalSession: NSObject, ObservableObject, LocalProcessDelegate, @precon super.init() terminalView.terminalDelegate = self + installOsc52ClipboardHandler() let font = NSFont.monospacedSystemFont(ofSize: fontSize, weight: .regular) terminalView.font = font @@ -153,6 +154,23 @@ class TerminalSession: NSObject, ObservableObject, LocalProcessDelegate, @precon return ProcessInfo.processInfo.environment["SHELL"] ?? "/bin/zsh" } + private func installOsc52ClipboardHandler() { + let maxPayloadSize = 1_048_576 // 1 MB + terminalView.getTerminal().registerOscHandler(code: 52) { [weak self] data in + guard data.count >= 2, + data[data.startIndex] == UInt8(ascii: "c"), + data[data.startIndex + 1] == UInt8(ascii: ";") else { return } + + let base64 = Data(data[(data.startIndex + 2)...]) + guard let content = Data(base64Encoded: base64), + content.count <= maxPayloadSize, + let string = String(data: content, encoding: .utf8) else { return } + + NSPasteboard.general.clearContents() + NSPasteboard.general.setString(string, forType: .string) + } + } + private func installCommandArrowMonitor() { keyEventMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [weak self] event in guard let self else { return event }