Wrap CursorOverrideRegion in canImport(AppKit) and provide a no-op View stub for iOS, which has no AppKit. The call site in SaveBarOverlay now compiles on both platforms. Add an explicit empty deinit to CollapsibleVSplitView.Coordinator to work around an EarlyPerfInliner crash in swift-frontend on Xcode 26.4 Release builds.
63 lines
1.6 KiB
Swift
63 lines
1.6 KiB
Swift
import SwiftUI
|
|
|
|
#if canImport(AppKit)
|
|
import AppKit
|
|
|
|
struct CursorOverrideRegion: NSViewRepresentable {
|
|
func makeNSView(context: Context) -> NSView {
|
|
CursorOverrideNSView()
|
|
}
|
|
|
|
func updateNSView(_ nsView: NSView, context: Context) {}
|
|
}
|
|
|
|
private final class CursorOverrideNSView: NSView {
|
|
private nonisolated(unsafe) var monitor: Any?
|
|
|
|
override func viewDidMoveToWindow() {
|
|
super.viewDidMoveToWindow()
|
|
if window != nil {
|
|
installMonitor()
|
|
} else {
|
|
uninstallMonitor()
|
|
}
|
|
}
|
|
|
|
deinit {
|
|
if let monitor {
|
|
NSEvent.removeMonitor(monitor)
|
|
}
|
|
}
|
|
|
|
private func installMonitor() {
|
|
guard monitor == nil else { return }
|
|
monitor = NSEvent.addLocalMonitorForEvents(matching: .mouseMoved) { [weak self] event in
|
|
guard let self,
|
|
let window = self.window,
|
|
event.window === window,
|
|
self.convert(self.bounds, to: nil).contains(event.locationInWindow)
|
|
else {
|
|
return event
|
|
}
|
|
NSCursor.arrow.set()
|
|
return nil
|
|
}
|
|
}
|
|
|
|
private func uninstallMonitor() {
|
|
if let monitor {
|
|
NSEvent.removeMonitor(monitor)
|
|
}
|
|
monitor = nil
|
|
}
|
|
|
|
override func hitTest(_ point: NSPoint) -> NSView? {
|
|
nil
|
|
}
|
|
}
|
|
#else
|
|
struct CursorOverrideRegion: View {
|
|
var body: some View { Color.clear }
|
|
}
|
|
#endif
|