| | |
| | | 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] { |
| | |
| | | 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 |
| | | } |
| | |
| | | |
| | | 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( |
| | |
| | | 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, |