From f3ea1ea8919985faf20326e2e4298eb587f56d85 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Tue, 15 Sep 2026 20:56:36 +0200 Subject: [PATCH] Die Fensterleiste schluckte die halbe Kopfzeile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der Player deckt das ganze Fenster ab, und auf dem Mac zeichnet das System seine Ampelknöpfe darüber. Die Kopfzeile lag damit nicht nur optisch unter ihnen — der Streifen gehört der Fensterleiste, und die nimmt jeden Klick für sich. Verkleinern, Schließen, Tonspur, Untertitel und die Qualitätsstufe waren dort tot, und ein Doppelklick auf dieselbe Stelle legte das Fenster ins Dock. Jetzt beginnt die Kopfzeile auf dem Mac achtundzwanzig Punkte tiefer. Dazu: Tabulator springt in der Jellyfin-Anmeldung vom Namen zum Passwort und zurück. „Name, Tab, Passwort, Eingabe" ist der Weg, den jeder mit einem Passwortspeicher nimmt; SwiftUI schiebt den Fokus dort nicht von selbst weiter. Co-Authored-By: Claude Opus 5 --- Flixy/Views/Player/PlayerView.swift | 20 ++++++++++++++++++++ Flixy/Views/SignIn/JellyfinSignInView.swift | 16 ++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Flixy/Views/Player/PlayerView.swift b/Flixy/Views/Player/PlayerView.swift index 90cf939..f941839 100644 --- a/Flixy/Views/Player/PlayerView.swift +++ b/Flixy/Views/Player/PlayerView.swift @@ -22,6 +22,14 @@ struct PlayerView: View { @Environment(PlaybackDiagnostics.self) private var diagnostics @Environment(\.flixyAccent) private var accent + /// Wie hoch die Fensterleiste auf dem Mac ist. + /// + /// Fest, weil es keine Auskunft darüber gibt, die hier ankäme: die + /// Sicherheitsränder einer Szene kennen die Fensterleiste nicht, sie + /// gehört dem System. Achtundzwanzig Punkte sind das Maß eines + /// gewöhnlichen Fensters. + private static let titleBarHeight: CGFloat = 28 + @State private var showsControls = true @State private var trackPicker: TrackPickerSheet.Kind? @State private var showsQualityChoice = false @@ -105,6 +113,18 @@ struct PlayerView: View { Spacer() } .padding(FlixySpacing.loose) + // **Unter der Fensterleiste beginnen.** + // + // Der Player deckt das ganze Fenster ab, und auf dem Mac + // zeichnet das System seine Ampelknöpfe darüber. Die + // Kopfzeile lag dadurch nicht nur optisch unter ihnen: der + // ganze Streifen gehört der Fensterleiste, und die + // schluckt jeden Klick. Verkleinern, Schließen, Tonspur, + // Untertitel und die Qualitätsstufe waren dort tot — und + // ein zweiter Klick auf dieselbe Stelle legte das Fenster + // ins Dock, weil das der Doppelklick auf eine + // Fensterleiste tut. + .padding(.top, FlixyPlatform.isMac ? Self.titleBarHeight : 0) } } } diff --git a/Flixy/Views/SignIn/JellyfinSignInView.swift b/Flixy/Views/SignIn/JellyfinSignInView.swift index 79df354..e3adbb5 100644 --- a/Flixy/Views/SignIn/JellyfinSignInView.swift +++ b/Flixy/Views/SignIn/JellyfinSignInView.swift @@ -190,6 +190,16 @@ struct JellyfinSignInView: View { .submitLabel(.next) .focused($focusedField, equals: .userName) .onSubmit { focusedField = .password } + // **Tabulator weiterreichen, von Hand.** + // + // Auf dem Mac ist „Name, Tab, Passwort, Eingabe" der Weg, den + // jeder nimmt, der einen Passwortspeicher benutzt. SwiftUI + // schiebt den Fokus hier aber nicht selbst weiter: die Taste + // kommt im Feld an und bleibt dort liegen. + .onKeyPress(.tab) { + focusedField = .password + return .handled + } .padding(FlixySpacing.regular) .background(Color.flixyElevated, in: .rect(cornerRadius: FlixyRadius.control)) @@ -198,6 +208,12 @@ struct JellyfinSignInView: View { .submitLabel(.go) .focused($focusedField, equals: .password) .onSubmit { Task { await model.signInWithPassword() } } + // Und zurück: sonst wäre der Weg eine Einbahnstraße, und ein + // Vertipper im Namen hieße, zur Maus greifen. + .onKeyPress(.tab) { + focusedField = .userName + return .handled + } .padding(FlixySpacing.regular) .background(Color.flixyElevated, in: .rect(cornerRadius: FlixyRadius.control))