Den Tastenabgriff näher an die Hardware setzen

An der Sitzung angesetzt fing er synthetische Ereignisse zuverlässig ab — die
echten Lautstärketasten aber nicht: nachgemessen läuft der Abgriff, und ein
selbst erzeugter Tastendruck wird erkannt und verbraucht, während der Druck auf
die Taste weiterhin Apples Einblendung auslöste. Auf neueren macOS-Fassungen
werden die Tasten offenbar weiter vorn behandelt, bevor die Sitzung sie sieht.

`cghidEventTap` sitzt davor. Ob das reicht, zeigt erst die echte Taste — synthetisch
ist beides nicht zu unterscheiden.

Die Protokollzeilen bleiben vorerst drin: ohne sie ist „es geht immer noch nicht"
nicht von „der Abgriff läuft gar nicht" zu trennen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-06 21:05:25 +02:00
co-authored by Claude Opus 5
parent 91b83928ca
commit b3ad9c49d6
2 changed files with 14 additions and 2 deletions
+8 -1
View File
@@ -448,10 +448,15 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
/// `docs/spikes/J-osd.md`. Was geht, ist ihr zuvorzukommen: das System
/// blendet nichts ein, wenn der Tastendruck es nie erreicht.
private func applyMediaKeys(_ on: Bool) {
guard on else { mediaKeys.stop(); return }
guard on else {
mediaKeys.stop()
log.notice("Tastenabgriff aus")
return
}
guard MediaKeyTap.isTrusted else {
// Ohne Bedienungshilfen tut der Abgriff nichts. Den Dialog anfragen
// statt stumm zu scheitern.
log.notice("Tastenabgriff: Bedienungshilfen fehlen — Dialog angefragt")
MediaKeyTap.requestTrust()
return
}
@@ -459,12 +464,14 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
MainActor.assumeIsolated { self?.handleMediaKey(key) ?? false }
}
mediaKeys.start()
log.notice("Tastenabgriff \(self.mediaKeys.isRunning ? "läuft" : "NICHT gestartet", privacy: .public)")
}
/// Wie macOS selbst: ein Sechzehntel je Anschlag.
private static let volumeStep = 1.0 / 16.0
private func handleMediaKey(_ key: MediaKeyTap.Key) -> Bool {
log.notice("Taste abgefangen: \(String(describing: key), privacy: .public)")
let current = systemAudio.outputVolume
switch key {
case .volumeUp: