Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 34 additions & 33 deletions Sources/GhosttyTerminalView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2973,7 +2973,7 @@ final class TerminalSurface: Identifiable, ObservableObject {
return val > 0 ? val : 10
}()
private let surfaceContext: ghostty_surface_context_e
private let configTemplate: ghostty_surface_config_s?
private let configTemplate: CmuxSurfaceConfigTemplate?
private let workingDirectory: String?
private let initialCommand: String?
private let initialEnvironmentOverrides: [String: String]
Expand Down Expand Up @@ -3061,7 +3061,7 @@ final class TerminalSurface: Identifiable, ObservableObject {
init(
tabId: UUID,
context: ghostty_surface_context_e,
configTemplate: ghostty_surface_config_s?,
configTemplate: CmuxSurfaceConfigTemplate?,
workingDirectory: String? = nil,
initialCommand: String? = nil,
initialEnvironmentOverrides: [String: String] = [:],
Expand Down Expand Up @@ -3585,7 +3585,10 @@ final class TerminalSurface: Identifiable, ObservableObject {

let scaleFactors = scaleFactors(for: view)

var surfaceConfig = configTemplate ?? ghostty_surface_config_new()
let baseConfig = configTemplate ?? CmuxSurfaceConfigTemplate()
var surfaceConfig = ghostty_surface_config_new()
surfaceConfig.font_size = baseConfig.fontSize
surfaceConfig.wait_after_command = baseConfig.waitAfterCommand
surfaceConfig.platform_tag = GHOSTTY_PLATFORM_MACOS
surfaceConfig.platform = ghostty_platform_u(macos: ghostty_platform_macos_s(
nsview: Unmanaged.passUnretained(view).toOpaque()
Expand All @@ -3612,19 +3615,7 @@ final class TerminalSurface: Identifiable, ObservableObject {
}
}

var env: [String: String] = [:]
if surfaceConfig.env_var_count > 0, let existingEnv = surfaceConfig.env_vars {
let count = Int(surfaceConfig.env_var_count)
if count > 0 {
for i in 0..<count {
let item = existingEnv[i]
if let key = String(cString: item.key, encoding: .utf8),
let value = String(cString: item.value, encoding: .utf8) {
env[key] = value
}
}
}
}
var env = baseConfig.environmentVariables

var protectedStartupEnvironmentKeys: Set<String> = []
func setManagedEnvironmentValue(_ key: String, _ value: String) {
Expand Down Expand Up @@ -3762,26 +3753,36 @@ final class TerminalSurface: Identifiable, ObservableObject {
}
}

let createWithCommandAndWorkingDirectory = { [self] in
let resolvedWorkingDirectory: String? = {
if let workingDirectory, !workingDirectory.isEmpty {
return workingDirectory
}
return baseConfig.workingDirectory
}()
let resolvedCommand: String? = {
if let initialCommand, !initialCommand.isEmpty {
initialCommand.withCString { cCommand in
surfaceConfig.command = cCommand
if let workingDirectory, !workingDirectory.isEmpty {
workingDirectory.withCString { cWorkingDir in
surfaceConfig.working_directory = cWorkingDir
createSurface()
}
} else {
return initialCommand
}
return baseConfig.command
}()
let resolvedInitialInput = baseConfig.initialInput
func withOptionalCString<T>(_ value: String?, _ body: (UnsafePointer<CChar>?) -> T) -> T {
guard let value else {
return body(nil)
}
return value.withCString(body)
}

let createWithCommandAndWorkingDirectory = {
withOptionalCString(resolvedCommand) { cCommand in
surfaceConfig.command = cCommand
withOptionalCString(resolvedWorkingDirectory) { cWorkingDir in
surfaceConfig.working_directory = cWorkingDir
withOptionalCString(resolvedInitialInput) { cInitialInput in
surfaceConfig.initial_input = cInitialInput
createSurface()
}
}
} else if let workingDirectory, !workingDirectory.isEmpty {
workingDirectory.withCString { cWorkingDir in
surfaceConfig.working_directory = cWorkingDir
createSurface()
}
} else {
createSurface()
}
}

Expand Down Expand Up @@ -3844,7 +3845,7 @@ final class TerminalSurface: Identifiable, ObservableObject {
// config/scale reconciliation. If runtime points don't match the inherited
// template points, re-apply via binding action so all creation paths
// (new surface, split, new workspace) preserve zoom from the source terminal.
if let inheritedFontPoints = configTemplate?.font_size,
if let inheritedFontPoints = configTemplate?.fontSize,
inheritedFontPoints > 0 {
let currentFontPoints = cmuxCurrentSurfaceFontSizePoints(createdSurface)
let shouldReapply = {
Expand Down
2 changes: 1 addition & 1 deletion Sources/Panels/TerminalPanel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ final class TerminalPanel: Panel, ObservableObject {
convenience init(
workspaceId: UUID,
context: ghostty_surface_context_e = GHOSTTY_SURFACE_CONTEXT_SPLIT,
configTemplate: ghostty_surface_config_s? = nil,
configTemplate: CmuxSurfaceConfigTemplate? = nil,
workingDirectory: String? = nil,
portOrdinal: Int = 0,
initialCommand: String? = nil,
Expand Down
Loading
Loading