Zwei Anzeigen für einen Handgriff sind eine zu viel

Apples eigene Einblendung lässt sich aushängen, ohne Root und ohne SIP
anzufassen: `com.apple.OSDUIHelper` liegt in der GUI-Domäne des angemeldeten
Benutzers, nicht im System. `launchctl bootout` dort hinein genügt.

Standardmäßig aus, denn es verschwindet **jede** Einblendung — auch Helligkeit
und Feststelltaste, und für die Feststelltaste hat Onyx keinen Ersatz. Beim
Beenden wird wieder eingehängt: eine Einstellung darf nicht überleben, was sie
eingestellt hat.

Dazu zwei Fehler im Anlernen behoben. Der Posenname stand als roher Schlüssel da
— die Zeichenketten liegen im Bündel von `FaceProvider`, gesucht wurden sie im
Hauptbündel. Und „Gesicht vergleichen" blieb nach dem Anlernen grau, weil
`isEnrolled` bei jedem Aufruf den Schlüsselbund las: richtig, aber für SwiftUI
unsichtbar, weil es nichts gab, woran eine Ansicht die Änderung hätte bemerken
können.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-05 22:26:41 +02:00
co-authored by Claude Opus 5
parent fd29df51cf
commit a3399d3a96
9 changed files with 221 additions and 8 deletions
+17
View File
@@ -24,6 +24,7 @@ final class AppModel {
var onNotchStyleChanged: ((NotchStyle) -> Void)?
var onNotchWidthsChanged: (([CGDirectDisplayID: CGFloat]) -> Void)?
var onFaceUnlockChanged: ((Bool) -> Void)?
var onSuppressOSDChanged: ((Bool) -> Void)?
var layout: [WidgetPlacement] {
didSet {
@@ -64,6 +65,19 @@ final class AppModel {
onNotchWidthsChanged?(notchWidths)
}
/// Ob Apples eigene Einblendung unterdrückt wird.
///
/// Standardmäßig aus: es verschwindet **jede** Einblendung, auch die für
/// Helligkeit und Feststelltaste. Das ist eine Entscheidung, die man
/// treffen soll, nicht eine, die man vorfindet.
var suppressSystemOSD: Bool {
didSet {
guard suppressSystemOSD != oldValue else { return }
defaults.set(suppressSystemOSD, forKey: Keys.suppressSystemOSD)
onSuppressOSDChanged?(suppressSystemOSD)
}
}
/// Ob Onyx einen eigenen Sperrbildschirm anbietet.
var lockScreenEnabled: Bool {
didSet {
@@ -186,6 +200,7 @@ final class AppModel {
static let showsIdleIsland = "onyx.showsIdleIsland"
static let notchStyle = "onyx.notchStyle"
static let notchWidths = "onyx.notchWidths"
static let suppressSystemOSD = "onyx.suppressSystemOSD"
static let lockScreenEnabled = "onyx.lock.enabled"
static let faceUnlockEnabled = "onyx.lock.face"
static let bandLeading = "onyx.band.leading"
@@ -208,6 +223,8 @@ final class AppModel {
self.showsIdleIsland = defaults.object(forKey: Keys.showsIdleIsland) as? Bool ?? true
self.notchStyle = defaults.string(forKey: Keys.notchStyle)
.flatMap(NotchStyle.init(rawValue:)) ?? .automatic
self.suppressSystemOSD = defaults.object(forKey: Keys.suppressSystemOSD) as? Bool ?? false
// Beides standardmäßig **aus**: ein Sperrbildschirm, den man nicht
// bestellt hat, ist ein Schreck, und ein Gesichtsvergleich ohne
// angelerntes Gesicht kann ohnehin nichts.