diff --git a/GhosttyTabs.xcodeproj/project.pbxproj b/GhosttyTabs.xcodeproj/project.pbxproj index 90daab53..457a8dbf 100644 --- a/GhosttyTabs.xcodeproj/project.pbxproj +++ b/GhosttyTabs.xcodeproj/project.pbxproj @@ -56,6 +56,7 @@ B9000002A1B2C3D4E5F60719 /* cmux.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9000001A1B2C3D4E5F60719 /* cmux.swift */; }; B900000BA1B2C3D4E5F60719 /* cmux in Copy CLI */ = {isa = PBXBuildFile; fileRef = B9000004A1B2C3D4E5F60719 /* cmux */; }; 84E00D47E4584162AE53BC8D /* xterm-ghostty in Resources */ = {isa = PBXBuildFile; fileRef = B2E7294509CC42FE9191870E /* xterm-ghostty */; }; + A5002000 /* THIRD_PARTY_LICENSES.md in Resources */ = {isa = PBXBuildFile; fileRef = A5002001 /* THIRD_PARTY_LICENSES.md */; }; B9000012A1B2C3D4E5F60719 /* AutomationSocketUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9000011A1B2C3D4E5F60719 /* AutomationSocketUITests.swift */; }; B8F266236A1A3D9A45BD840F /* SidebarResizeUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 818DBCD4AB69EB72573E8138 /* SidebarResizeUITests.swift */; }; C0B4D9B0A1B2C3D4E5F60718 /* UpdatePillUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B4D9B1A1B2C3D4E5F60718 /* UpdatePillUITests.swift */; }; @@ -169,6 +170,7 @@ C0B4D9B1A1B2C3D4E5F60718 /* UpdatePillUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatePillUITests.swift; sourceTree = ""; }; A5001101 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; B2E7294509CC42FE9191870E /* xterm-ghostty */ = {isa = PBXFileReference; lastKnownFileType = file; path = "ghostty/terminfo/78/xterm-ghostty"; sourceTree = ""; }; + A5002001 /* THIRD_PARTY_LICENSES.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = THIRD_PARTY_LICENSES.md; sourceTree = SOURCE_ROOT; }; B9000001A1B2C3D4E5F60719 /* cmux.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = cmux.swift; sourceTree = ""; }; B9000004A1B2C3D4E5F60719 /* cmux */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cmux; sourceTree = BUILT_PRODUCTS_DIR; }; B9000011A1B2C3D4E5F60719 /* AutomationSocketUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutomationSocketUITests.swift; sourceTree = ""; }; @@ -224,6 +226,7 @@ files = ( A5001100 /* Assets.xcassets in Resources */, 84E00D47E4584162AE53BC8D /* xterm-ghostty in Resources */, + A5002000 /* THIRD_PARTY_LICENSES.md in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -340,6 +343,7 @@ isa = PBXGroup; children = ( B2E7294509CC42FE9191870E /* xterm-ghostty */, + A5002001 /* THIRD_PARTY_LICENSES.md */, ); path = Resources; sourceTree = ""; diff --git a/Sources/cmuxApp.swift b/Sources/cmuxApp.swift index 54f986d5..23619f5e 100644 --- a/Sources/cmuxApp.swift +++ b/Sources/cmuxApp.swift @@ -1093,7 +1093,7 @@ private enum DebugWindowConfigSnapshot { bgGlassEnabled=\(boolValue(defaults, key: "bgGlassEnabled", fallback: true)) bgGlassMaterial=\(stringValue(defaults, key: "bgGlassMaterial", fallback: "hudWindow")) bgGlassTintHex=\(stringValue(defaults, key: "bgGlassTintHex", fallback: "#000000")) - bgGlassTintOpacity=\(String(format: "%.2f", doubleValue(defaults, key: "bgGlassTintOpacity", fallback: 0.05))) + bgGlassTintOpacity=\(String(format: "%.2f", doubleValue(defaults, key: "bgGlassTintOpacity", fallback: 0.03))) """ let menuBarPayload = MenuBarIconDebugSettings.copyPayload(defaults: defaults) @@ -1339,6 +1339,56 @@ private final class AboutWindowController: NSWindowController, NSWindowDelegate } } +private final class AcknowledgmentsWindowController: NSWindowController, NSWindowDelegate { + static let shared = AcknowledgmentsWindowController() + + private init() { + let window = NSWindow( + contentRect: NSRect(x: 0, y: 0, width: 500, height: 480), + styleMask: [.titled, .closable, .miniaturizable, .resizable], + backing: .buffered, + defer: false + ) + window.isReleasedWhenClosed = false + window.title = "Third-Party Licenses" + window.identifier = NSUserInterfaceItemIdentifier("cmux.licenses") + window.center() + window.contentView = NSHostingView(rootView: AcknowledgmentsView()) + super.init(window: window) + window.delegate = self + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func show() { + guard let window else { return } + window.makeKeyAndOrderFront(nil) + } +} + +private struct AcknowledgmentsView: View { + private let content: String = { + if let url = Bundle.main.url(forResource: "THIRD_PARTY_LICENSES", withExtension: "md"), + let text = try? String(contentsOf: url) { + return text + } + return "Licenses file not found." + }() + + var body: some View { + ScrollView { + Text(content) + .font(.system(.body, design: .monospaced)) + .textSelection(.enabled) + .frame(maxWidth: .infinity, alignment: .leading) + .padding() + } + } +} + private final class SettingsWindowController: NSWindowController, NSWindowDelegate { static let shared = SettingsWindowController() @@ -1473,6 +1523,9 @@ private struct AboutPanelView: View { openURL(url) } } + Button("Licenses") { + AcknowledgmentsWindowController.shared.show() + } } if let copy = copyright, !copy.isEmpty { @@ -1927,7 +1980,7 @@ private final class BackgroundDebugWindowController: NSWindowController, NSWindo private struct BackgroundDebugView: View { @AppStorage("bgGlassTintHex") private var bgGlassTintHex = "#000000" - @AppStorage("bgGlassTintOpacity") private var bgGlassTintOpacity = 0.05 + @AppStorage("bgGlassTintOpacity") private var bgGlassTintOpacity = 0.03 @AppStorage("bgGlassMaterial") private var bgGlassMaterial = "hudWindow" @AppStorage("bgGlassEnabled") private var bgGlassEnabled = true @@ -1973,7 +2026,7 @@ private struct BackgroundDebugView: View { HStack(spacing: 12) { Button("Reset") { bgGlassTintHex = "#000000" - bgGlassTintOpacity = 0.05 + bgGlassTintOpacity = 0.03 bgGlassMaterial = "hudWindow" bgGlassEnabled = true updateWindowGlassTint()