diff --git a/macos/Sources/Features/Terminal/TerminalRestorable.swift b/macos/Sources/Features/Terminal/TerminalRestorable.swift index 1e640967e..71e54b612 100644 --- a/macos/Sources/Features/Terminal/TerminalRestorable.swift +++ b/macos/Sources/Features/Terminal/TerminalRestorable.swift @@ -8,10 +8,12 @@ class TerminalRestorableState: Codable { let focusedSurface: String? let surfaceTree: SplitTree + let effectiveFullscreenMode: FullscreenMode? init(from controller: TerminalController) { self.focusedSurface = controller.focusedSurface?.id.uuidString self.surfaceTree = controller.surfaceTree + self.effectiveFullscreenMode = controller.fullscreenStyle?.fullscreenMode } init?(coder aDecoder: NSCoder) { @@ -28,6 +30,7 @@ class TerminalRestorableState: Codable { self.surfaceTree = v.value.surfaceTree self.focusedSurface = v.value.focusedSurface + self.effectiveFullscreenMode = v.value.effectiveFullscreenMode } func encode(with coder: NSCoder) { @@ -109,6 +112,13 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration { } completionHandler(window, nil) + guard let mode = state.effectiveFullscreenMode, mode != .native else { + // We let AppKit handle native fullscreen + return + } + // Give the window to AppKit first, then adjust its frame and style + // to minimise any visible frame changes. + c.toggleFullscreen(mode: mode) } /// This restores the focus state of the surfaceview within the given window. When restoring, diff --git a/macos/Sources/Helpers/Fullscreen.swift b/macos/Sources/Helpers/Fullscreen.swift index 6c70e8cf7..78c967661 100644 --- a/macos/Sources/Helpers/Fullscreen.swift +++ b/macos/Sources/Helpers/Fullscreen.swift @@ -2,7 +2,7 @@ import Cocoa import GhosttyKit /// The fullscreen modes we support define how the fullscreen behaves. -enum FullscreenMode { +enum FullscreenMode: String, Codable { case native case nonNative case nonNativeVisibleMenu @@ -31,6 +31,7 @@ enum FullscreenMode { /// Protocol that must be implemented by all fullscreen styles. protocol FullscreenStyle { var delegate: FullscreenDelegate? { get set } + var fullscreenMode: FullscreenMode { get } var isFullscreen: Bool { get } var supportsTabs: Bool { get } init?(_ window: NSWindow) @@ -87,6 +88,7 @@ class FullscreenBase { /// macOS native fullscreen. This is the typical behavior you get by pressing the green fullscreen /// button on regular titlebars. class NativeFullscreen: FullscreenBase, FullscreenStyle { + var fullscreenMode: FullscreenMode { .native } var isFullscreen: Bool { window.styleMask.contains(.fullScreen) } var supportsTabs: Bool { true } @@ -127,6 +129,8 @@ class NativeFullscreen: FullscreenBase, FullscreenStyle { } class NonNativeFullscreen: FullscreenBase, FullscreenStyle { + var fullscreenMode: FullscreenMode { .nonNative } + // Non-native fullscreen never supports tabs because tabs require // the "titled" style and we don't have it for non-native fullscreen. var supportsTabs: Bool { false } @@ -439,10 +443,12 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { } class NonNativeFullscreenVisibleMenu: NonNativeFullscreen { + override var fullscreenMode: FullscreenMode { .nonNativeVisibleMenu } override var properties: Properties { Properties(hideMenu: false) } } class NonNativeFullscreenPaddedNotch: NonNativeFullscreen { + override var fullscreenMode: FullscreenMode { .nonNativePaddedNotch } override var properties: Properties { Properties(paddedNotch: true) } }