feat: changed minimum macOS version to macOS 11.15 (Big Sur)

This commit is contained in:
Serhiy Mytrovtsiy
2026-02-22 15:52:36 +01:00
parent 20030a2a1c
commit 0f03dccc07
27 changed files with 99 additions and 219 deletions

View File

@@ -225,8 +225,6 @@ internal class DevicesReader: Reader<[BLEDevice]>, CBCentralManagerDelegate, CBP
// MARK: - system_profiler
private func profilerDevices() -> ([bleDevice], [String]) {
if #unavailable(macOS 11) { return ([], []) }
guard let res = process(path: "/usr/sbin/system_profiler", arguments: ["SPBluetoothDataType", "-json"]) else {
return ([], [])
}

View File

@@ -238,13 +238,11 @@ public class CPU: Module {
}
if self.systemWidgetsUpdatesState {
if #available(macOS 11.0, *) {
if isWidgetActive(self.userDefaults, [CPU_entry.kind, "UnitedWidget"]), let blobData = try? JSONEncoder().encode(value) {
self.userDefaults?.set(blobData, forKey: "CPU@LoadReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: CPU_entry.kind)
WidgetCenter.shared.reloadTimelines(ofKind: "UnitedWidget")
if isWidgetActive(self.userDefaults, [CPU_entry.kind, "UnitedWidget"]), let blobData = try? JSONEncoder().encode(value) {
self.userDefaults?.set(blobData, forKey: "CPU@LoadReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: CPU_entry.kind)
WidgetCenter.shared.reloadTimelines(ofKind: "UnitedWidget")
}
}
}

View File

@@ -24,7 +24,6 @@ public struct CPU_entry: TimelineEntry {
public var value: CPU_Load? = nil
}
@available(macOS 11.0, *)
public struct Provider: TimelineProvider {
public typealias Entry = CPU_entry

View File

@@ -277,11 +277,7 @@ private class CalendarView: NSStackView {
prev.bezelStyle = .regularSquare
prev.translatesAutoresizingMaskIntoConstraints = false
prev.imageScaling = .scaleNone
if #available(macOS 11.0, *) {
prev.image = iconFromSymbol(name: "arrow.left", scale: .medium)!
} else {
prev.title = "<"
}
prev.image = iconFromSymbol(name: "arrow.left", scale: .medium)
prev.contentTintColor = .labelColor
prev.isBordered = false
prev.action = #selector(self.prevMonth)
@@ -293,11 +289,7 @@ private class CalendarView: NSStackView {
next.bezelStyle = .regularSquare
next.translatesAutoresizingMaskIntoConstraints = false
next.imageScaling = .scaleNone
if #available(macOS 11.0, *) {
next.image = iconFromSymbol(name: "arrow.right", scale: .medium)!
} else {
next.title = ">"
}
next.image = iconFromSymbol(name: "arrow.right", scale: .medium)
next.contentTintColor = .labelColor
next.isBordered = false
next.action = #selector(self.nextMonth)
@@ -719,9 +711,7 @@ private class OrderTableView: NSView, NSTableViewDelegate, NSTableViewDataSource
self.tableView.registerForDraggedTypes([dragDropType])
self.tableView.gridColor = .gridColor
self.tableView.gridStyleMask = [.solidVerticalGridLineMask, .solidHorizontalGridLineMask]
if #available(macOS 11.0, *) {
self.tableView.style = .plain
}
self.tableView.style = .plain
let nameColumn = NSTableColumn(identifier: nameColumnID)
nameColumn.headerCell.title = localizedString("Name")

View File

@@ -83,9 +83,7 @@ internal class Settings: NSStackView, Settings_v, NSTableViewDelegate, NSTableVi
self.tableView.allowsColumnResizing = false
self.tableView.gridStyleMask = [.solidVerticalGridLineMask, .solidHorizontalGridLineMask]
self.tableView.usesAlternatingRowBackgroundColors = true
if #available(macOS 11.0, *) {
self.tableView.style = .plain
}
self.tableView.style = .plain
self.tableView.rowHeight = 32
let nameColumn = NSTableColumn(identifier: nameColumnID)
@@ -140,11 +138,7 @@ internal class Settings: NSStackView, Settings_v, NSTableViewDelegate, NSTableVi
btn.widthAnchor.constraint(equalToConstant: 27).isActive = true
btn.heightAnchor.constraint(equalToConstant: 27).isActive = true
btn.bezelStyle = .rounded
if #available(macOS 11.0, *) {
btn.image = iconFromSymbol(name: "plus", scale: .medium)
} else {
btn.title = localizedString("Add")
}
btn.image = iconFromSymbol(name: "plus", scale: .medium)
btn.action = #selector(self.addNewClock)
btn.target = self
btn.toolTip = localizedString("Add new clock")
@@ -156,11 +150,7 @@ internal class Settings: NSStackView, Settings_v, NSTableViewDelegate, NSTableVi
btn.widthAnchor.constraint(equalToConstant: 27).isActive = true
btn.heightAnchor.constraint(equalToConstant: 27).isActive = true
btn.bezelStyle = .rounded
if #available(macOS 11.0, *) {
btn.image = iconFromSymbol(name: "minus", scale: .medium)
} else {
btn.title = localizedString("Delete")
}
btn.image = iconFromSymbol(name: "minus", scale: .medium)
btn.action = #selector(self.deleteClock)
btn.target = self
btn.toolTip = localizedString("Delete selected clock")

