Phase 5: Hardware- und Netzwerkmonitor, Panel und Menüleiste
Sechs neue Widgets (CPU, GPU, Speicher, Akku, Sensoren, Netzwerk) und dieselben sechs als einzeln aktivierbare Menüleisten-Module mit fünf Darstellungsarten. Panel-Widget und Menüleisten-Modul derselben Größe teilen sich die Messschleife über Referenzzählung. Ohne das liefe für jede Anzeige ein eigener Timer mit denselben IOKit- und SMC-Abfragen — bei sechs Modulen und ebenso vielen Widgets ein Vielfaches der nötigen Arbeit. Meldet sich der letzte Konsument ab, hört die Schleife auf; im Ruhezustand misst Onyx nichts. Die Differenzrechnung ist testgetrieben, und die Tests haben zwei echte Fehler gefunden. Erstens: mein Überlaufschutz beim Durchsatz hielt einen zurückgesetzten Zähler (Interface-Wechsel) für einen Überlauf und zeigte 4,3 GB/s. Da if_data64 64-Bit-Zähler liefert, die bei 10 Gbit/s erst nach 470 Jahren umlaufen, ist ein kleinerer Wert immer ein Zurücksetzen — die Unterscheidung produzierte nur den Ausreißer, den sie verhindern sollte. Zweitens: ByteCountFormatter schrieb bei null „Zero KB/s" statt „0 KB/s". Bei den CPU-Zählern bleibt der Überlaufschutz nötig: die sind 32 Bit breit und laufen nach gut 400 Tagen wirklich um, deshalb `&-` statt `-`. Sensoren kommen über den SMC-Leser aus Spike A statt über die private IOHID-Schnittstelle — auf dieser Maschine nachweislich verifiziert, und die dort gefundene Little-Endian-Eigenheit ist berücksichtigt. Nur eine kurze Liste benannter Fühler statt aller 3486 Keys: eine Wand aus Kürzeln ist keine Information. Gegengemessen statt vermutet: 15 Kerne, 39,8 W, GPU 50 %, 16,6/24 GB mit kritischem Druck, Akku 68 Zyklen bei 100 % Gesundheit, fünf Sensoren, zwei Lüfter, en0 mit 661 KB/s. Menüleisten-Module zeichnen in labelColor statt in den Onyx-Farben — nur die Systemfarbe passt sich heller wie dunkler Leiste an. Feste Breite je Darstellungsart, sonst schiebt jeder Messwert die halbe Leiste hin und her. Standardmäßig ist kein Modul aktiv: sechs neue Symbole beim ersten Start wären eine Zumutung. 145 Tests grün.
This commit is contained in:
@@ -8,6 +8,8 @@ import OnyxWidgetKit
|
||||
import CalendarProvider
|
||||
import WeatherProvider
|
||||
import MediaProvider
|
||||
import MetricsProvider
|
||||
import NetworkProvider
|
||||
|
||||
@main
|
||||
struct OnyxApp: App {
|
||||
@@ -34,6 +36,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
private var calendarModel: CalendarModel?
|
||||
private var weatherModel: WeatherModel?
|
||||
private var mediaModel: MediaModel?
|
||||
private var metricsModel: MetricsModel?
|
||||
private var networkModel: NetworkModel?
|
||||
private let settingsWindow = SettingsWindowController()
|
||||
|
||||
func applicationDidFinishLaunching(_ notification: Notification) {
|
||||
@@ -76,8 +80,19 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
}
|
||||
|
||||
let menuBar = MenuBarController()
|
||||
if let metricsModel {
|
||||
for metric in MetricKind.allCases {
|
||||
menuBar.register(MetricMenuBarModule(metric: metric, model: metricsModel),
|
||||
settings: model.menuBarSettings(for: "metric.\(metric.rawValue)"))
|
||||
}
|
||||
}
|
||||
if let networkModel {
|
||||
menuBar.register(NetworkMenuBarModule(model: networkModel),
|
||||
settings: model.menuBarSettings(for: "network"))
|
||||
}
|
||||
menuBar.start()
|
||||
self.menuBar = menuBar
|
||||
model.menuBar = menuBar
|
||||
|
||||
installOnyxStatusItem()
|
||||
observeMenuBarPreference()
|
||||
@@ -136,6 +151,16 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
self.mediaModel = mediaModel
|
||||
WidgetRegistry.shared.register(MediaWidget(model: mediaModel))
|
||||
|
||||
let metricsModel = MetricsModel()
|
||||
self.metricsModel = metricsModel
|
||||
for metric in MetricKind.allCases {
|
||||
WidgetRegistry.shared.register(MetricWidget(metric: metric, model: metricsModel))
|
||||
}
|
||||
|
||||
let networkModel = NetworkModel()
|
||||
self.networkModel = networkModel
|
||||
WidgetRegistry.shared.register(NetworkWidget(model: networkModel))
|
||||
|
||||
PlaceholderWidgets.registerAll()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user