Files
brov-macbook/NotchBuddy/Sources/App/WindowContextCapture.swift
T
2026-10-06 19:34:32 +03:00

69 lines
2.6 KiB
Swift

import AppKit
import ApplicationServices
// MARK: - Window context capture (M8)
enum WindowContextCapture {
/// Returns a PromptContext from the given app (typically the last app active before NotchBuddy).
/// Uses AXUIElement for window title (requires Accessibility permission).
/// Uses AppleScript for browser URL (Safari, Chrome, Arc, Firefox, Edge).
static func captureActive(from app: NSRunningApplication? = NSWorkspace.shared.frontmostApplication) -> PromptContext? {
#if APPSTORE
// App Store: no Accessibility API, no screen capture
return nil
#else
guard let app, let appName = app.localizedName else { return nil }
let pid = app.processIdentifier
let axApp = AXUIElementCreateApplication(pid)
// --- Window title ---
var title = ""
var windowRef: CFTypeRef?
if AXUIElementCopyAttributeValue(axApp, kAXFocusedWindowAttribute as CFString, &windowRef) == .success,
let windowRef {
// swiftlint:disable force_cast
let axWindow = windowRef as! AXUIElement
var titleRef: CFTypeRef?
if AXUIElementCopyAttributeValue(axWindow, kAXTitleAttribute as CFString, &titleRef) == .success,
let t = titleRef as? String {
title = t
}
}
// --- Browser URL ---
let url = browserURL(for: app)
return .window(appName: appName, title: title, url: url)
#endif
}
// MARK: - Private
private static let browserScripts: [String: String] = [
"com.apple.Safari":
"tell application \"Safari\" to return URL of current tab of front window",
"com.google.Chrome":
"tell application \"Google Chrome\" to return URL of active tab of front window",
"company.thebrowser.Browser":
"tell application \"Arc\" to return URL of active tab of front window",
"org.mozilla.firefox":
"tell application \"Firefox\" to return URL of active tab of front window",
"com.microsoft.edgemac":
"tell application \"Microsoft Edge\" to return URL of active tab of front window",
]
private static func browserURL(for app: NSRunningApplication) -> String? {
#if APPSTORE
return nil // No AppleScript in App Store sandbox
#else
guard let bundleId = app.bundleIdentifier,
let script = browserScripts[bundleId] else { return nil }
var error: NSDictionary?
let result = NSAppleScript(source: script)?.executeAndReturnError(&error)
return error == nil ? result?.stringValue : nil
#endif
}
}