From 852eb2e0d5e8d1c38ebf08d154a025316891371c Mon Sep 17 00:00:00 2001 From: Bryan Lee <38807139+liby@users.noreply.github.com> Date: Wed, 23 Jul 2025 23:21:26 +0800 Subject: [PATCH] Fix tab titles not being preserved with window-save-state Add serialization for tab titles in SurfaceView to persist user-set titles across app restarts. Bump TerminalRestorableState version to 4 to handle the new format. --- .../Features/Terminal/TerminalRestorable.swift | 2 +- macos/Sources/Ghostty/SurfaceView_AppKit.swift | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/Terminal/TerminalRestorable.swift b/macos/Sources/Features/Terminal/TerminalRestorable.swift index 9d9b7ffb1..8baa76246 100644 --- a/macos/Sources/Features/Terminal/TerminalRestorable.swift +++ b/macos/Sources/Features/Terminal/TerminalRestorable.swift @@ -4,7 +4,7 @@ import Cocoa class TerminalRestorableState: Codable { static let selfKey = "state" static let versionKey = "version" - static let version: Int = 3 + static let version: Int = 4 let focusedSurface: String? let surfaceTree: SplitTree diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 47c7eba22..4b47949e2 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1519,6 +1519,8 @@ extension Ghostty { enum CodingKeys: String, CodingKey { case pwd case uuid + case title + case isUserSetTitle } required convenience init(from decoder: Decoder) throws { @@ -1533,14 +1535,27 @@ extension Ghostty { let uuid = UUID(uuidString: try container.decode(String.self, forKey: .uuid)) var config = Ghostty.SurfaceConfiguration() config.workingDirectory = try container.decode(String?.self, forKey: .pwd) + let savedTitle = try container.decodeIfPresent(String.self, forKey: .title) + let isUserSetTitle = try container.decodeIfPresent(Bool.self, forKey: .isUserSetTitle) ?? false self.init(app, baseConfig: config, uuid: uuid) + + // Restore the saved title after initialization + if let title = savedTitle { + self.title = title + // If this was a user-set title, we need to prevent it from being overwritten + if isUserSetTitle { + self.titleFromTerminal = title + } + } } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(pwd, forKey: .pwd) try container.encode(uuid.uuidString, forKey: .uuid) + try container.encode(title, forKey: .title) + try container.encode(titleFromTerminal != nil, forKey: .isUserSetTitle) } } }