diff --git a/Stats/AppDelegate.swift b/Stats/AppDelegate.swift index 370065d6..014f3af8 100755 --- a/Stats/AppDelegate.swift +++ b/Stats/AppDelegate.swift @@ -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) } diff --git a/Stats/Modules/Battery/Battery.swift b/Stats/Modules/Battery/Battery.swift index 0def5cce..a71b348e 100644 --- a/Stats/Modules/Battery/Battery.swift +++ b/Stats/Modules/Battery/Battery.swift @@ -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) } } diff --git a/Stats/Modules/Battery/BatteryReader.swift b/Stats/Modules/Battery/BatteryReader.swift index 84dd70ab..b2e5bef0 100644 --- a/Stats/Modules/Battery/BatteryReader.swift +++ b/Stats/Modules/Battery/BatteryReader.swift @@ -30,10 +30,11 @@ struct BatteryUsage { class BatteryReader: Reader { public var value: Observable<[Double]>! - public var updateInterval: Observable = Observable(0) public var usage: Observable = 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() + } + } } diff --git a/Stats/Modules/CPU/CPU.swift b/Stats/Modules/CPU/CPU.swift index ca23c49c..812e7e1a 100644 --- a/Stats/Modules/CPU/CPU.swift +++ b/Stats/Modules/CPU/CPU.swift @@ -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) } } diff --git a/Stats/Modules/CPU/CPUReader.swift b/Stats/Modules/CPU/CPUReader.swift index 2df108e9..e9ea2da1 100644 --- a/Stats/Modules/CPU/CPUReader.swift +++ b/Stats/Modules/CPU/CPUReader.swift @@ -24,7 +24,6 @@ struct TopProcess { class CPUReader: Reader { public var value: Observable<[Double]>! - public var updateInterval: Observable = Observable(0) public var usage: Observable = 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 { diff --git a/Stats/Modules/Disk/Disk.swift b/Stats/Modules/Disk/Disk.swift index 869bef25..977d2792 100644 --- a/Stats/Modules/Disk/Disk.swift +++ b/Stats/Modules/Disk/Disk.swift @@ -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) } } diff --git a/Stats/Modules/Disk/DiskReader.swift b/Stats/Modules/Disk/DiskReader.swift index 048eabb6..63d1c86b 100644 --- a/Stats/Modules/Disk/DiskReader.swift +++ b/Stats/Modules/Disk/DiskReader.swift @@ -10,16 +10,16 @@ import Foundation class DiskReader: Reader { public var value: Observable<[Double]>! - public var updateInterval: Observable = 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() + } + } } diff --git a/Stats/Modules/Memory/Memory.swift b/Stats/Modules/Memory/Memory.swift index 0d485419..8c9f73f4 100644 --- a/Stats/Modules/Memory/Memory.swift +++ b/Stats/Modules/Memory/Memory.swift @@ -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) } } diff --git a/Stats/Modules/Memory/MemoryReader.swift b/Stats/Modules/Memory/MemoryReader.swift index 1b239547..83d688f2 100644 --- a/Stats/Modules/Memory/MemoryReader.swift +++ b/Stats/Modules/Memory/MemoryReader.swift @@ -16,7 +16,6 @@ struct MemoryUsage { class MemoryReader: Reader { public var value: Observable<[Double]>! - public var updateInterval: Observable = Observable(0) public var usage: Observable = 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() + } + } } diff --git a/Stats/Modules/Module.swift b/Stats/Modules/Module.swift index 7ae0236a..5f27783f 100644 --- a/Stats/Modules/Module.swift +++ b/Stats/Modules/Module.swift @@ -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) } } diff --git a/Stats/Modules/Network/Network.swift b/Stats/Modules/Network/Network.swift index 2af4ddcf..a63ee71d 100644 --- a/Stats/Modules/Network/Network.swift +++ b/Stats/Modules/Network/Network.swift @@ -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() { diff --git a/Stats/Modules/Network/NetworkReader.swift b/Stats/Modules/Network/NetworkReader.swift index 6e442fb0..219989c8 100644 --- a/Stats/Modules/Network/NetworkReader.swift +++ b/Stats/Modules/Network/NetworkReader.swift @@ -10,10 +10,11 @@ import Cocoa class NetworkReader: Reader { public var value: Observable<[Double]>! - public var updateInterval: Observable = 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() + } + } } diff --git a/Stats/Modules/Reader.swift b/Stats/Modules/Reader.swift index 4d42f8fb..ea2d6a8d 100644 --- a/Stats/Modules/Reader.swift +++ b/Stats/Modules/Reader.swift @@ -10,17 +10,20 @@ import Foundation protocol Reader { var value: Observable<[Double]>! { get } - var updateInterval: Observable { 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 {