Files
onyx/docs/spikes/J-osd.md
T
ScarriffleandClaude Opus 5 91b83928ca Der Einblendung zuvorkommen, statt sie abschalten zu wollen
Der Schluss im letzten Commit war falsch. Aus „der Dienst liegt in der
Benutzer-Domäne" hatte ich geschlossen, dass `launchctl bootout` ihn dort
aushängt. Nachgemessen, diesmal ausführend:

    Boot-out failed: 150: Operation not permitted while
    System Integrity Protection is engaged

SIP schützt den Dienst, nicht nur den Dateipfad; die Domäne spielt keine Rolle.
Ein rein lesender Spike konnte das nicht zeigen — nur der Versuch. `SystemOSD`
fliegt deshalb wieder raus: Code, der behauptet zu wirken und es nicht tut, ist
schlimmer als keiner.

Stattdessen ein `CGEventTap` auf die Lautstärketasten. Onyx regelt selbst und
verbraucht das Ereignis — was das System nie erreicht, blendet es auch nicht
ein. Preis ist die Berechtigung „Bedienungshilfen"; ohne sie bleibt alles wie
vorher, und der Dialog wird angefragt statt stumm zu scheitern.

Vorteil gegenüber dem Aushängen: es verschwindet nur die Einblendung für die
Tasten, die Onyx auch bedient. Die Feststelltaste behält ihre — beim Aushängen
wäre sie mit verschwunden, und dafür hat Onyx keinen Ersatz.

Der Rückruf steht als eigene Funktion und nicht als Verschluss in `start()`: als
Verschluss brachte er Swift 6.3.3 im Durchgang `SendNonSendable` zum Absturz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 23:02:35 +02:00

56 lines
2.3 KiB
Markdown

# Spike J — Apples eigene Einblendung unterdrücken
> Im Plan heißt dieser Spike „G". Die Buchstaben in `docs/spikes/` sind
> fortlaufend vergeben; hier läuft die vorhandene Reihe weiter.
**Frage.** Lässt sich `com.apple.OSDUIHelper` zuverlässig aushängen? Kommt er von
selbst zurück? Was passiert beim Ab- und Anmelden? Steht SIP im Weg?
**Gemessen am 05.09.2026**, rein lesend.
## Ergebnis
| Prüfung | Befund |
|---|---|
| Prozess läuft dauerhaft? | **nein** — bedarfsgesteuert, `state = not running` |
| LaunchAgent | `/System/Library/LaunchAgents/com.apple.OSDUIHelper.plist` |
| Domäne | **`gui/<uid>`** — die des angemeldeten Benutzers, nicht `system` |
| SIP | aktiviert, `OSDUIHelper.app/Contents` ist `restricted` |
## Der Schluss daraus war falsch
Aus „der Dienst liegt in der Benutzer-Domäne" habe ich geschlossen, dass
`launchctl bootout gui/<uid>/…` ihn dort aushängt, ohne Root und ohne SIP zu
berühren. **Das stimmt nicht.** Nachgemessen, diesmal ausführend:
```
$ launchctl bootout gui/501/com.apple.OSDUIHelper
Boot-out failed: 150: Operation not permitted while System Integrity Protection is engaged
```
SIP schützt den **Dienst**, nicht nur den Dateipfad. Die Domäne spielt keine
Rolle. Ein rein lesender Spike konnte das nicht zeigen — nur der Versuch.
**Die Lehre:** Ein Spike, der die entscheidende Handlung nicht ausführt, hat die
Frage nicht beantwortet. Er hat nur die Umstände beschrieben, unter denen sie
gestellt wird. Wo die Handlung sich zurücknehmen lässt, gehört sie in den
Spike — sonst steht am Ende eine Vermutung im Dokument, die wie ein Befund
aussieht.
## Was stattdessen geht
Nicht die Einblendung abschalten, sondern **ihr zuvorkommen**: die
Lautstärketasten mit einem `CGEventTap` abfangen, die Lautstärke selbst setzen
und das Ereignis verbrauchen. Was das System nie erreicht, blendet es auch nicht
ein.
Preis: das braucht die Berechtigung „Bedienungshilfen". Ohne sie tut der Tap
nichts — dann erscheint Apples Einblendung wie gehabt, und das muss die
Oberfläche sagen, statt es stumm hinzunehmen.
## Der Vorteil des Abfangens
Es verschwindet nur die Einblendung für die Tasten, die Onyx selbst bedient.
Feststelltaste und alles andere behalten ihre — beim Aushängen des Dienstes
wären sie mit verschwunden, und für die Feststelltaste hat Onyx keinen Ersatz.