macos: use the pwd apprt action to set the proxy icon URL

This commit is contained in:
Mitchell Hashimoto
2024-11-13 12:55:43 -08:00
parent e0a733584e
commit 4d9143f634
4 changed files with 45 additions and 27 deletions

View File

@ -50,6 +50,7 @@ struct TerminalView<ViewModel: TerminalViewModel>: View {
// Various state values sent back up from the currently focused terminals. // Various state values sent back up from the currently focused terminals.
@FocusedValue(\.ghosttySurfaceView) private var focusedSurface @FocusedValue(\.ghosttySurfaceView) private var focusedSurface
@FocusedValue(\.ghosttySurfaceTitle) private var surfaceTitle @FocusedValue(\.ghosttySurfaceTitle) private var surfaceTitle
@FocusedValue(\.ghosttySurfacePwd) private var surfacePwd
@FocusedValue(\.ghosttySurfaceZoomed) private var zoomedSplit @FocusedValue(\.ghosttySurfaceZoomed) private var zoomedSplit
@FocusedValue(\.ghosttySurfaceCellSize) private var cellSize @FocusedValue(\.ghosttySurfaceCellSize) private var cellSize
@ -65,14 +66,11 @@ struct TerminalView<ViewModel: TerminalViewModel>: View {
return title return title
} }
// The proxy icon URL for our window // The pwd of the focused surface as a URL
private var proxyIconURL: URL? { private var pwdURL: URL? {
guard let proxyURLString = focusedSurface?.pwd else { guard let surfacePwd else { return nil }
return nil return URL(fileURLWithPath: surfacePwd)
}
// Use fileURLWithPath initializer for file paths
return URL(fileURLWithPath: proxyURLString)
} }
var body: some View { var body: some View {
@ -88,7 +86,7 @@ struct TerminalView<ViewModel: TerminalViewModel>: View {
if (Ghostty.info.mode == GHOSTTY_BUILD_MODE_DEBUG || Ghostty.info.mode == GHOSTTY_BUILD_MODE_RELEASE_SAFE) { if (Ghostty.info.mode == GHOSTTY_BUILD_MODE_DEBUG || Ghostty.info.mode == GHOSTTY_BUILD_MODE_RELEASE_SAFE) {
DebugBuildWarningView() DebugBuildWarningView()
} }
Ghostty.TerminalSplit(node: $viewModel.surfaceTree) Ghostty.TerminalSplit(node: $viewModel.surfaceTree)
.environmentObject(ghostty) .environmentObject(ghostty)
.focused($focused) .focused($focused)
@ -99,7 +97,7 @@ struct TerminalView<ViewModel: TerminalViewModel>: View {
.onChange(of: title) { newValue in .onChange(of: title) { newValue in
self.delegate?.titleDidChange(to: newValue) self.delegate?.titleDidChange(to: newValue)
} }
.onChange(of: proxyIconURL) { newValue in .onChange(of: pwdURL) { newValue in
self.delegate?.pwdDidChange(to: newValue) self.delegate?.pwdDidChange(to: newValue)
} }
.onChange(of: cellSize) { newValue in .onChange(of: cellSize) { newValue in

View File

@ -488,6 +488,9 @@ extension Ghostty {
case GHOSTTY_ACTION_SET_TITLE: case GHOSTTY_ACTION_SET_TITLE:
setTitle(app, target: target, v: action.action.set_title) setTitle(app, target: target, v: action.action.set_title)
case GHOSTTY_ACTION_PWD:
pwdChanged(app, target: target, v: action.action.pwd)
case GHOSTTY_ACTION_OPEN_CONFIG: case GHOSTTY_ACTION_OPEN_CONFIG:
ghostty_config_open() ghostty_config_open()
@ -943,6 +946,26 @@ extension Ghostty {
} }
} }
private static func pwdChanged(
_ app: ghostty_app_t,
target: ghostty_target_s,
v: ghostty_action_pwd_s) {
switch (target.tag) {
case GHOSTTY_TARGET_APP:
Ghostty.logger.warning("pwd change does nothing with an app target")
return
case GHOSTTY_TARGET_SURFACE:
guard let surface = target.target.surface else { return }
guard let surfaceView = self.surfaceView(from: surface) else { return }
guard let pwd = String(cString: v.pwd!, encoding: .utf8) else { return }
surfaceView.pwd = pwd
default:
assertionFailure()
}
}
private static func setMouseShape( private static func setMouseShape(
_ app: ghostty_app_t, _ app: ghostty_app_t,
target: ghostty_target_s, target: ghostty_target_s,

View File

@ -92,6 +92,7 @@ extension Ghostty {
Surface(view: surfaceView, size: geo.size) Surface(view: surfaceView, size: geo.size)
.focused($surfaceFocus) .focused($surfaceFocus)
.focusedValue(\.ghosttySurfaceTitle, surfaceView.title) .focusedValue(\.ghosttySurfaceTitle, surfaceView.title)
.focusedValue(\.ghosttySurfacePwd, surfaceView.pwd)
.focusedValue(\.ghosttySurfaceView, surfaceView) .focusedValue(\.ghosttySurfaceView, surfaceView)
.focusedValue(\.ghosttySurfaceCellSize, surfaceView.cellSize) .focusedValue(\.ghosttySurfaceCellSize, surfaceView.cellSize)
#if canImport(AppKit) #if canImport(AppKit)
@ -512,9 +513,7 @@ extension FocusedValues {
struct FocusedGhosttySurface: FocusedValueKey { struct FocusedGhosttySurface: FocusedValueKey {
typealias Value = Ghostty.SurfaceView typealias Value = Ghostty.SurfaceView
} }
}
extension FocusedValues {
var ghosttySurfaceTitle: String? { var ghosttySurfaceTitle: String? {
get { self[FocusedGhosttySurfaceTitle.self] } get { self[FocusedGhosttySurfaceTitle.self] }
set { self[FocusedGhosttySurfaceTitle.self] = newValue } set { self[FocusedGhosttySurfaceTitle.self] = newValue }
@ -523,9 +522,16 @@ extension FocusedValues {
struct FocusedGhosttySurfaceTitle: FocusedValueKey { struct FocusedGhosttySurfaceTitle: FocusedValueKey {
typealias Value = String typealias Value = String
} }
}
extension FocusedValues { var ghosttySurfacePwd: String? {
get { self[FocusedGhosttySurfacePwd.self] }
set { self[FocusedGhosttySurfacePwd.self] = newValue }
}
struct FocusedGhosttySurfacePwd: FocusedValueKey {
typealias Value = String
}
var ghosttySurfaceZoomed: Bool? { var ghosttySurfaceZoomed: Bool? {
get { self[FocusedGhosttySurfaceZoomed.self] } get { self[FocusedGhosttySurfaceZoomed.self] }
set { self[FocusedGhosttySurfaceZoomed.self] = newValue } set { self[FocusedGhosttySurfaceZoomed.self] = newValue }
@ -534,9 +540,7 @@ extension FocusedValues {
struct FocusedGhosttySurfaceZoomed: FocusedValueKey { struct FocusedGhosttySurfaceZoomed: FocusedValueKey {
typealias Value = Bool typealias Value = Bool
} }
}
extension FocusedValues {
var ghosttySurfaceCellSize: OSSize? { var ghosttySurfaceCellSize: OSSize? {
get { self[FocusedGhosttySurfaceCellSize.self] } get { self[FocusedGhosttySurfaceCellSize.self] }
set { self[FocusedGhosttySurfaceCellSize.self] = newValue } set { self[FocusedGhosttySurfaceCellSize.self] = newValue }

View File

@ -14,6 +14,10 @@ extension Ghostty {
// to the app level and it is set from there. // to the app level and it is set from there.
@Published var title: String = "👻" @Published var title: String = "👻"
// The current pwd of the surface as defined by the pty. This can be
// changed with escape codes.
@Published var pwd: String? = nil
// The cell size of this surface. This is set by the core when the // The cell size of this surface. This is set by the core when the
// surface is first created and any time the cell size changes (i.e. // surface is first created and any time the cell size changes (i.e.
// when the font size changes). This is used to allow windows to be // when the font size changes). This is used to allow windows to be
@ -71,17 +75,6 @@ extension Ghostty {
return ghostty_surface_needs_confirm_quit(surface) return ghostty_surface_needs_confirm_quit(surface)
} }
/// Returns the pwd of the surface if it has one.
var pwd: String? {
guard let surface = self.surface else { return nil }
let v = String(unsafeUninitializedCapacity: 1024) {
Int(ghostty_surface_pwd(surface, $0.baseAddress, UInt($0.count)))
}
if (v.count == 0) { return nil }
return v
}
// Returns the inspector instance for this surface, or nil if the // Returns the inspector instance for this surface, or nil if the
// surface has been closed. // surface has been closed.
var inspector: ghostty_inspector_t? { var inspector: ghostty_inspector_t? {