diff --git a/Clawd/ScreenContext.swift b/Clawd/ScreenContext.swift index 51af0d9..0d95f5a 100644 --- a/Clawd/ScreenContext.swift +++ b/Clawd/ScreenContext.swift @@ -21,7 +21,13 @@ class ScreenContext { } static var hasPermission: Bool { - CGPreflightScreenCaptureAccess() + if CGPreflightScreenCaptureAccess() { return true } + // CGPreflightScreenCaptureAccess returns false on macOS 26 even when + // permission is granted. Fall back to attempting a 1x1 capture. + return CGWindowListCreateImage( + CGRect(x: 0, y: 0, width: 1, height: 1), + .optionOnScreenOnly, kCGNullWindowID, [] + ) != nil } static func requestPermission() { @@ -62,7 +68,10 @@ class ScreenContext { guard let wid = info[numKey] as? CGWindowID, !ownWindowIDs.contains(wid) else { return nil } return wid } + // CGImage(windowListFromArrayScreenBounds:) returns nil on macOS 26. + // Fall back to CGWindowListCreateImage which still works. cgImage = CGImage(windowListFromArrayScreenBounds: CGRect.null, windowArray: filtered as CFArray, imageOption: .bestResolution) + ?? CGWindowListCreateImage(.null, .optionOnScreenOnly, kCGNullWindowID, [.bestResolution]) } else { cgImage = CGWindowListCreateImage( CGRect.null, diff --git a/Package.swift b/Package.swift index f93322c..af346d8 100644 --- a/Package.swift +++ b/Package.swift @@ -22,6 +22,7 @@ let package = Package( ], swiftSettings: [ .unsafeFlags(["-parse-as-library"]), + .unsafeFlags(["-Xfrontend", "-disable-availability-checking"]), ], linkerSettings: [ .unsafeFlags(["-Xlinker", "-sectcreate", "-Xlinker", "__TEXT", "-Xlinker", "__info_plist", "-Xlinker", "Clawd/Info.plist"]),