From 946b8a4b2fd68582de9ec41a0abe7f2bb7049063 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Tue, 26 Apr 2022 07:36:31 +0200 Subject: [PATCH] fix: prevented asking for root when closing the app. It was a bug in the Sensors module that tries to reset the fan mode to the automatic. Now it will check if any of the fan mode was changed. --- Kit/helpers.swift | 2 +- Modules/Sensors/main.swift | 10 ++++++-- Modules/Sensors/popup.swift | 46 +++++++----------------------------- Modules/Sensors/values.swift | 32 +++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 41 deletions(-) diff --git a/Kit/helpers.swift b/Kit/helpers.swift index 07372e0a..c9e104cc 100644 --- a/Kit/helpers.swift +++ b/Kit/helpers.swift @@ -963,7 +963,7 @@ public class SMCHelper { _ = syncShell("\(self.smc) fan -id \(id) -m \(mode)") } - private func checkRights() -> Bool { + public func checkRights() -> Bool { do { let attributes = try FileManager.default.attributesOfItem(atPath: self.smc) guard let owner = attributes[FileAttributeKey(rawValue: "NSFileOwnerAccountName")] as? String, diff --git a/Modules/Sensors/main.swift b/Modules/Sensors/main.swift index 363aa6b4..c9fb417c 100644 --- a/Modules/Sensors/main.swift +++ b/Modules/Sensors/main.swift @@ -52,9 +52,15 @@ public class Sensors: Module { } public override func willTerminate() { + if !SMCHelper.shared.checkRights() { + return + } + self.sensorsReader.list.filter({ $0 is Fan }).forEach { (s: Sensor_p) in - if let f = s as? Fan { - SMCHelper.shared.setFanMode(f.id, mode: FanMode.automatic.rawValue) + if let f = s as? Fan, let mode = f.customMode { + if mode != .automatic { + SMCHelper.shared.setFanMode(f.id, mode: FanMode.automatic.rawValue) + } } } } diff --git a/Modules/Sensors/popup.swift b/Modules/Sensors/popup.swift index 42cb63f4..e671c492 100644 --- a/Modules/Sensors/popup.swift +++ b/Modules/Sensors/popup.swift @@ -311,39 +311,9 @@ internal class FanView: NSStackView { return Store.shared.bool(key: "Sensors_speed", defaultValue: false) } } - private var speedValue: Int? { - get { - if !Store.shared.exist(key: "fan_\(self.fan.id)_speed") { - return nil - } - return Store.shared.int(key: "fan_\(self.fan.id)_speed", defaultValue: Int(self.fan.minSpeed)) - } - set { - if let value = newValue { - Store.shared.set(key: "fan_\(self.fan.id)_speed", value: value) - } else { - Store.shared.remove("fan_\(self.fan.id)_speed") - } - } - } - private var fanMode: Int? { - get { - if !Store.shared.exist(key: "fan_\(self.fan.id)_mode") { - return nil - } - return Store.shared.int(key: "fan_\(self.fan.id)_mode", defaultValue: FanMode.automatic.rawValue) - } - set { - if let value = newValue { - Store.shared.set(key: "fan_\(self.fan.id)_mode", value: value) - } else { - Store.shared.remove("fan_\(self.fan.id)_mode") - } - } - } private var speed: Double { get { - if let v = self.speedValue, self.speedState { + if let v = self.fan.customSpeed, self.speedState { return Double(v) } return self.fan.value @@ -388,9 +358,9 @@ internal class FanView: NSStackView { NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(self.wakeListener), name: NSWorkspace.didWakeNotification, object: nil) - if let fanMode = self.fanMode, self.speedState && fanMode != FanMode.automatic.rawValue { - SMCHelper.shared.setFanMode(fan.id, mode: fanMode) - self.modeButtons?.setMode(FanMode(rawValue: fanMode) ?? .automatic) + if let fanMode = self.fan.customMode, self.speedState && fanMode != FanMode.automatic { + SMCHelper.shared.setFanMode(fan.id, mode: fanMode.rawValue) + self.modeButtons?.setMode(FanMode(rawValue: fanMode.rawValue) ?? .automatic) self.setSpeed(value: Int(self.speed), then: { DispatchQueue.main.async { @@ -459,7 +429,7 @@ internal class FanView: NSStackView { buttons.callback = { [weak self] (mode: FanMode) in if let fan = self?.fan, fan.mode != mode { self?.fan.mode = mode - self?.fanMode = mode.rawValue + self?.fan.customMode = mode SMCHelper.shared.setFanMode(fan.id, mode: mode.rawValue) } self?.toggleControlView(mode == .forced) @@ -471,7 +441,7 @@ internal class FanView: NSStackView { SMCHelper.shared.setFanMode(fan.id, mode: FanMode.forced.rawValue) } SMCHelper.shared.setFanSpeed(fan.id, speed: Int(fan.maxSpeed)) - self?.speedValue = Int(fan.maxSpeed) + self?.fan.customSpeed = Int(fan.maxSpeed) } self?.toggleControlView(false) } @@ -580,7 +550,7 @@ internal class FanView: NSStackView { private func setSpeed(value: Int, then: @escaping () -> Void = {}) { self.sliderValueField?.stringValue = "\(value) RPM" self.sliderValueField?.textColor = .secondaryLabelColor - self.speedValue = value + self.fan.customSpeed = value self.debouncer?.cancel() @@ -624,7 +594,7 @@ internal class FanView: NSStackView { @objc private func wakeListener(aNotification: NSNotification) { self.resetModeAfterSleep = true - if let value = self.speedValue, self.fan.mode != .automatic { + if let value = self.fan.customSpeed, self.fan.mode != .automatic { self.setSpeed(value: value) } } diff --git a/Modules/Sensors/values.swift b/Modules/Sensors/values.swift index 131702d6..13a1bf92 100644 --- a/Modules/Sensors/values.swift +++ b/Modules/Sensors/values.swift @@ -163,6 +163,38 @@ internal struct Fan: Sensor_p { return Store.shared.bool(key: "sensor_\(self.key)", defaultValue: false) } } + + var customSpeed: Int? { + get { + if !Store.shared.exist(key: "fan_\(self.id)_speed") { + return nil + } + return Store.shared.int(key: "fan_\(self.id)_speed", defaultValue: Int(self.minSpeed)) + } + set { + if let value = newValue { + Store.shared.set(key: "fan_\(self.id)_speed", value: value) + } else { + Store.shared.remove("fan_\(self.id)_speed") + } + } + } + var customMode: FanMode? { + get { + if !Store.shared.exist(key: "fan_\(self.id)_mode") { + return nil + } + let value = Store.shared.int(key: "fan_\(self.id)_mode", defaultValue: FanMode.automatic.rawValue) + return FanMode(rawValue: value) + } + set { + if let value = newValue { + Store.shared.set(key: "fan_\(self.id)_mode", value: value.rawValue) + } else { + Store.shared.remove("fan_\(self.id)_mode") + } + } + } } // List of keys: https://github.com/acidanthera/VirtualSMC/blob/master/Docs/SMCSensorKeys.txt