Live Activities unter der Notch, nicht daneben

Neben ihr wären die Arme zwangsläufig gleich breit — die Silhouette zeichnet den
Steg mittig um die Hardware. Ein Symbol links und ein Balken rechts hieße dann
132 Punkte Schwarz für ein Symbol. Darunter hängt die Fläche frei und wird so
breit, wie ihr Inhalt es braucht.

Lautstärke, Strom, Titelwechsel und Helligkeit. Gemeldet wird nur, was sich
**geändert** hat: `PowerWatcher` schweigt beim ersten gelesenen Zustand, sonst
begrüßte Onyx jeden Start mit „am Netz".

Die Helligkeit kostete einen Spike. Von drei Wegen trägt nur `DisplayServices`,
und nur für den eingebauten Bildschirm. `CoreDisplay` — der Weg, den jede
Anleitung empfiehlt — gibt für alle Bildschirme 1.0 zurück, auch für den, der
auf 62 % stand.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-05 21:05:13 +02:00
co-authored by Claude Opus 5
parent c05ccb8ae1
commit 9b600de9a9
11 changed files with 1193 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
import AppKit
// Lässt sich auf Helligkeitsänderungen *hören*, statt sie abzufragen?
//
// Eine Notch, die zehnmal je Sekunde nachfragt, hält den Rechner wach. Wenn es
// keine Benachrichtigung gibt, ist die Helligkeits-Activity nicht zu haben —
// dann lieber gar nicht als mit einem Dauerwecker.
//
// Eigener Prozess, weil die Signatur geraten ist: stimmt sie nicht, stürzt hier
// etwas ab und sonst nichts.
typealias BrightnessCallback = @convention(c) (UnsafeRawPointer?, CGDirectDisplayID,
CFString?, Double) -> Void
typealias Register = @convention(c) (CGDirectDisplayID, UnsafeRawPointer?,
BrightnessCallback) -> Int32
let path = "/System/Library/PrivateFrameworks/DisplayServices.framework/DisplayServices"
guard let handle = dlopen(path, RTLD_LAZY),
let sym = dlsym(handle, "DisplayServicesRegisterForBrightnessChangeNotifications") else {
print("nicht vorhanden"); exit(1)
}
let register = unsafeBitCast(sym, to: Register.self)
let callback: BrightnessCallback = { _, display, key, value in
print(" → Bildschirm \(display), Schlüssel \(key.map { $0 as String } ?? "—"), Wert \(value)")
}
// Nur das eingebaute Display kann Helligkeit; die externen melden Fehler.
let builtIn = NSScreen.screens.compactMap {
$0.deviceDescription[NSDeviceDescriptionKey("NSScreenNumber")] as? CGDirectDisplayID
}.first { CGDisplayIsBuiltin($0) != 0 }
guard let builtIn else { print("kein eingebautes Display"); exit(1) }
let status = register(builtIn, nil, callback)
print("Anmeldung für Bildschirm \(builtIn): status \(status) \(status == 0 ? "(erfolgreich)" : "(FEHLER)")")
print("Lausche 12 Sekunden — jede Helligkeitsänderung erscheint hier.")
RunLoop.current.run(until: Date().addingTimeInterval(12))
print("fertig")