aerospace fork
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869import AppKitimport Common
struct ListWindowsCommand: Command { let args: ListWindowsCmdArgs /*conforms*/ let shouldResetClosedWindowsCache = false
func run(_ env: CmdEnv, _ io: CmdIo) async -> BinaryExitCode { let focus = focus var windows: [Window] = []
if args.filteringOptions.focused { switch focus.windowOrNil { case let window?: windows = [window] case nil: return .fail(io.err(noWindowIsFocused)) } } else { var workspaces: Set<Workspace> = args.filteringOptions.workspaces.isEmpty ? Workspace.all.toSet() : args.filteringOptions.workspaces .flatMap { filter in switch filter { case .focused: [focus.workspace] case .visible: Workspace.all.filter(\.isVisible) case .name(let name): [Workspace.get(byName: name.raw)] } } .toSet() if !args.filteringOptions.monitors.isEmpty { let monitors: Set<CGPoint> = args.filteringOptions.monitors.resolveMonitors(io) if monitors.isEmpty { return .fail } workspaces = workspaces.filter { monitors.contains($0.workspaceMonitor.rect.topLeftCorner) } } windows = workspaces.flatMap(\.allLeafWindowsRecursive) if let pid = args.filteringOptions.pidFilter { windows = windows.filter { $0.app.pid == pid } } if let appId = args.filteringOptions.appIdFilter { windows = windows.filter { $0.app.rawAppBundleId == appId } } }
if args.outputOnlyCount { return .succ(io.out("\(windows.count)")) } else { var _list: [WindowWithPrefetchedTitle] = [] // todo cleanup for window in windows { guard let window = try? await WindowWithPrefetchedTitle.resolveWindow(window, for: args.format, .nonCancellable) else { return .fail(io.err(bugPrompt())) } _list.append(window) } _list = _list.filter { $0.window.isBound } _list = _list.sortedBy([{ $0.window.app.name ?? "" }, { $0.title ?? "" }])
let list = _list.map { AeroObj.window($0) } if args.json { return switch list.formatToJson(args.format, ignoreRightPaddingVar: args._format.isEmpty) { case .success(let json): .succ(io.out(json)) case .failure(let msg): .fail(io.err(msg)) } } else { return switch list.format(args.format) { case .success(let lines): .succ(io.out(lines)) case .failure(let msg): .fail(io.err(msg.map(\.description).joinErrors())) } } } }}