diff --git a/src/logic/Windows.swift b/src/logic/Windows.swift index 62d4484b..c1e99c04 100644 --- a/src/logic/Windows.swift +++ b/src/logic/Windows.swift @@ -240,24 +240,24 @@ class Windows { } } + /// Updates windows "lastFocusOrder" to ensure unique values based on window z-order. + /// Windows are ordered by their position in Spaces.windowsInSpaces() results, + /// with topmost windows first. static func sortByLevel() { - var windowLevelMap = [CGWindowID: Int]() - for (index, cgWindowId) in Spaces.windowsInSpaces([Spaces.currentSpaceId]).enumerated() { + var windowLevelMap = [CGWindowID?: Int]() + for (index, cgWindowId) in Spaces.windowsInSpaces(Spaces.visibleSpaces).enumerated() { windowLevelMap[cgWindowId] = index } - var sortedTuples = Windows.list - .filter { $0.cgWindowId != nil } - .map { (windowLevelMap[$0.cgWindowId!], $0) } - sortedTuples.sort(by: { - if $0.0 == nil { - return false + var orderForUnlistedWindows = Int.max + for window in list { + if let listedOrder = windowLevelMap[window.cgWindowId] { + window.lastFocusOrder = listedOrder + } else { + window.lastFocusOrder = orderForUnlistedWindows + orderForUnlistedWindows -= 1 } - if $1.0 == nil { - return true - } - return $0.0! < $1.0! - }) - Windows.list = sortedTuples.map { $0.1 } + } + list.sort { $0.lastFocusOrder < $1.lastFocusOrder } } static func refreshThumbnailsAsync(_ screen: NSScreen, _ currentIndex: Int) {