import AppKit /// Das Fenster, das den Bildschirm verdeckt. /// /// **Und was es nicht ist.** Dieses Fenster ist Bequemlichkeit, keine /// Sicherheitsgrenze. Wer den Prozess beendet, sich per SSH anmeldet oder den /// Rechner neu startet, kommt daran vorbei. Es ersetzt nicht die Sperre von /// macOS — es legt sich davor, damit das Entsperren per Gesicht überhaupt /// stattfinden kann. /// /// Diese Einschränkung steht auch in den Einstellungen und im Onboarding, in /// denselben klaren Worten. Ein Sperrbildschirm, den man für sicher hält, /// obwohl er es nicht ist, ist schlechter als gar keiner. public final class LockWindow: NSWindow { public init(screen: NSScreen) { super.init(contentRect: screen.frame, styleMask: [.borderless], backing: .buffered, defer: false) // Über allem, was der Benutzer sonst offen hat — auch über Vollbild. level = .screenSaver collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary, .stationary, .ignoresCycle] isOpaque = true backgroundColor = .black hasShadow = false // Nicht in Bildschirmfotos und Bildschirmfreigaben: was hier steht, ist // eine Passworteingabe. sharingType = .none isMovable = false setFrame(screen.frame, display: true) } /// Muss Tastatureingaben annehmen können — sonst landet das Passwort im /// Fenster darunter. public override var canBecomeKey: Bool { true } public override var canBecomeMain: Bool { true } /// Schluckt, was nicht ins Passwortfeld gehört. /// /// Vor allem `cmd+q` und `cmd+w`: ein Sperrbildschirm, den man mit einem /// Tastendruck schließt, ist keiner. public override func performKeyEquivalent(with event: NSEvent) -> Bool { event.modifierFlags.contains(.command) ? true : super.performKeyEquivalent(with: event) } }