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:
co-authored by
Claude Opus 5
parent
c05ccb8ae1
commit
9b600de9a9
@@ -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")
|
||||
Reference in New Issue
Block a user