fix bug when readers work in disabled modules

This commit is contained in:
Serhiy Mytrovtsiy
2020-01-09 13:31:18 +01:00
parent 42123eab5e
commit 51b815308a
13 changed files with 130 additions and 37 deletions

View File

@@ -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)
}

View File

@@ -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)
}
}

View File

@@ -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()
}
}
}

View File

@@ -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)
}
}

View File

@@ -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 {

View File

@@ -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)
}
}

View File

@@ -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()
}
}
}

View File

@@ -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)
}
}

View File

@@ -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()
}
}
}

View File

@@ -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)
}
}

View File

@@ -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() {

View File

@@ -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()
}
}
}

View File

@@ -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 {