diff --git a/alt-tab-macos/api-wrappers/AXUIElement.swift b/alt-tab-macos/api-wrappers/AXUIElement.swift index ba65ac22..86f687f1 100644 --- a/alt-tab-macos/api-wrappers/AXUIElement.swift +++ b/alt-tab-macos/api-wrappers/AXUIElement.swift @@ -8,6 +8,7 @@ enum AXAttributeKey: String { case windows = "AXWindows" case minimized = "AXMinimized" case focusedWindow = "AXFocusedWindow" + case subrole = "AXSubrole" } extension AXUIElement { @@ -39,6 +40,11 @@ extension AXUIElement { return attribute(.focusedWindow, AXUIElement.self) } + func isActualWindow() -> Bool { + let subrole = self.attribute(.subrole, String.self) + return subrole != nil && subrole != "AXUnknown" + } + func windows() -> [AXUIElement]? { return attribute(.windows, [AXUIElement].self) } diff --git a/alt-tab-macos/logic/TrackedWindows.swift b/alt-tab-macos/logic/TrackedWindows.swift index 6d5f8af9..aa0db332 100644 --- a/alt-tab-macos/logic/TrackedWindows.swift +++ b/alt-tab-macos/logic/TrackedWindows.swift @@ -45,7 +45,7 @@ class TrackedWindows { Spaces.windowsInSpaces(spaces.map { $0.0 }).enumerated().forEach { windowSpaceMap[$0.element]!.2 = $0.offset } - return windowSpaceMap as! [CGWindowID : (CGSSpaceID, SpaceIndex, WindowRank)] + return windowSpaceMap as! [CGWindowID: (CGSSpaceID, SpaceIndex, WindowRank)] } private static func sortList() { @@ -69,15 +69,18 @@ class TrackedWindows { continue } let (spaceId, spaceIndex, rank) = windowsMap[cgId] ?? (nil, nil, nil) - if let axWindow = cgId.AXUIElement(ownerPid) { + if let axWindow = cgId.AXUIElement(ownerPid), axWindow.isActualWindow() { + // window is in the current space if spaceId != nil { list.append(TrackedWindow(cgWindow, cgId, ownerPid, false, axWindow, spaceId, spaceIndex, rank)) - } else if axWindow.isMinimized() { - list.append(TrackedWindow(cgWindow, cgId, ownerPid, true, axWindow, spaceId, spaceIndex, rank)) } - } else { - // window is on another space - guard spaceId != nil else { continue } + // window is minimized + else if axWindow.isMinimized() { + list.append(TrackedWindow(cgWindow, cgId, ownerPid, true, axWindow, nil, nil, rank)) + } + } + // window is on another space + else if spaceId != nil && spaceId != Spaces.currentSpaceId { list.append(TrackedWindow(cgWindow, cgId, ownerPid, false, nil, spaceId, spaceIndex, rank)) } }