macos: use a runtime liquid glass check for our Tahoe styling
parent
1b6142b271
commit
928603c23e
|
|
@ -90,7 +90,7 @@
|
||||||
A5A1F8852A489D6800D1E8BC /* terminfo in Resources */ = {isa = PBXBuildFile; fileRef = A5A1F8842A489D6800D1E8BC /* terminfo */; };
|
A5A1F8852A489D6800D1E8BC /* terminfo in Resources */ = {isa = PBXBuildFile; fileRef = A5A1F8842A489D6800D1E8BC /* terminfo */; };
|
||||||
A5A2A3CA2D4445E30033CF96 /* Dock.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A2A3C92D4445E20033CF96 /* Dock.swift */; };
|
A5A2A3CA2D4445E30033CF96 /* Dock.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A2A3C92D4445E20033CF96 /* Dock.swift */; };
|
||||||
A5A2A3CC2D444ABB0033CF96 /* NSApplication+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */; };
|
A5A2A3CC2D444ABB0033CF96 /* NSApplication+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */; };
|
||||||
A5A6F72A2CC41B8900B232A5 /* Xcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A6F7292CC41B8700B232A5 /* Xcode.swift */; };
|
A5A6F72A2CC41B8900B232A5 /* AppInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A6F7292CC41B8700B232A5 /* AppInfo.swift */; };
|
||||||
A5AEB1652D5BE7D000513529 /* LastWindowPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */; };
|
A5AEB1652D5BE7D000513529 /* LastWindowPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */; };
|
||||||
A5B30539299BEAAB0047F10C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5B30538299BEAAB0047F10C /* Assets.xcassets */; };
|
A5B30539299BEAAB0047F10C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5B30538299BEAAB0047F10C /* Assets.xcassets */; };
|
||||||
A5CA378C2D2A4DEB00931030 /* KeyboardLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */; };
|
A5CA378C2D2A4DEB00931030 /* KeyboardLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */; };
|
||||||
|
|
@ -205,7 +205,7 @@
|
||||||
A5A1F8842A489D6800D1E8BC /* terminfo */ = {isa = PBXFileReference; lastKnownFileType = folder; name = terminfo; path = "../zig-out/share/terminfo"; sourceTree = "<group>"; };
|
A5A1F8842A489D6800D1E8BC /* terminfo */ = {isa = PBXFileReference; lastKnownFileType = folder; name = terminfo; path = "../zig-out/share/terminfo"; sourceTree = "<group>"; };
|
||||||
A5A2A3C92D4445E20033CF96 /* Dock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dock.swift; sourceTree = "<group>"; };
|
A5A2A3C92D4445E20033CF96 /* Dock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dock.swift; sourceTree = "<group>"; };
|
||||||
A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSApplication+Extension.swift"; sourceTree = "<group>"; };
|
A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSApplication+Extension.swift"; sourceTree = "<group>"; };
|
||||||
A5A6F7292CC41B8700B232A5 /* Xcode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode.swift; sourceTree = "<group>"; };
|
A5A6F7292CC41B8700B232A5 /* AppInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInfo.swift; sourceTree = "<group>"; };
|
||||||
A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastWindowPosition.swift; sourceTree = "<group>"; };
|
A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastWindowPosition.swift; sourceTree = "<group>"; };
|
||||||
A5B30531299BEAAA0047F10C /* Ghostty.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Ghostty.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
A5B30531299BEAAA0047F10C /* Ghostty.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Ghostty.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
A5B30538299BEAAB0047F10C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
A5B30538299BEAAB0047F10C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
|
|
@ -312,8 +312,8 @@
|
||||||
children = (
|
children = (
|
||||||
A58636692DF0A98100E04A10 /* Extensions */,
|
A58636692DF0A98100E04A10 /* Extensions */,
|
||||||
A5874D9B2DAD781100E83852 /* Private */,
|
A5874D9B2DAD781100E83852 /* Private */,
|
||||||
|
A5A6F7292CC41B8700B232A5 /* AppInfo.swift */,
|
||||||
A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */,
|
A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */,
|
||||||
A5A6F7292CC41B8700B232A5 /* Xcode.swift */,
|
|
||||||
A5CEAFFE29C2410700646FDA /* Backport.swift */,
|
A5CEAFFE29C2410700646FDA /* Backport.swift */,
|
||||||
A5333E1B2B5A1CE3008AEFF7 /* CrossKit.swift */,
|
A5333E1B2B5A1CE3008AEFF7 /* CrossKit.swift */,
|
||||||
A5CBD0572C9F30860017A1AE /* Cursor.swift */,
|
A5CBD0572C9F30860017A1AE /* Cursor.swift */,
|
||||||
|
|
@ -756,7 +756,7 @@
|
||||||
A52FFF5D2CAB4D08000C6A5B /* NSScreen+Extension.swift in Sources */,
|
A52FFF5D2CAB4D08000C6A5B /* NSScreen+Extension.swift in Sources */,
|
||||||
A53426352A7DA53D00EBB7A2 /* AppDelegate.swift in Sources */,
|
A53426352A7DA53D00EBB7A2 /* AppDelegate.swift in Sources */,
|
||||||
A5CBD0582C9F30960017A1AE /* Cursor.swift in Sources */,
|
A5CBD0582C9F30960017A1AE /* Cursor.swift in Sources */,
|
||||||
A5A6F72A2CC41B8900B232A5 /* Xcode.swift in Sources */,
|
A5A6F72A2CC41B8900B232A5 /* AppInfo.swift in Sources */,
|
||||||
A52FFF5B2CAA54B1000C6A5B /* FullscreenMode+Extension.swift in Sources */,
|
A52FFF5B2CAA54B1000C6A5B /* FullscreenMode+Extension.swift in Sources */,
|
||||||
A5333E222B5A2128008AEFF7 /* SurfaceView_AppKit.swift in Sources */,
|
A5333E222B5A2128008AEFF7 /* SurfaceView_AppKit.swift in Sources */,
|
||||||
A5CA378E2D31D6C300931030 /* Weak.swift in Sources */,
|
A5CA378E2D31D6C300931030 /* Weak.swift in Sources */,
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ class TerminalController: BaseTerminalController {
|
||||||
case "hidden": "TerminalHiddenTitlebar"
|
case "hidden": "TerminalHiddenTitlebar"
|
||||||
case "transparent": "TerminalTransparentTitlebar"
|
case "transparent": "TerminalTransparentTitlebar"
|
||||||
case "tabs":
|
case "tabs":
|
||||||
if #available(macOS 26.0, *) {
|
if #available(macOS 26.0, *), hasLiquidGlass() {
|
||||||
"TerminalTabsTitlebarTahoe"
|
"TerminalTabsTitlebarTahoe"
|
||||||
} else {
|
} else {
|
||||||
"TerminalTabsTitlebarVentura"
|
"TerminalTabsTitlebarVentura"
|
||||||
|
|
|
||||||
|
|
@ -447,7 +447,7 @@ extension TerminalWindow {
|
||||||
// The padding from the top that the view appears. This was all just manually
|
// The padding from the top that the view appears. This was all just manually
|
||||||
// measured based on the OS.
|
// measured based on the OS.
|
||||||
var topPadding: CGFloat {
|
var topPadding: CGFloat {
|
||||||
if #available(macOS 26.0, *) {
|
if #available(macOS 26.0, *), hasLiquidGlass() {
|
||||||
return viewModel.hasToolbar ? 10 : 5
|
return viewModel.hasToolbar ? 10 : 5
|
||||||
} else {
|
} else {
|
||||||
return viewModel.hasToolbar ? 9 : 4
|
return viewModel.hasToolbar ? 9 : 4
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ class TransparentTitlebarTerminalWindow: TerminalWindow {
|
||||||
|
|
||||||
// On macOS 13 to 15, we need to hide the NSVisualEffectView in order to allow our
|
// On macOS 13 to 15, we need to hide the NSVisualEffectView in order to allow our
|
||||||
// titlebar to be truly transparent.
|
// titlebar to be truly transparent.
|
||||||
if #unavailable(macOS 26.0) {
|
if !effectViewIsHidden && !hasLiquidGlass() {
|
||||||
hideEffectView()
|
hideEffectView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -65,7 +65,7 @@ class TransparentTitlebarTerminalWindow: TerminalWindow {
|
||||||
// references changed (e.g. tabGroup is new).
|
// references changed (e.g. tabGroup is new).
|
||||||
setupKVO()
|
setupKVO()
|
||||||
|
|
||||||
if #available(macOS 26.0, *) {
|
if #available(macOS 26.0, *), hasLiquidGlass() {
|
||||||
syncAppearanceTahoe(surfaceConfig)
|
syncAppearanceTahoe(surfaceConfig)
|
||||||
} else {
|
} else {
|
||||||
syncAppearanceVentura(surfaceConfig)
|
syncAppearanceVentura(surfaceConfig)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
/// True if we appear to be running in Xcode.
|
||||||
|
func isRunningInXcode() -> Bool {
|
||||||
|
if let _ = ProcessInfo.processInfo.environment["__XCODE_BUILT_PRODUCTS_DIR_PATHS"] {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/// True if we have liquid glass available.
|
||||||
|
func hasLiquidGlass() -> Bool {
|
||||||
|
// Can't have liquid glass unless we're in macOS 26+
|
||||||
|
if #unavailable(macOS 26.0) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we aren't running SDK 26.0 or later then we definitely
|
||||||
|
// do not have liquid glass.
|
||||||
|
guard let sdkName = Bundle.main.infoDictionary?["DTSDKName"] as? String else {
|
||||||
|
// If we don't have this, we assume we're built against the latest
|
||||||
|
// since we're on macOS 26+
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the SDK doesn't start with macosx then we just assume we
|
||||||
|
// have it because we already verified we're on macOS above.
|
||||||
|
guard sdkName.hasPrefix("macosx") else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// The SDK version must be at least 26
|
||||||
|
let versionString = String(sdkName.dropFirst("macosx".count))
|
||||||
|
guard let major = if let dotIndex = versionString.firstIndex(of: ".") {
|
||||||
|
Int(String(versionString[..<dotIndex]))
|
||||||
|
} else {
|
||||||
|
Int(versionString)
|
||||||
|
} else { return true }
|
||||||
|
|
||||||
|
// Note: we could also check for the UIDesignRequiresCompatibility key
|
||||||
|
// but our project doesn't use it so there's no point.
|
||||||
|
return major >= 26
|
||||||
|
}
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
import Foundation
|
|
||||||
|
|
||||||
/// True if we appear to be running in Xcode.
|
|
||||||
func isRunningInXcode() -> Bool {
|
|
||||||
if let _ = ProcessInfo.processInfo.environment["__XCODE_BUILT_PRODUCTS_DIR_PATHS"] {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue