Merge pull request #1144 from mitchellh/macos_context_menu

macos: Implement context menu functionality to open tabs and windows.
This commit is contained in:
Mitchell Hashimoto
2023-12-21 22:18:30 -08:00
committed by GitHub

View File

@ -15,12 +15,7 @@ class ServiceProvider: NSObject {
userData: String?, userData: String?,
error: AutoreleasingUnsafeMutablePointer<NSString> error: AutoreleasingUnsafeMutablePointer<NSString>
) { ) {
guard let str = pasteboard.string(forType: .string) else { openTerminalFromPasteboard(pasteboard: pasteboard, target: .tab, error: error)
error.pointee = Self.errorNoString
return
}
openTerminal(str, target: .tab)
} }
@objc func openWindow( @objc func openWindow(
@ -28,23 +23,34 @@ class ServiceProvider: NSObject {
userData: String?, userData: String?,
error: AutoreleasingUnsafeMutablePointer<NSString> error: AutoreleasingUnsafeMutablePointer<NSString>
) { ) {
guard let str = pasteboard.string(forType: .string) else { openTerminalFromPasteboard(pasteboard: pasteboard, target: .window, error: error)
}
@inline(__always)
private func openTerminalFromPasteboard(
pasteboard: NSPasteboard,
target: OpenTarget,
error: AutoreleasingUnsafeMutablePointer<NSString>
) {
guard let objs = pasteboard.readObjects(forClasses: [NSURL.self]) as? [NSURL] else {
error.pointee = Self.errorNoString error.pointee = Self.errorNoString
return return
} }
let filePaths = objs.map { $0.path }.compactMap { $0 }
openTerminal(str, target: .window) openTerminal(filePaths, target: target)
} }
private func openTerminal(_ path: String, target: OpenTarget) { private func openTerminal(_ paths: [String], target: OpenTarget) {
guard let delegateRaw = NSApp.delegate else { return } guard let delegateRaw = NSApp.delegate else { return }
guard let delegate = delegateRaw as? AppDelegate else { return } guard let delegate = delegateRaw as? AppDelegate else { return }
let terminalManager = delegate.terminalManager let terminalManager = delegate.terminalManager
for path in paths {
// We only open in directories. // We only open in directories.
var isDirectory = ObjCBool(true) var isDirectory = ObjCBool(true)
guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) else { return } guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) else { continue }
guard isDirectory.boolValue else { return } guard isDirectory.boolValue else { continue }
// Build our config // Build our config
var config = Ghostty.SurfaceConfiguration() var config = Ghostty.SurfaceConfiguration()
@ -58,4 +64,6 @@ class ServiceProvider: NSObject {
terminalManager.newTab(withBaseConfig: config) terminalManager.newTab(withBaseConfig: config)
} }
} }
}
} }