From cffeca8356f7e7f1b0e0c583be5aa4b32a4e3ac4 Mon Sep 17 00:00:00 2001 From: Christoffer Winterkvist Date: Thu, 11 Jul 2024 22:56:36 +0200 Subject: [PATCH 1/2] refactor: update window focus logic for consistency Update `SystemWindowRelativeFocus*` to use `systemWindows` for sorting and filtering. Ensure all window comparisons are done using the nested `window.rect` properties. Add additional checks in loops for better accuracy in determining next window. This enhances consistency and accuracy in window navigation. --- .../SystemWindowRelativeFocusDown.swift | 27 ++++++++++---- .../SystemWindowRelativeFocusLeft.swift | 35 +++++++++++++------ .../SystemWindowRelativeFocusRight.swift | 23 ++++++------ .../SystemWindowRelativeFocusUp.swift | 29 +++++++++++---- 4 files changed, 81 insertions(+), 33 deletions(-) diff --git a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusDown.swift b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusDown.swift index a01eff27..af3cb2f8 100644 --- a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusDown.swift +++ b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusDown.swift @@ -3,17 +3,32 @@ import Windows enum SystemWindowRelativeFocusDown { static func findNextWindow(_ currentWindow: WindowModel, windows: [WindowModel]) -> WindowModel? { - let sortedWindows = windows.sorted { $0.rect.origin.y < $1.rect.origin.y } + let sortedWindows = windows.systemWindows.sorted { + $0.index < $1.index && + $0.window.rect.origin.y < $1.window.rect.origin.y + } - let intersectingWindows = sortedWindows.filter { window in + let intersectingWindows = sortedWindows.filter { systemWindow in let currentMinX = currentWindow.rect.origin.x let currentMaxX = currentWindow.rect.maxX - let windowMinX = window.rect.origin.x - let windowMaxX = window.rect.maxX - return window.rect.origin.y > currentWindow.rect.origin.y + let windowMinX = systemWindow.window.rect.origin.x + let windowMaxX = systemWindow.window.rect.maxX + return systemWindow.window.rect.origin.y > currentWindow.rect.origin.y && windowMinX <= currentMaxX && windowMaxX >= currentMinX } - return intersectingWindows.first + for systemWindow in intersectingWindows { + if systemWindow.window.rect.origin.y >= currentWindow.rect.origin.y { + return systemWindow.window + } + } + + for systemWindow in sortedWindows { + if systemWindow.window.rect.origin.y >= currentWindow.rect.origin.y { + return systemWindow.window + } + } + + return nil } } diff --git a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusLeft.swift b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusLeft.swift index d9155e4f..f3939e57 100644 --- a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusLeft.swift +++ b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusLeft.swift @@ -3,28 +3,43 @@ import Windows enum SystemWindowRelativeFocusLeft { static func findNextWindow(_ currentWindow: WindowModel, windows: [WindowModel]) -> WindowModel? { - let sortedWindows = windows.sorted { $0.rect.origin.x > $1.rect.origin.x } + let sortedWindows = windows.systemWindows.sorted { + $0.index < $1.index && + $0.window.rect.origin.x > $1.window.rect.origin.x + } - let intersectingWindows = sortedWindows.filter { window in + let intersectingWindows = sortedWindows.filter { model in let currentMinY = currentWindow.rect.origin.y let currentMaxY = currentWindow.rect.origin.y + currentWindow.rect.size.height - let windowMinY = window.rect.origin.y - let windowMaxY = window.rect.origin.y + window.rect.size.height + let windowMinY = model.window.rect.origin.y + let windowMaxY = model.window.rect.origin.y + model.window.rect.size.height return windowMinY < currentMaxY && windowMaxY > currentMinY } - for window in intersectingWindows { - if window.rect.origin.x <= currentWindow.rect.origin.x { - return window + for systemWindow in intersectingWindows { + if systemWindow.window.rect.origin.x <= currentWindow.rect.origin.x { + return systemWindow.window } } - for window in sortedWindows { - if window.rect.origin.x <= currentWindow.rect.origin.x { - return window + for systemWindow in sortedWindows { + if systemWindow.window.rect.origin.x <= currentWindow.rect.origin.x { + return systemWindow.window } } return nil } } + +struct SystemWindowModel: Hashable, Sendable { + let window: WindowModel + let index: Int +} + +extension Array { + var systemWindows: [SystemWindowModel] { enumerated().reduce(into: [], { result, entry in + result.append(SystemWindowModel(window: entry.element, index: entry.offset)) + }) + } +} diff --git a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusRight.swift b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusRight.swift index ef977d5c..e57ed16f 100644 --- a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusRight.swift +++ b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusRight.swift @@ -3,25 +3,28 @@ import Windows enum SystemWindowRelativeFocusRight { static func findNextWindow(_ currentWindow: WindowModel, windows: [WindowModel]) -> WindowModel? { - let sortedWindows = windows.sorted { $0.rect.origin.x < $1.rect.origin.x } + let sortedWindows = windows.systemWindows.sorted { + $0.index < $1.index && + $0.window.rect.origin.x > $1.window.rect.origin.x + } - let intersectingWindows = sortedWindows.filter { window in + let intersectingWindows = sortedWindows.filter { systemWindow in let currentMinY = currentWindow.rect.origin.y let currentMaxY = currentWindow.rect.origin.y + currentWindow.rect.size.height - let windowMinY = window.rect.origin.y - let windowMaxY = window.rect.origin.y + window.rect.size.height + let windowMinY = systemWindow.window.rect.origin.y + let windowMaxY = systemWindow.window.rect.origin.y + systemWindow.window.rect.size.height return windowMinY < currentMaxY && windowMaxY > currentMinY } - for window in intersectingWindows { - if window.rect.origin.x >= currentWindow.rect.origin.x { - return window + for systemWindow in intersectingWindows { + if systemWindow.window.rect.origin.x >= currentWindow.rect.origin.x { + return systemWindow.window } } - for window in sortedWindows { - if window.rect.origin.x >= currentWindow.rect.origin.x { - return window + for systemWindow in sortedWindows { + if systemWindow.window.rect.origin.x >= currentWindow.rect.origin.x { + return systemWindow.window } } diff --git a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift index 39cfce67..bb3610b2 100644 --- a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift +++ b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift @@ -3,17 +3,32 @@ import Windows enum SystemWindowRelativeFocusUp { static func findNextWindow(_ currentWindow: WindowModel, windows: [WindowModel]) -> WindowModel? { - let sortedWindows = windows.sorted { $0.rect.origin.y > $1.rect.origin.y } - - let intersectingWindows = sortedWindows.filter { window in + let sortedWindows = windows.systemWindows.sorted { + $0.index < $1.index && + $0.window.rect.origin.x > $1.window.rect.origin.x && + $0.window.rect.origin.y > $1.window.rect.origin.y + } + let intersectingWindows = sortedWindows.filter { systemWindow in let currentMinX = currentWindow.rect.origin.x let currentMaxX = currentWindow.rect.maxX - let windowMinX = window.rect.origin.x - let windowMaxX = window.rect.maxX - return window.rect.origin.y < currentWindow.rect.origin.y + let windowMinX = systemWindow.window.rect.origin.x + let windowMaxX = systemWindow.window.rect.maxX + return systemWindow.window.rect.origin.y < currentWindow.rect.origin.y && windowMinX <= currentMaxX && windowMaxX >= currentMinX } - return intersectingWindows.first + for systemWindow in intersectingWindows { + if systemWindow.window.rect.origin.y <= currentWindow.rect.origin.y { + return systemWindow.window + } + } + + for systemWindow in sortedWindows { + if systemWindow.window.rect.origin.y <= currentWindow.rect.origin.y { + return systemWindow.window + } + } + + return nil } } From 75efa48d6fbc6c8891b884210417823f3fc805b5 Mon Sep 17 00:00:00 2001 From: Christoffer Winterkvist Date: Fri, 12 Jul 2024 08:33:26 +0200 Subject: [PATCH 2/2] fix: return correct window in relative focus functions Update SystemWindowRelativeFocus methods to return `currentWindow` instead of `nil`. This ensures that the current window is correctly returned when the focus shift functions are called. --- .../SystemWindowRelativeFocusDown.swift | 2 +- .../SystemWindowRelativeFocusLeft.swift | 2 +- .../SystemWindowRelativeFocusRight.swift | 2 +- .../SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusDown.swift b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusDown.swift index af3cb2f8..c9033b28 100644 --- a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusDown.swift +++ b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusDown.swift @@ -29,6 +29,6 @@ enum SystemWindowRelativeFocusDown { } } - return nil + return currentWindow } } diff --git a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusLeft.swift b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusLeft.swift index f3939e57..bd28df99 100644 --- a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusLeft.swift +++ b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusLeft.swift @@ -28,7 +28,7 @@ enum SystemWindowRelativeFocusLeft { } } - return nil + return currentWindow } } diff --git a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusRight.swift b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusRight.swift index e57ed16f..9f6c9a5d 100644 --- a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusRight.swift +++ b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusRight.swift @@ -28,6 +28,6 @@ enum SystemWindowRelativeFocusRight { } } - return nil + return currentWindow } } diff --git a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift index bb3610b2..151ad6f0 100644 --- a/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift +++ b/App/Sources/Core/Runners/System/SystemWindowRelativeFocus/SystemWindowRelativeFocusUp.swift @@ -29,6 +29,6 @@ enum SystemWindowRelativeFocusUp { } } - return nil + return currentWindow } }