import AppKit @MainActorenum MenuBarStatusItemPlacementPreflight { static let preferredPositionPrefix = "NSStatusItem Preferred Position " static let suspiciousPreferredPositionPadding: Double = 512 static func preferredPositionKey(autosaveName: String) -> String { "\(self.preferredPositionPrefix)\(autosaveName)" } @discardableResult static func prepare( defaults: UserDefaults, autosaveName: String, legacyDefaultItemIndex: Int? = nil, maximumPreferredPosition: Double? = currentMaximumPreferredPosition()) -> Bool { let key = self.preferredPositionKey(autosaveName: autosaveName) var repaired = self.clearPreferredPositionIfNeeded( defaults: defaults, key: key, maximumPreferredPosition: maximumPreferredPosition) if let legacyDefaultItemIndex { let legacyKey = self.preferredPositionKey(autosaveName: "Item-\(legacyDefaultItemIndex)") repaired = self.clearPreferredPositionIfNeeded( defaults: defaults, key: legacyKey, maximumPreferredPosition: maximumPreferredPosition) || repaired } return repaired } static func shouldClearPreferredPosition(_ value: Any, maximumPreferredPosition: Double?) -> Bool { guard let number = value as? NSNumber else { return true } let position = number.doubleValue if position <= 0 { return true } guard let maximumPreferredPosition else { return false } return position > maximumPreferredPosition + self.suspiciousPreferredPositionPadding } private static func clearPreferredPositionIfNeeded( defaults: UserDefaults, key: String, maximumPreferredPosition: Double?) -> Bool { guard let value = defaults.object(forKey: key), self.shouldClearPreferredPosition(value, maximumPreferredPosition: maximumPreferredPosition) else { return false } defaults.removeObject(forKey: key) return true } private static func currentMaximumPreferredPosition() -> Double? { NSScreen.screens.map { Double($0.frame.maxX) }.max() }}
import AppKit
@MainActor
enum MenuBarStatusItemPlacementPreflight {
static let preferredPositionPrefix = "NSStatusItem Preferred Position "
static let suspiciousPreferredPositionPadding: Double = 512
static func preferredPositionKey(autosaveName: String) -> String {
"\(self.preferredPositionPrefix)\(autosaveName)"
}
@discardableResult
static func prepare(
defaults: UserDefaults,
autosaveName: String,
legacyDefaultItemIndex: Int? = nil,
maximumPreferredPosition: Double? = currentMaximumPreferredPosition())
-> Bool
{
let key = self.preferredPositionKey(autosaveName: autosaveName)
var repaired = self.clearPreferredPositionIfNeeded(
defaults: defaults,
key: key,
maximumPreferredPosition: maximumPreferredPosition)
if let legacyDefaultItemIndex {
let legacyKey = self.preferredPositionKey(autosaveName: "Item-\(legacyDefaultItemIndex)")
repaired = self.clearPreferredPositionIfNeeded(
defaults: defaults,
key: legacyKey,
maximumPreferredPosition: maximumPreferredPosition) || repaired
}
return repaired
}
static func shouldClearPreferredPosition(_ value: Any, maximumPreferredPosition: Double?) -> Bool {
guard let number = value as? NSNumber else { return true }
let position = number.doubleValue
if position <= 0 {
return true
}
guard let maximumPreferredPosition else { return false }
return position > maximumPreferredPosition + self.suspiciousPreferredPositionPadding
}
private static func clearPreferredPositionIfNeeded(
defaults: UserDefaults,
key: String,
maximumPreferredPosition: Double?)
-> Bool
{
guard let value = defaults.object(forKey: key),
self.shouldClearPreferredPosition(value, maximumPreferredPosition: maximumPreferredPosition)
else { return false }
defaults.removeObject(forKey: key)
return true
}
private static func currentMaximumPreferredPosition() -> Double? {
NSScreen.screens.map { Double($0.frame.maxX) }.max()
}
}