From c8f3054036b07b3be91d7f8413d1a7f4f6732e72 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Fri, 14 Aug 2026 13:15:58 +0200 Subject: [PATCH] Calendarr: ein Blick alle zwei Minuten unter die Benachrichtigung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Onyx holt sich nichts, sondern liest den Schnappschuss, den Calendarr in den gemeinsamen Ordner schreibt — kein Netzzugriff, kein zweiter Zwischenspeicher. Gemeldet wird das über eine Darwin-Nachricht, und darauf hört Onyx. Die Nachricht ist aber flüchtig: schreibt Calendarr, während Onyx nicht läuft oder gerade startet, kommt sie nie an. Der Schnappschuss steht dann so lange still, bis Calendarr das nächste Mal schreibt — und die Terminliste ist aus unerfindlichen Gründen von gestern. Also zusätzlich alle zwei Minuten nachsehen, solange Calendarr überhaupt gefragt wird. Das kostet das Einlesen einer Datei von vierzehn Kilobyte. Co-Authored-By: Claude Opus 5 --- .../CalendarProvider/CalendarWidget.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Packages/OnyxKit/Sources/CalendarProvider/CalendarWidget.swift b/Packages/OnyxKit/Sources/CalendarProvider/CalendarWidget.swift index 5e6f617..7f67b99 100644 --- a/Packages/OnyxKit/Sources/CalendarProvider/CalendarWidget.swift +++ b/Packages/OnyxKit/Sources/CalendarProvider/CalendarWidget.swift @@ -56,6 +56,8 @@ public final class CalendarModel { private var refreshTask: Task? /// `nil` = nicht auf Calendarr-Änderungen angemeldet. private var calendarrObserver: DarwinObserver? + /// Das Sicherheitsnetz unter der Benachrichtigung. + private var calendarrTimer: Timer? public init(appleSource: CalendarSource = EventKitSource(), calendarrSource: CalendarSource = CalendarrSource(), @@ -108,6 +110,21 @@ public final class CalendarModel { Task { @MainActor in self?.refresh() } } : nil + + // Dazu ein Blick alle zwei Minuten. + // + // Die Benachrichtigung ist der schnelle Weg, aber sie ist flüchtig: + // schreibt Calendarr, während Onyx nicht läuft oder gerade startet, + // kommt sie nie an — und dann steht der Schnappschuss so lange still, + // bis Calendarr das nächste Mal schreibt. Das Nachsehen kostet das + // Einlesen einer Datei von wenigen Kilobyte; das ist billiger als eine + // Terminliste, die aus unerfindlichen Gründen von gestern ist. + calendarrTimer?.invalidate() + calendarrTimer = wanted + ? Timer.scheduledTimer(withTimeInterval: 120, repeats: true) { _ in + MainActor.assumeIsolated { [weak self] in self?.refresh() } + } + : nil } /// Fragt die Berechtigung an und lädt bei Erfolg gleich.