macOS: restore non native fullscreen styles (#9559)
Fixes #8435 > [!NOTE] > Used AI to proofread my commentspull/9570/head
commit
682cb6c888
|
|
@ -8,10 +8,12 @@ class TerminalRestorableState: Codable {
|
||||||
|
|
||||||
let focusedSurface: String?
|
let focusedSurface: String?
|
||||||
let surfaceTree: SplitTree<Ghostty.SurfaceView>
|
let surfaceTree: SplitTree<Ghostty.SurfaceView>
|
||||||
|
let effectiveFullscreenMode: FullscreenMode?
|
||||||
|
|
||||||
init(from controller: TerminalController) {
|
init(from controller: TerminalController) {
|
||||||
self.focusedSurface = controller.focusedSurface?.id.uuidString
|
self.focusedSurface = controller.focusedSurface?.id.uuidString
|
||||||
self.surfaceTree = controller.surfaceTree
|
self.surfaceTree = controller.surfaceTree
|
||||||
|
self.effectiveFullscreenMode = controller.fullscreenStyle?.fullscreenMode
|
||||||
}
|
}
|
||||||
|
|
||||||
init?(coder aDecoder: NSCoder) {
|
init?(coder aDecoder: NSCoder) {
|
||||||
|
|
@ -28,6 +30,7 @@ class TerminalRestorableState: Codable {
|
||||||
|
|
||||||
self.surfaceTree = v.value.surfaceTree
|
self.surfaceTree = v.value.surfaceTree
|
||||||
self.focusedSurface = v.value.focusedSurface
|
self.focusedSurface = v.value.focusedSurface
|
||||||
|
self.effectiveFullscreenMode = v.value.effectiveFullscreenMode
|
||||||
}
|
}
|
||||||
|
|
||||||
func encode(with coder: NSCoder) {
|
func encode(with coder: NSCoder) {
|
||||||
|
|
@ -109,6 +112,13 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration {
|
||||||
}
|
}
|
||||||
|
|
||||||
completionHandler(window, nil)
|
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,
|
/// This restores the focus state of the surfaceview within the given window. When restoring,
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import Cocoa
|
||||||
import GhosttyKit
|
import GhosttyKit
|
||||||
|
|
||||||
/// The fullscreen modes we support define how the fullscreen behaves.
|
/// The fullscreen modes we support define how the fullscreen behaves.
|
||||||
enum FullscreenMode {
|
enum FullscreenMode: String, Codable {
|
||||||
case native
|
case native
|
||||||
case nonNative
|
case nonNative
|
||||||
case nonNativeVisibleMenu
|
case nonNativeVisibleMenu
|
||||||
|
|
@ -31,6 +31,7 @@ enum FullscreenMode {
|
||||||
/// Protocol that must be implemented by all fullscreen styles.
|
/// Protocol that must be implemented by all fullscreen styles.
|
||||||
protocol FullscreenStyle {
|
protocol FullscreenStyle {
|
||||||
var delegate: FullscreenDelegate? { get set }
|
var delegate: FullscreenDelegate? { get set }
|
||||||
|
var fullscreenMode: FullscreenMode { get }
|
||||||
var isFullscreen: Bool { get }
|
var isFullscreen: Bool { get }
|
||||||
var supportsTabs: Bool { get }
|
var supportsTabs: Bool { get }
|
||||||
init?(_ window: NSWindow)
|
init?(_ window: NSWindow)
|
||||||
|
|
@ -87,6 +88,7 @@ class FullscreenBase {
|
||||||
/// macOS native fullscreen. This is the typical behavior you get by pressing the green fullscreen
|
/// macOS native fullscreen. This is the typical behavior you get by pressing the green fullscreen
|
||||||
/// button on regular titlebars.
|
/// button on regular titlebars.
|
||||||
class NativeFullscreen: FullscreenBase, FullscreenStyle {
|
class NativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||||
|
var fullscreenMode: FullscreenMode { .native }
|
||||||
var isFullscreen: Bool { window.styleMask.contains(.fullScreen) }
|
var isFullscreen: Bool { window.styleMask.contains(.fullScreen) }
|
||||||
var supportsTabs: Bool { true }
|
var supportsTabs: Bool { true }
|
||||||
|
|
||||||
|
|
@ -127,6 +129,8 @@ class NativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||||
}
|
}
|
||||||
|
|
||||||
class NonNativeFullscreen: FullscreenBase, FullscreenStyle {
|
class NonNativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||||
|
var fullscreenMode: FullscreenMode { .nonNative }
|
||||||
|
|
||||||
// Non-native fullscreen never supports tabs because tabs require
|
// Non-native fullscreen never supports tabs because tabs require
|
||||||
// the "titled" style and we don't have it for non-native fullscreen.
|
// the "titled" style and we don't have it for non-native fullscreen.
|
||||||
var supportsTabs: Bool { false }
|
var supportsTabs: Bool { false }
|
||||||
|
|
@ -439,10 +443,12 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||||
}
|
}
|
||||||
|
|
||||||
class NonNativeFullscreenVisibleMenu: NonNativeFullscreen {
|
class NonNativeFullscreenVisibleMenu: NonNativeFullscreen {
|
||||||
|
override var fullscreenMode: FullscreenMode { .nonNativeVisibleMenu }
|
||||||
override var properties: Properties { Properties(hideMenu: false) }
|
override var properties: Properties { Properties(hideMenu: false) }
|
||||||
}
|
}
|
||||||
|
|
||||||
class NonNativeFullscreenPaddedNotch: NonNativeFullscreen {
|
class NonNativeFullscreenPaddedNotch: NonNativeFullscreen {
|
||||||
|
override var fullscreenMode: FullscreenMode { .nonNativePaddedNotch }
|
||||||
override var properties: Properties { Properties(paddedNotch: true) }
|
override var properties: Properties { Properties(paddedNotch: true) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue