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>
This commit is contained in:
Scarriffle
2026-09-05 23:02:35 +02:00
co-authored by Claude Opus 5
parent a3399d3a96
commit 91b83928ca
5 changed files with 228 additions and 112 deletions
+29 -21
View File
@@ -17,31 +17,39 @@ selbst zurück? Was passiert beim Ab- und Anmelden? Steht SIP im Weg?
| Domäne | **`gui/<uid>`** — die des angemeldeten Benutzers, nicht `system` |
| SIP | aktiviert, `OSDUIHelper.app/Contents` ist `restricted` |
**Der entscheidende Punkt:** der Dienst ist in der **Benutzer**-Domäne geladen.
`launchctl bootout gui/<uid>/com.apple.OSDUIHelper` hängt ihn dort aus — ohne
Root und ohne die SIP-geschützte Datei anzufassen. Geändert wird nur, was in der
eigenen Sitzung geladen ist.
## Der Schluss daraus war falsch
## Was das kostet
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:
Es verschwindet **jede** Einblendung, nicht nur die für die Lautstärke: auch
Helligkeit und Feststelltaste. Onyx zeigt nur die Lautstärke und die Helligkeit
— die Feststelltaste hätte dann gar keine Rückmeldung mehr.
```
$ launchctl bootout gui/501/com.apple.OSDUIHelper
Boot-out failed: 150: Operation not permitted while System Integrity Protection is engaged
```
Deshalb:
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.
- Der Schalter steht **standardmäßig aus**. Das ist eine Entscheidung, die man
treffen soll, nicht eine, die man vorfindet.
- Beim Beenden von Onyx wird wieder eingehängt. Ohne das säße jemand bis zum
nächsten Abmelden ganz ohne Rückmeldung da und wüsste nicht, warum. Eine
Einstellung darf nicht überleben, was sie eingestellt hat.
**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 der Spike **nicht** getan hat
## Was stattdessen geht
Nichts ausgehängt. An einem Systemdienst zu drehen, um zu sehen was passiert,
ist nichts, was ungefragt geschieht — auch dann nicht, wenn es sich zurücknehmen
lässt. Geprüft wurde nur, wo der Dienst liegt und wem er gehört.
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.
**Damit ist auch nicht gemessen**, ob er von selbst zurückkommt, wenn etwas ihn
anfordert. Der Verdacht besteht: er ist bedarfsgesteuert. Falls ja, muss das
Aushängen wiederholt werden — das zeigt sich beim ersten Einschalten.
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.