Atoll/DynamicIsland/managers/SystemKeyboardBacklightController.swift
2025-11-30 15:50:44 +05:30

66 lines
1.9 KiB
Swift

import Foundation
extension Notification.Name {
static let keyboardBacklightDidChange = Notification.Name("DynamicIsland.keyboardBacklightDidChange")
}
final class SystemKeyboardBacklightController {
static let shared = SystemKeyboardBacklightController()
var onBacklightChange: ((Float) -> Void)?
private let workerQueue = DispatchQueue(label: "com.atoll.keyboardBacklight", qos: .userInitiated)
private let notificationCenter = NotificationCenter.default
private var isRunning = false
private init() {}
func start() {
guard !isRunning else { return }
isRunning = true
notifyCurrentLevel()
}
func stop() {
guard isRunning else { return }
isRunning = false
}
func adjust(by delta: Float) {
let target = currentLevel + delta
setLevel(target)
}
func setLevel(_ value: Float) {
let clamped = max(0, min(1, value))
workerQueue.async {
do {
try KeyboardBrightnessSensor.setLevel(clamped)
let level = (try? KeyboardBrightnessSensor.currentLevel()) ?? clamped
self.emitChange(level: level)
} catch {
NSLog("⚠️ Failed to set keyboard backlight: \(error)")
}
}
}
var currentLevel: Float {
(try? KeyboardBrightnessSensor.currentLevel()) ?? 0
}
private func notifyCurrentLevel() {
workerQueue.async {
let level = (try? KeyboardBrightnessSensor.currentLevel()) ?? 0
self.emitChange(level: level)
}
}
private func emitChange(level: Float) {
guard isRunning else { return }
DispatchQueue.main.async { [weak self] in
guard let self, self.isRunning else { return }
self.onBacklightChange?(level)
self.notificationCenter.post(name: .keyboardBacklightDidChange, object: nil, userInfo: ["value": level])
}
}
}