macos: make syncAppearance a virtual method on BaseTerminalController

pull/9117/head
Mitchell Hashimoto 2025-12-16 12:59:51 -08:00
parent f9a1f526c8
commit 95f4093e96
No known key found for this signature in database
GPG Key ID: 523D5DC389D273BC
4 changed files with 29 additions and 31 deletions

View File

@ -313,13 +313,6 @@ class QuickTerminalController: BaseTerminalController {
animateOut() animateOut()
} }
override func toggleBackgroundOpacity() {
super.toggleBackgroundOpacity()
// Sync the window appearance with the new opacity state
syncAppearance()
}
// MARK: Methods // MARK: Methods
func toggle() { func toggle() {
@ -603,7 +596,7 @@ class QuickTerminalController: BaseTerminalController {
}) })
} }
private func syncAppearance() { override func syncAppearance() {
guard let window else { return } guard let window else { return }
defer { updateColorSchemeForSurfaceTree() } defer { updateColorSchemeForSurfaceTree() }

View File

@ -815,7 +815,7 @@ class BaseTerminalController: NSWindowController,
} }
} }
// MARK: Background Opacity // MARK: Appearance
/// Toggle the background opacity between transparent and opaque states. /// Toggle the background opacity between transparent and opaque states.
/// Do nothing if the configured background-opacity is >= 1 (already opaque). /// Do nothing if the configured background-opacity is >= 1 (already opaque).
@ -823,9 +823,25 @@ class BaseTerminalController: NSWindowController,
func toggleBackgroundOpacity() { func toggleBackgroundOpacity() {
// Do nothing if config is already fully opaque // Do nothing if config is already fully opaque
guard ghostty.config.backgroundOpacity < 1 else { return } guard ghostty.config.backgroundOpacity < 1 else { return }
// Do nothing if in fullscreen (transparency doesn't apply in fullscreen)
guard let window, !window.styleMask.contains(.fullScreen) else { return }
// Toggle between transparent and opaque // Toggle between transparent and opaque
isBackgroundOpaque.toggle() isBackgroundOpaque.toggle()
// Update our appearance
syncAppearance()
}
/// Override this to resync any appearance related properties. This will be called automatically
/// when certain window properties change that affect appearance. The list below should be updated
/// as we add new things:
///
/// - ``toggleBackgroundOpacity``
func syncAppearance() {
// Purposely a no-op. This lets subclasses override this and we can call
// it virtually from here.
} }
// MARK: Fullscreen // MARK: Fullscreen
@ -888,6 +904,9 @@ class BaseTerminalController: NSWindowController,
} else { } else {
updateOverlayIsVisible = defaultUpdateOverlayVisibility() updateOverlayIsVisible = defaultUpdateOverlayVisibility()
} }
// Always resync our appearance
syncAppearance()
} }
// MARK: Clipboard Confirmation // MARK: Clipboard Confirmation

View File

@ -165,28 +165,6 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
} }
} }
override func fullscreenDidChange() {
super.fullscreenDidChange()
// When our fullscreen state changes, we resync our appearance because some
// properties change when fullscreen or not.
guard let focusedSurface else { return }
syncAppearance(focusedSurface.derivedConfig)
}
override func toggleBackgroundOpacity() {
// Do nothing if in fullscreen (transparency doesn't apply in fullscreen)
guard let window = self.window, !window.styleMask.contains(.fullScreen) else { return }
super.toggleBackgroundOpacity()
// Sync the window appearance with the new opacity state
guard let focusedSurface else { return }
syncAppearance(focusedSurface.derivedConfig)
}
// MARK: Terminal Creation // MARK: Terminal Creation
/// Returns all the available terminal controllers present in the app currently. /// Returns all the available terminal controllers present in the app currently.
@ -500,6 +478,13 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
tabWindowsHash = v tabWindowsHash = v
self.relabelTabs() self.relabelTabs()
} }
override func syncAppearance() {
// When our focus changes, we update our window appearance based on the
// currently focused surface.
guard let focusedSurface else { return }
syncAppearance(focusedSurface.derivedConfig)
}
private func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { private func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) {
// Let our window handle its own appearance // Let our window handle its own appearance

View File

@ -469,6 +469,7 @@ class TerminalWindow: NSWindow {
// Window transparency only takes effect if our window is not native fullscreen. // Window transparency only takes effect if our window is not native fullscreen.
// In native fullscreen we disable transparency/opacity because the background // In native fullscreen we disable transparency/opacity because the background
// becomes gray and widgets show through. // becomes gray and widgets show through.
//
// Also check if the user has overridden transparency to be fully opaque. // Also check if the user has overridden transparency to be fully opaque.
let forceOpaque = terminalController?.isBackgroundOpaque ?? false let forceOpaque = terminalController?.isBackgroundOpaque ?? false
if !styleMask.contains(.fullScreen) && if !styleMask.contains(.fullScreen) &&