diff --git a/Sources/AppDelegate.swift b/Sources/AppDelegate.swift index 09d1dd18f295..b2b122b21b55 100644 --- a/Sources/AppDelegate.swift +++ b/Sources/AppDelegate.swift @@ -132,60 +132,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent MacSentryStartupPolicy.isRunningUnderXCTest(environment: env) } - @MainActor - final class MainWindowContext { - let windowId: UUID - let tabManager: TabManager - let sidebarState: SidebarState - let sidebarSelectionState: SidebarSelectionState - var fileExplorerState: FileExplorerState? - let keyboardFocusCoordinator: MainWindowFocusController - var cmuxConfigStore: CmuxConfigStore? - var closeObserver: WindowCloseObserver? - weak var window: NSWindow? - /// Per-window Dock owned by this context and torn down with it. - var windowDock: DockSplitStore? - private let workspaceTerminalFontSizeArbiter: - WorkspaceTerminalFontSizeArbiter - /// Window-scoped font-size queue. Requests contain stable workspace ids; - /// teardown cancels the queue before any surface owner is released. - lazy var workspaceTerminalFontSizeCoordinator = - WorkspaceTerminalFontSizeCoordinator( - tabManager: tabManager, - arbiter: workspaceTerminalFontSizeArbiter - ) -#if DEBUG - var debugWorkspaceTerminalFontSizeEnqueueResultOverride: Bool? -#endif - - init( - windowId: UUID, - tabManager: TabManager, - sidebarState: SidebarState, - sidebarSelectionState: SidebarSelectionState, - fileExplorerState: FileExplorerState?, - cmuxConfigStore: CmuxConfigStore?, - window: NSWindow?, - workspaceTerminalFontSizeArbiter: - WorkspaceTerminalFontSizeArbiter - ) { - self.windowId = windowId - self.tabManager = tabManager - self.sidebarState = sidebarState - self.sidebarSelectionState = sidebarSelectionState - self.fileExplorerState = fileExplorerState - self.cmuxConfigStore = cmuxConfigStore - self.window = window - self.workspaceTerminalFontSizeArbiter = - workspaceTerminalFontSizeArbiter - self.keyboardFocusCoordinator = MainWindowFocusController( - windowId: windowId, - window: window, - tabManager: tabManager, - fileExplorerState: fileExplorerState - ) - } - } + /// Compatibility name for the independently owned main-window model. + typealias MainWindowContext = CmuxMainWindowContext struct ScriptableMainWindowState { let windowId: UUID diff --git a/Sources/CmuxMainWindowContext.swift b/Sources/CmuxMainWindowContext.swift new file mode 100644 index 000000000000..7c2e844f5e64 --- /dev/null +++ b/Sources/CmuxMainWindowContext.swift @@ -0,0 +1,57 @@ +import AppKit + +/// Owns the models and resource handles scoped to a single main window. +@MainActor +final class CmuxMainWindowContext { + let windowId: UUID + let tabManager: TabManager + let sidebarState: SidebarState + let sidebarSelectionState: SidebarSelectionState + var fileExplorerState: FileExplorerState? + let keyboardFocusCoordinator: MainWindowFocusController + var cmuxConfigStore: CmuxConfigStore? + var closeObserver: WindowCloseObserver? + weak var window: NSWindow? + /// Per-window Dock owned by this context and torn down with it. + var windowDock: DockSplitStore? + private let workspaceTerminalFontSizeArbiter: + WorkspaceTerminalFontSizeArbiter + /// Window-scoped font-size queue. Requests contain stable workspace ids; + /// teardown cancels the queue before any surface owner is released. + lazy var workspaceTerminalFontSizeCoordinator = + WorkspaceTerminalFontSizeCoordinator( + tabManager: tabManager, + arbiter: workspaceTerminalFontSizeArbiter + ) +#if DEBUG + var debugWorkspaceTerminalFontSizeEnqueueResultOverride: Bool? +#endif + + init( + windowId: UUID, + tabManager: TabManager, + sidebarState: SidebarState, + sidebarSelectionState: SidebarSelectionState, + fileExplorerState: FileExplorerState?, + cmuxConfigStore: CmuxConfigStore?, + window: NSWindow?, + workspaceTerminalFontSizeArbiter: + WorkspaceTerminalFontSizeArbiter + ) { + self.windowId = windowId + self.tabManager = tabManager + self.sidebarState = sidebarState + self.sidebarSelectionState = sidebarSelectionState + self.fileExplorerState = fileExplorerState + self.cmuxConfigStore = cmuxConfigStore + self.window = window + self.workspaceTerminalFontSizeArbiter = + workspaceTerminalFontSizeArbiter + self.keyboardFocusCoordinator = MainWindowFocusController( + windowId: windowId, + window: window, + tabManager: tabManager, + fileExplorerState: fileExplorerState + ) + } +} diff --git a/Sources/MainWindowRegistry.swift b/Sources/MainWindowRegistry.swift index c603a9b7a75f..d5a892de4fdf 100644 --- a/Sources/MainWindowRegistry.swift +++ b/Sources/MainWindowRegistry.swift @@ -3,7 +3,7 @@ import AppKit /// Owns the identity index that maps terminal windows to their main-window contexts. @MainActor final class MainWindowRegistry { - typealias Context = AppDelegate.MainWindowContext + typealias Context = CmuxMainWindowContext private(set) var contexts: [ObjectIdentifier: Context] = [:] diff --git a/cmux.xcodeproj/project.pbxproj b/cmux.xcodeproj/project.pbxproj index 2c93b1940bc0..c2c85f21736b 100644 --- a/cmux.xcodeproj/project.pbxproj +++ b/cmux.xcodeproj/project.pbxproj @@ -780,6 +780,7 @@ C0DE71B10000000000000001 /* AppDelegate+AgentChatNotifications.swift in Sources E7D100000000000000000005 /* CmuxMainThreadTurnProfiler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7D100000000000000000006 /* CmuxMainThreadTurnProfiler.swift */; }; 2F0C07000000000000000002 /* CmuxMainWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F0C07000000000000000001 /* CmuxMainWindow.swift */; }; D36090010000000000000005 /* CmuxMainWindowConstrainFrameTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D36090010000000000000006 /* CmuxMainWindowConstrainFrameTests.swift */; }; + D4A200000000000000000001 /* CmuxMainWindowContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4A200000000000000000002 /* CmuxMainWindowContext.swift */; }; D36090020000000000000005 /* CmuxMainWindowFullScreenCapabilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D36090020000000000000006 /* CmuxMainWindowFullScreenCapabilityTests.swift */; }; 799F1BEF876006EEB8CD1035 /* CMUXMobileCore in Frameworks */ = {isa = PBXBuildFile; productRef = EFB18E3B3099DFE2ECA3C263 /* CMUXMobileCore */; }; EFB18E3C0000000000000001 /* CMUXMobileCore in Frameworks */ = {isa = PBXBuildFile; productRef = EFB18E3B3099DFE2ECA3C263 /* CMUXMobileCore */; }; @@ -3611,6 +3612,7 @@ C0DE71B10000000000000002 /* AppDelegate+AgentChatNotifications.swift */ = {isa = E7D100000000000000000006 /* CmuxMainThreadTurnProfiler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Debug/CmuxMainThreadTurnProfiler.swift"; sourceTree = ""; }; 2F0C07000000000000000001 /* CmuxMainWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App/CmuxMainWindow.swift; sourceTree = ""; }; D36090010000000000000006 /* CmuxMainWindowConstrainFrameTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxMainWindowConstrainFrameTests.swift; sourceTree = ""; }; + D4A200000000000000000002 /* CmuxMainWindowContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxMainWindowContext.swift; sourceTree = ""; }; D36090020000000000000006 /* CmuxMainWindowFullScreenCapabilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxMainWindowFullScreenCapabilityTests.swift; sourceTree = ""; }; CA1F0A02CA1F0A02CA1F0A02 /* CmuxModalAlertPresentation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxModalAlertPresentation.swift; sourceTree = ""; }; C54860110000000000000002 /* CmuxNavigationResolution.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxNavigationResolution.swift; sourceTree = ""; }; @@ -6891,6 +6893,7 @@ C0DE71B10000000000000002 /* AppDelegate+AgentChatNotifications.swift */ = {isa = E7E300000000000000000002 /* SessionAutosaveCoordinator.swift */, FEE012340000000000000002 /* FeedSidebarUITestCoordinator.swift */, D4A100000000000000000002 /* MainWindowRegistry.swift */, + D4A200000000000000000002 /* CmuxMainWindowContext.swift */, E7C100000000000000000002 /* TerminalCmdClickUITestCoordinator.swift */, E7C100000000000000000004 /* TerminalCmdClickUITestConfiguration.swift */, E7C100000000000000000006 /* TerminalCmdClickUITestManifestWriter.swift */, @@ -9387,6 +9390,7 @@ C0DE71B10000000000000002 /* AppDelegate+AgentChatNotifications.swift */ = {isa = E7D100000000000000000003 /* CmuxMainRunLoopStallMonitor.swift in Sources */, E7D100000000000000000005 /* CmuxMainThreadTurnProfiler.swift in Sources */, 2F0C07000000000000000002 /* CmuxMainWindow.swift in Sources */, + D4A200000000000000000001 /* CmuxMainWindowContext.swift in Sources */, CA1F0A01CA1F0A01CA1F0A01 /* CmuxModalAlertPresentation.swift in Sources */, C54860110000000000000001 /* CmuxNavigationResolution.swift in Sources */, C54860120000000000000001 /* CmuxNavigationSurfaceDescriptor.swift in Sources */,