View File

@@ -339,13 +339,11 @@ public class Disk: Module {
}
if self.systemWidgetsUpdatesState {
if #available(macOS 11.0, *) {
if isWidgetActive(self.userDefaults, [Disk_entry.kind, "UnitedWidget"]), let blobData = try? JSONEncoder().encode(d) {
self.userDefaults?.set(blobData, forKey: "Disk@CapacityReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: Disk_entry.kind)
WidgetCenter.shared.reloadTimelines(ofKind: "UnitedWidget")
if isWidgetActive(self.userDefaults, [Disk_entry.kind, "UnitedWidget"]), let blobData = try? JSONEncoder().encode(d) {
self.userDefaults?.set(blobData, forKey: "Disk@CapacityReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: Disk_entry.kind)
WidgetCenter.shared.reloadTimelines(ofKind: "UnitedWidget")
}
}

View File

@@ -24,7 +24,6 @@ public struct Disk_entry: TimelineEntry {
public var value: drive? = nil
}
@available(macOS 11.0, *)
public struct Provider: TimelineProvider {
public typealias Entry = Disk_entry

View File

@@ -194,13 +194,11 @@ public class GPU: Module {
}
if self.systemWidgetsUpdatesState {
if #available(macOS 11.0, *) {
if isWidgetActive(self.userDefaults, [GPU_entry.kind, "UnitedWidget"]), let blobData = try? JSONEncoder().encode(selectedGPU) {
self.userDefaults?.set(blobData, forKey: "GPU@InfoReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: GPU_entry.kind)
WidgetCenter.shared.reloadTimelines(ofKind: "UnitedWidget")
if isWidgetActive(self.userDefaults, [GPU_entry.kind, "UnitedWidget"]), let blobData = try? JSONEncoder().encode(selectedGPU) {
self.userDefaults?.set(blobData, forKey: "GPU@InfoReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: GPU_entry.kind)
WidgetCenter.shared.reloadTimelines(ofKind: "UnitedWidget")
}
}
}

View File

@@ -24,7 +24,6 @@ public struct GPU_entry: TimelineEntry {
public var value: GPU_Info? = nil
}
@available(macOS 11.0, *)
public struct Provider: TimelineProvider {
public typealias Entry = GPU_entry

View File

@@ -335,12 +335,10 @@ public class Network: Module {
}
if self.systemWidgetsUpdatesState {
if #available(macOS 11.0, *) {
if isWidgetActive(self.userDefaults, [Network_entry.kind]), let blobData = try? JSONEncoder().encode(raw) {
self.userDefaults?.set(blobData, forKey: "Network@UsageReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: Network_entry.kind)
if isWidgetActive(self.userDefaults, [Network_entry.kind]), let blobData = try? JSONEncoder().encode(raw) {
self.userDefaults?.set(blobData, forKey: "Network@UsageReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: Network_entry.kind)
}
}

View File

@@ -398,35 +398,25 @@ internal class UsageReader: Reader<Network_Usage>, CWEventDelegate {
}
if self.usage.wifiDetails.ssid == nil || self.usage.wifiDetails.ssid == "" {
if #available(macOS 15, *) {
guard let res = process(path: "/usr/sbin/system_profiler", arguments: ["SPAirPortDataType", "-json"]) else {
return
}
do {
if let json = try JSONSerialization.jsonObject(with: Data(res.utf8), options: []) as? [String: Any] {
if let arr = json["SPAirPortDataType"] as? [[String: Any]],
let airport = arr.first(where: { $0["spairport_airport_interfaces"] != nil }),
let interfaces = airport["spairport_airport_interfaces"] as? [[String: Any]],
let interface = interfaces.first(where: { $0["_name"] as? String == self.interfaceID }),
let obj = interface["spairport_current_network_information"] as? [String: Any] {
self.usage.wifiDetails.ssid = obj["_name"] as? String
self.usage.wifiDetails.countryCode = obj["spairport_network_country_code"] as? String
self.usage.wifiDetails.standard = obj["spairport_network_phymode"] as? String
}
}
} catch let err as NSError {
error("error to parse system_profiler SPAirPortDataType: \(err.localizedDescription)")
return
}
} else {
let networksetupResponse = syncShell("networksetup -getairportnetwork \(self.interfaceID)")
if networksetupResponse.split(separator: "\n").count == 1 {
let arr = networksetupResponse.split(separator: ":")
if let ssid = arr.last {
self.usage.wifiDetails.ssid = ssid.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
guard let res = process(path: "/usr/sbin/system_profiler", arguments: ["SPAirPortDataType", "-json"]) else {
return
}
do {
if let json = try JSONSerialization.jsonObject(with: Data(res.utf8), options: []) as? [String: Any] {
if let arr = json["SPAirPortDataType"] as? [[String: Any]],
let airport = arr.first(where: { $0["spairport_airport_interfaces"] != nil }),
let interfaces = airport["spairport_airport_interfaces"] as? [[String: Any]],
let interface = interfaces.first(where: { $0["_name"] as? String == self.interfaceID }),
let obj = interface["spairport_current_network_information"] as? [String: Any] {
self.usage.wifiDetails.ssid = obj["_name"] as? String
self.usage.wifiDetails.countryCode = obj["spairport_network_country_code"] as? String
self.usage.wifiDetails.standard = obj["spairport_network_phymode"] as? String
}
}
} catch let err as NSError {
error("error to parse system_profiler SPAirPortDataType: \(err.localizedDescription)")
return
}
}
}

View File

@@ -29,7 +29,6 @@ public struct Network_entry: TimelineEntry {
public var value: Network_Usage? = nil
}
@available(macOS 11.0, *)
public struct Provider: TimelineProvider {
public typealias Entry = Network_entry

View File

@@ -237,13 +237,11 @@ public class RAM: Module {
}
if self.systemWidgetsUpdatesState {
if #available(macOS 11.0, *) {
if isWidgetActive(self.userDefaults, [RAM_entry.kind, "UnitedWidget"]), let blobData = try? JSONEncoder().encode(value) {
self.userDefaults?.set(blobData, forKey: "RAM@UsageReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: RAM_entry.kind)
WidgetCenter.shared.reloadTimelines(ofKind: "UnitedWidget")
if isWidgetActive(self.userDefaults, [RAM_entry.kind, "UnitedWidget"]), let blobData = try? JSONEncoder().encode(value) {
self.userDefaults?.set(blobData, forKey: "RAM@UsageReader")
}
WidgetCenter.shared.reloadTimelines(ofKind: RAM_entry.kind)
WidgetCenter.shared.reloadTimelines(ofKind: "UnitedWidget")
}
}
}

View File

@@ -40,7 +40,6 @@ public struct RAM_entry: TimelineEntry {
public var value: RAM_Usage? = nil
}
@available(macOS 11.0, *)
public struct Provider: TimelineProvider {
public typealias Entry = RAM_entry

View File

@@ -1005,12 +1005,8 @@ private class ModeButtons: NSStackView {
var turboIcon: NSImage = NSImage(named: NSImage.Name("ac_unit"))!
var offIcon: NSImage = NSImage(named: NSImage.Name("ac_unit"))!
if #available(macOS 12.0, *) {
if let icon = iconFromSymbol(name: "snowflake", scale: .large) {
turboIcon = icon
}
if let icon = iconFromSymbol(name: "fanblades.slash", scale: .medium) {
offIcon = icon
}
turboIcon = iconFromSymbol(name: "snowflake", scale: .large)
offIcon = iconFromSymbol(name: "fanblades.slash", scale: .medium)
}
self.offBtn = NSButton(image: offIcon, target: nil, action: #selector(offMode))