macos: use correct title background if top surface

This commit is contained in:
Mitchell Hashimoto
2024-11-21 14:20:09 -08:00
parent 36a57826a6
commit 1aa77837eb
2 changed files with 13 additions and 10 deletions

View File

@ -191,15 +191,10 @@ class TerminalController: BaseTerminalController {
private func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { private func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) {
guard let window = self.window as? TerminalWindow else { return } guard let window = self.window as? TerminalWindow else { return }
// If our window is not visible, then delay this. This is possible specifically // If our window is not visible, then we do nothing. Some things such as blurring
// during state restoration but probably in other scenarios as well. To delay, // have no effect if the window is not visible. Ultimately, we'll have this called
// we just loop directly on the dispatch queue. We have to delay because some // at some point when a surface becomes focused.
// APIs such as window blur have no effect unless the window is visible. guard window.isVisible else { return }
guard window.isVisible else {
// Weak window so that if the window changes or is destroyed we aren't holding a ref
DispatchQueue.main.async { [weak self] in self?.syncAppearance(surfaceConfig) }
return
}
// Set the font for the window and tab titles. // Set the font for the window and tab titles.
if let titleFontName = surfaceConfig.windowTitleFontFamily { if let titleFontName = surfaceConfig.windowTitleFontFamily {
@ -233,7 +228,7 @@ class TerminalController: BaseTerminalController {
let backgroundColor: OSColor let backgroundColor: OSColor
if let surfaceTree { if let surfaceTree {
if let focusedSurface, surfaceTree.doesBorderTop(view: focusedSurface) { if let focusedSurface, surfaceTree.doesBorderTop(view: focusedSurface) {
backgroundColor = OSColor(focusedSurface.backgroundColor ?? derivedConfig.backgroundColor) backgroundColor = OSColor(focusedSurface.backgroundColor ?? surfaceConfig.backgroundColor)
} else { } else {
// We don't have a focused surface or our surface doesn't border the // We don't have a focused surface or our surface doesn't border the
// top. We choose to match the color of the top-left most surface. // top. We choose to match the color of the top-left most surface.

View File

@ -21,6 +21,14 @@ extension OSColor {
return (0.299 * r) + (0.587 * g) + (0.114 * b) return (0.299 * r) + (0.587 * g) + (0.114 * b)
} }
var hexString: String? {
guard let rgb = usingColorSpace(.deviceRGB) else { return nil }
let red = Int(rgb.redComponent * 255)
let green = Int(rgb.greenComponent * 255)
let blue = Int(rgb.blueComponent * 255)
return String(format: "#%02X%02X%02X", red, green, blue)
}
func darken(by amount: CGFloat) -> OSColor { func darken(by amount: CGFloat) -> OSColor {
var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0
self.getHue(&h, saturation: &s, brightness: &b, alpha: &a) self.getHue(&h, saturation: &s, brightness: &b, alpha: &a)