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")