macOS: restore non native fullscreen styles (#9559)

Fixes #8435

> [!NOTE]
> Used AI to proofread my comments
pull/9570/head
Mitchell Hashimoto 2025-11-12 08:26:09 -08:00 committed by GitHub
commit 682cb6c888
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 1 deletions

View File

@ -8,10 +8,12 @@ class TerminalRestorableState: Codable {
let focusedSurface: String?
let surfaceTree: SplitTree<Ghostty.SurfaceView>
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,

View File

@ -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) }
}