vibetunnel/ios/VibeTunnel/Utils/MacCatalystWindow.swift
Peter Steinberger be245b5d9f Fix iOS app build issues for Swift 6 and Xcode beta
- Pin SwiftTerm to exact version 1.2.5 for stability
- Add Dynamic framework export to VibeTunnelDependencies
- Set Swift 5 compatibility for dependencies package
- Fix Swift 6 concurrency issues in MacCatalystWindow
- Update @StateObject to @State for @Observable pattern
- Disable Dynamic-dependent window styling gracefully
- Remove redundant DynamicImport.swift file

The iOS app now builds successfully and runs via Mac Catalyst.
2025-08-02 22:04:03 +02:00

129 lines
4.2 KiB
Swift

@preconcurrency import SwiftUI
#if targetEnvironment(macCatalyst)
import UIKit
// MARK: - Window Style
/// Mac Catalyst window appearance styles.
/// Controls title bar visibility and traffic light positioning.
enum MacWindowStyle {
case standard // Normal title bar with traffic lights
case inline // Hidden title bar with repositioned traffic lights
}
// MARK: - UIWindow Extension
/// UIWindow extension for accessing NSWindow in Mac Catalyst.
/// Provides bridge to AppKit window functionality on macOS.
extension UIWindow {
/// Access the underlying NSWindow in Mac Catalyst
var nsWindow: NSObject? {
// Dynamic framework not available, return nil for now
return nil
}
}
// MARK: - Window Manager
/// Manages Mac Catalyst window customizations.
/// Handles window style changes and traffic light button repositioning.
@MainActor
@Observable
class MacCatalystWindowManager {
static let shared = MacCatalystWindowManager()
var windowStyle: MacWindowStyle = .standard
private var window: UIWindow?
private var windowResizeObserver: NSObjectProtocol?
private var windowDidBecomeKeyObserver: NSObjectProtocol?
private let logger = Logger(category: "MacCatalystWindow")
// Traffic light button configuration
private let trafficLightInset = CGPoint(x: 20, y: 20)
private let trafficLightSpacing: CGFloat = 20
private init() {}
/// Configure the window with the specified style
func configureWindow(_ window: UIWindow, style: MacWindowStyle) {
self.window = window
self.windowStyle = style
// Wait for window to be fully initialized
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
self.applyWindowStyle(style)
}
// Observe window events
setupWindowObservers()
}
/// Switch between window styles at runtime
func setWindowStyle(_ style: MacWindowStyle) {
windowStyle = style
applyWindowStyle(style)
}
private func applyWindowStyle(_ style: MacWindowStyle) {
guard let window,
let _ = window.nsWindow
else {
logger.warning("Unable to access NSWindow - Dynamic framework not available")
return
}
// Dynamic functionality disabled for now
logger.info("Mac Catalyst window styling disabled - Dynamic framework not available")
}
// Dynamic framework methods removed - not available without proper package integration
private func setupWindowObservers() {
// Window observation disabled - Dynamic framework not available
logger.info("Window observation disabled - Dynamic framework not available")
}
deinit {
// No observers to clean up since Dynamic framework is not available
}
}
// MARK: - View Modifier
/// View modifier for applying Mac Catalyst window styles.
/// Configures window appearance when the view appears.
struct MacCatalystWindowStyle: ViewModifier {
let style: MacWindowStyle
@State private var windowManager = MacCatalystWindowManager.shared
func body(content: Content) -> some View {
content
.onAppear {
setupWindow()
}
}
private func setupWindow() {
guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let window = windowScene.windows.first
else {
return
}
windowManager.configureWindow(window, style: style)
}
}
// MARK: - View Extension
/// View extension for Mac Catalyst window configuration.
/// Enables views to configure window style on Mac Catalyst builds.
extension View {
/// Configure the Mac Catalyst window style
func macCatalystWindowStyle(_ style: MacWindowStyle) -> some View {
modifier(MacCatalystWindowStyle(style: style))
}
}
#endif