mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
fix bug when readers work in disabled modules
This commit is contained in:
@@ -25,19 +25,19 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
NSApp.terminate(nil)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
menuBarButton.action = #selector(toggleMenu)
|
||||
popover.contentViewController = MainViewController.Init()
|
||||
popover.behavior = .transient
|
||||
popover.animates = true
|
||||
|
||||
|
||||
menuBar = MenuBar(menuBarItem, menuBarButton: menuBarButton)
|
||||
menuBar!.build()
|
||||
|
||||
if self.defaults.object(forKey: "runAtLoginInitialized") == nil {
|
||||
LaunchAtLogin.isEnabled = true
|
||||
}
|
||||
|
||||
|
||||
if defaults.object(forKey: "dockIcon") != nil {
|
||||
let dockIconStatus = defaults.bool(forKey: "dockIcon") ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory
|
||||
NSApp.setActivationPolicy(dockIconStatus)
|
||||
@@ -85,7 +85,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func applicationWillResignActive(_ notification: Notification) {
|
||||
popover.performClose(self)
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ class Battery: Module {
|
||||
self.timeView = Observable(defaults.object(forKey: "\(self.name)_time") != nil ? defaults.bool(forKey: "\(self.name)_time") : false)
|
||||
self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Battery
|
||||
self.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 3
|
||||
self.reader.updateInterval << self.updateInterval
|
||||
self.reader.setInterval(value: self.updateInterval)
|
||||
}
|
||||
|
||||
func start() {
|
||||
@@ -209,7 +209,7 @@ class Battery: Module {
|
||||
sender.state = NSControl.StateValue.on
|
||||
self.updateInterval = interval
|
||||
self.defaults.set(interval, forKey: "\(name)_interval")
|
||||
self.reader.updateInterval << interval
|
||||
self.reader.setInterval(value: interval)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,10 +30,11 @@ struct BatteryUsage {
|
||||
|
||||
class BatteryReader: Reader {
|
||||
public var value: Observable<[Double]>!
|
||||
public var updateInterval: Observable<Int> = Observable(0)
|
||||
public var usage: Observable<BatteryUsage> = Observable(BatteryUsage())
|
||||
public var updateTimer: Timer!
|
||||
public var updateAdditionalTimer: Timer!
|
||||
public var availableAdditional: Bool = false
|
||||
public var updateInterval: Int = 0
|
||||
|
||||
private var service: io_connect_t = 0
|
||||
private var internalChecked: Bool = false
|
||||
@@ -53,9 +54,9 @@ class BatteryReader: Reader {
|
||||
|
||||
init() {
|
||||
self.value = Observable([])
|
||||
self.updateInterval.subscribe(observer: self) { (value, _) in
|
||||
self.stop()
|
||||
self.start()
|
||||
|
||||
if self.available {
|
||||
self.read()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +67,7 @@ class BatteryReader: Reader {
|
||||
if updateTimer != nil {
|
||||
return
|
||||
}
|
||||
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(read), userInfo: nil, repeats: true)
|
||||
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval), target: self, selector: #selector(read), userInfo: nil, repeats: true)
|
||||
}
|
||||
|
||||
func stop() {
|
||||
@@ -180,4 +181,20 @@ class BatteryReader: Reader {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func setInterval(value: Int) {
|
||||
if value == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
self.updateInterval = value
|
||||
if self.updateTimer != nil {
|
||||
self.stop()
|
||||
self.start()
|
||||
}
|
||||
if self.updateAdditionalTimer != nil {
|
||||
self.stopAdditional()
|
||||
self.startAdditional()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,11 +35,15 @@ class CPU: Module {
|
||||
self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini
|
||||
self.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 1
|
||||
|
||||
self.reader.updateInterval << self.updateInterval
|
||||
self.reader.setInterval(value: self.updateInterval)
|
||||
if self.widgetType == Widgets.BarChart {
|
||||
(self.reader as! CPUReader).perCoreMode = true
|
||||
(self.reader as! CPUReader).hyperthreading = self.hyperthreading.value
|
||||
}
|
||||
|
||||
if !self.available.value {
|
||||
self.reader.stop()
|
||||
}
|
||||
}
|
||||
|
||||
func initMenu(active: Bool) {
|
||||
@@ -225,6 +229,6 @@ class CPU: Module {
|
||||
sender.state = NSControl.StateValue.on
|
||||
self.updateInterval = interval
|
||||
self.defaults.set(interval, forKey: "\(name)_interval")
|
||||
self.reader.updateInterval << interval
|
||||
self.reader.setInterval(value: interval)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@ struct TopProcess {
|
||||
|
||||
class CPUReader: Reader {
|
||||
public var value: Observable<[Double]>!
|
||||
public var updateInterval: Observable<Int> = Observable(0)
|
||||
public var usage: Observable<CPUUsage> = Observable(CPUUsage())
|
||||
public var processes: Observable<[TopProcess]> = Observable([TopProcess]())
|
||||
public var available: Bool = true
|
||||
@@ -33,6 +32,7 @@ class CPUReader: Reader {
|
||||
public var updateAdditionalTimer: Timer!
|
||||
public var perCoreMode: Bool = false
|
||||
public var hyperthreading: Bool = false
|
||||
public var updateInterval: Int = 0
|
||||
|
||||
private var cpuInfo: processor_info_array_t!
|
||||
private var prevCpuInfo: processor_info_array_t?
|
||||
@@ -54,9 +54,8 @@ class CPUReader: Reader {
|
||||
}
|
||||
}
|
||||
|
||||
self.updateInterval.subscribe(observer: self) { (value, _) in
|
||||
self.stop()
|
||||
self.start()
|
||||
if self.available {
|
||||
self.read()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,7 +65,7 @@ class CPUReader: Reader {
|
||||
if updateTimer != nil {
|
||||
return
|
||||
}
|
||||
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(read), userInfo: nil, repeats: true)
|
||||
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval), target: self, selector: #selector(read), userInfo: nil, repeats: true)
|
||||
}
|
||||
|
||||
func stop() {
|
||||
@@ -83,7 +82,7 @@ class CPUReader: Reader {
|
||||
if updateAdditionalTimer != nil {
|
||||
return
|
||||
}
|
||||
updateAdditionalTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(readAdditional), userInfo: nil, repeats: true)
|
||||
updateAdditionalTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval), target: self, selector: #selector(readAdditional), userInfo: nil, repeats: true)
|
||||
}
|
||||
|
||||
func stopAdditional() {
|
||||
@@ -245,6 +244,22 @@ class CPUReader: Reader {
|
||||
|
||||
return (sys, user, idle)
|
||||
}
|
||||
|
||||
func setInterval(value: Int) {
|
||||
if value == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
self.updateInterval = value
|
||||
if self.updateTimer != nil {
|
||||
self.stop()
|
||||
self.start()
|
||||
}
|
||||
if self.updateAdditionalTimer != nil {
|
||||
self.stopAdditional()
|
||||
self.startAdditional()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension String {
|
||||
|
||||
@@ -32,7 +32,7 @@ class Disk: Module {
|
||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||
self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini
|
||||
self.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 5
|
||||
self.reader.updateInterval << self.updateInterval
|
||||
self.reader.setInterval(value: self.updateInterval)
|
||||
}
|
||||
|
||||
func initTab() {
|
||||
@@ -188,6 +188,6 @@ class Disk: Module {
|
||||
sender.state = NSControl.StateValue.on
|
||||
self.updateInterval = interval
|
||||
self.defaults.set(interval, forKey: "\(name)_interval")
|
||||
self.reader.updateInterval << interval
|
||||
self.reader.setInterval(value: interval)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,16 +10,16 @@ import Foundation
|
||||
|
||||
class DiskReader: Reader {
|
||||
public var value: Observable<[Double]>!
|
||||
public var updateInterval: Observable<Int> = Observable(0)
|
||||
public var available: Bool = true
|
||||
public var availableAdditional: Bool = false
|
||||
public var updateTimer: Timer!
|
||||
public var updateAdditionalTimer: Timer!
|
||||
public var updateInterval: Int = 0
|
||||
|
||||
init() {
|
||||
self.value = Observable([])
|
||||
self.updateInterval.subscribe(observer: self) { (value, _) in
|
||||
self.stop()
|
||||
self.start()
|
||||
if self.available {
|
||||
self.read()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ class DiskReader: Reader {
|
||||
if updateTimer != nil {
|
||||
return
|
||||
}
|
||||
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(read), userInfo: nil, repeats: true)
|
||||
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval), target: self, selector: #selector(read), userInfo: nil, repeats: true)
|
||||
}
|
||||
|
||||
func stop() {
|
||||
@@ -67,4 +67,20 @@ class DiskReader: Reader {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func setInterval(value: Int) {
|
||||
if value == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
self.updateInterval = value
|
||||
if self.updateTimer != nil {
|
||||
self.stop()
|
||||
self.start()
|
||||
}
|
||||
if self.updateAdditionalTimer != nil {
|
||||
self.stopAdditional()
|
||||
self.startAdditional()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ class Memory: Module {
|
||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||
self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini
|
||||
self.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 5
|
||||
self.reader.updateInterval << self.updateInterval
|
||||
self.reader.setInterval(value: self.updateInterval)
|
||||
}
|
||||
|
||||
func initMenu(active: Bool) {
|
||||
@@ -199,6 +199,6 @@ class Memory: Module {
|
||||
sender.state = NSControl.StateValue.on
|
||||
self.updateInterval = interval
|
||||
self.defaults.set(interval, forKey: "\(name)_interval")
|
||||
self.reader.updateInterval << interval
|
||||
self.reader.setInterval(value: interval)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@ struct MemoryUsage {
|
||||
|
||||
class MemoryReader: Reader {
|
||||
public var value: Observable<[Double]>!
|
||||
public var updateInterval: Observable<Int> = Observable(0)
|
||||
public var usage: Observable<MemoryUsage> = Observable(MemoryUsage())
|
||||
public var processes: Observable<[TopProcess]> = Observable([TopProcess]())
|
||||
public var available: Bool = true
|
||||
@@ -24,6 +23,7 @@ class MemoryReader: Reader {
|
||||
public var updateTimer: Timer!
|
||||
public var updateAdditionalTimer: Timer!
|
||||
public var totalSize: Float
|
||||
public var updateInterval: Int = 0
|
||||
|
||||
init() {
|
||||
self.value = Observable([])
|
||||
@@ -44,9 +44,8 @@ class MemoryReader: Reader {
|
||||
print("Error with host_info(): " + (String(cString: mach_error_string(kerr), encoding: String.Encoding.ascii) ?? "unknown error"))
|
||||
}
|
||||
|
||||
self.updateInterval.subscribe(observer: self) { (value, _) in
|
||||
self.stop()
|
||||
self.start()
|
||||
if self.available {
|
||||
self.read()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +55,7 @@ class MemoryReader: Reader {
|
||||
if updateTimer != nil {
|
||||
return
|
||||
}
|
||||
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(read), userInfo: nil, repeats: true)
|
||||
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval), target: self, selector: #selector(read), userInfo: nil, repeats: true)
|
||||
}
|
||||
|
||||
func stop() {
|
||||
@@ -77,7 +76,7 @@ class MemoryReader: Reader {
|
||||
if updateAdditionalTimer != nil {
|
||||
return
|
||||
}
|
||||
updateAdditionalTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(readAdditional), userInfo: nil, repeats: true)
|
||||
updateAdditionalTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval), target: self, selector: #selector(readAdditional), userInfo: nil, repeats: true)
|
||||
}
|
||||
|
||||
func stopAdditional() {
|
||||
@@ -163,4 +162,20 @@ class MemoryReader: Reader {
|
||||
print("Error with host_statistics64(): " + (String(cString: mach_error_string(kerr), encoding: String.Encoding.ascii) ?? "unknown error"))
|
||||
}
|
||||
}
|
||||
|
||||
func setInterval(value: Int) {
|
||||
if value == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
self.updateInterval = value
|
||||
if self.updateTimer != nil {
|
||||
self.stop()
|
||||
self.start()
|
||||
}
|
||||
if self.updateAdditionalTimer != nil {
|
||||
self.stopAdditional()
|
||||
self.startAdditional()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,6 +78,7 @@ extension Module {
|
||||
|
||||
func start() {
|
||||
self.reader.start()
|
||||
self.reader.startAdditional()
|
||||
|
||||
if !self.reader.value.value.isEmpty {
|
||||
(self.view as! Widget).setValue(data: self.reader.value.value)
|
||||
@@ -92,6 +93,7 @@ extension Module {
|
||||
|
||||
func stop() {
|
||||
self.reader.stop()
|
||||
self.reader.stopAdditional()
|
||||
self.reader.value.unsubscribe(observer: self)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ class Network: Module {
|
||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||
self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.NetworkDots
|
||||
self.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 1
|
||||
self.reader.updateInterval << self.updateInterval
|
||||
self.reader.setInterval(value: self.updateInterval)
|
||||
}
|
||||
|
||||
func initTab() {
|
||||
|
||||
@@ -10,10 +10,11 @@ import Cocoa
|
||||
|
||||
class NetworkReader: Reader {
|
||||
public var value: Observable<[Double]>!
|
||||
public var updateInterval: Observable<Int> = Observable(0)
|
||||
public var available: Bool = true
|
||||
public var availableAdditional: Bool = false
|
||||
public var updateTimer: Timer!
|
||||
public var updateAdditionalTimer: Timer!
|
||||
public var updateInterval: Int = 0
|
||||
|
||||
private var netProcess: Process = Process()
|
||||
private var pipe: Pipe = Pipe()
|
||||
@@ -23,6 +24,10 @@ class NetworkReader: Reader {
|
||||
netProcess.launchPath = "/usr/bin/env"
|
||||
netProcess.arguments = ["netstat", "-w1", "-l", "en0"]
|
||||
netProcess.standardOutput = pipe
|
||||
|
||||
if self.available {
|
||||
self.read()
|
||||
}
|
||||
}
|
||||
|
||||
func start() {
|
||||
@@ -64,4 +69,20 @@ class NetworkReader: Reader {
|
||||
}
|
||||
|
||||
func read() {}
|
||||
|
||||
func setInterval(value: Int) {
|
||||
if value == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
self.updateInterval = value
|
||||
if self.updateTimer != nil {
|
||||
self.stop()
|
||||
self.start()
|
||||
}
|
||||
if self.updateAdditionalTimer != nil {
|
||||
self.stopAdditional()
|
||||
self.startAdditional()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,17 +10,20 @@ import Foundation
|
||||
|
||||
protocol Reader {
|
||||
var value: Observable<[Double]>! { get }
|
||||
var updateInterval: Observable<Int> { get }
|
||||
|
||||
var available: Bool { get }
|
||||
var availableAdditional: Bool { get }
|
||||
var updateTimer: Timer! { get set }
|
||||
var updateAdditionalTimer: Timer! { get set }
|
||||
var updateInterval: Int { get }
|
||||
|
||||
func start()
|
||||
func stop()
|
||||
|
||||
func startAdditional()
|
||||
func stopAdditional()
|
||||
|
||||
func setInterval(value: Int)
|
||||
}
|
||||
|
||||
extension Reader {
|
||||
|
||||
Reference in New Issue
Block a user