From cb67d8b2fa9b9c9d30cd81d72b8737ee2baa44b6 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Fri, 19 Jun 2026 14:09:49 +0800
Subject: [PATCH] Fix vertical keyboard window focus

---
 C1.source/Sources/AlignerCore/Windows/FinderTabSpaceAttributionPolicy.swift |   32 ++++++++++++++++++++++++++++++--
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/C1.source/Sources/AlignerCore/Windows/FinderTabSpaceAttributionPolicy.swift b/C1.source/Sources/AlignerCore/Windows/FinderTabSpaceAttributionPolicy.swift
index 0de281d..9c40e17 100644
--- a/C1.source/Sources/AlignerCore/Windows/FinderTabSpaceAttributionPolicy.swift
+++ b/C1.source/Sources/AlignerCore/Windows/FinderTabSpaceAttributionPolicy.swift
@@ -4,6 +4,7 @@
 public enum FinderTabSpaceAttributionPolicy {
     private static let finderBundleIdentifier = "com.apple.finder"
     private static let minimumOverlapRatio: CGFloat = 0.85
+    private static let minimumSizeSimilarityRatio: CGFloat = 0.80
     private static let minimumBestScoreGap: CGFloat = 0.05
 
     public static func attributedRecords(_ records: [WindowEnumerationRecord]) -> [WindowEnumerationRecord] {
@@ -52,8 +53,7 @@
             sameProcess(candidate, host)
         }
         let scoredHosts = compatibleHosts.compactMap { host -> (record: WindowEnumerationRecord, score: CGFloat)? in
-            guard let score = overlapScore(candidate.frame, host.frame),
-                  score >= minimumOverlapRatio
+            guard let score = frameCompatibilityScore(candidate.frame, host.frame)
             else {
                 return nil
             }
@@ -79,6 +79,18 @@
 
         let secondBest = scoredHosts[1]
         return best.score - secondBest.score >= minimumBestScoreGap ? best.record : nil
+    }
+
+    private static func frameCompatibilityScore(_ lhs: CGRect?, _ rhs: CGRect?) -> CGFloat? {
+        guard let overlap = overlapScore(lhs, rhs),
+              overlap >= minimumOverlapRatio,
+              let sizeSimilarity = sizeSimilarityScore(lhs, rhs),
+              sizeSimilarity >= minimumSizeSimilarityRatio
+        else {
+            return nil
+        }
+
+        return min(overlap, sizeSimilarity)
     }
 
     private static func sameProcess(
@@ -115,6 +127,22 @@
         return (intersection.width * intersection.height) / denominator
     }
 
+    private static func sizeSimilarityScore(_ lhs: CGRect?, _ rhs: CGRect?) -> CGFloat? {
+        guard let lhs,
+              let rhs,
+              lhs.width > 0,
+              lhs.height > 0,
+              rhs.width > 0,
+              rhs.height > 0
+        else {
+            return nil
+        }
+
+        let widthSimilarity = min(lhs.width, rhs.width) / max(lhs.width, rhs.width)
+        let heightSimilarity = min(lhs.height, rhs.height) / max(lhs.height, rhs.height)
+        return min(widthSimilarity, heightSimilarity)
+    }
+
     private static func copy(
         _ record: WindowEnumerationRecord,
         isFullscreen: Bool,

--
Gitblit v1.9.3