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:
co-authored by
Claude Opus 5
parent
a3399d3a96
commit
91b83928ca
+29
-21
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user