Files
TerminalBasic/openspec/changes/archive/2026-09-08-phase-6-07a-fensterlokale-control-menues/evidence/befund-2026-09-08.md
Chili Palmer 5a1a284505 Phase 6-07a: Fensterlokale Control-Menüs und Windows-Testkorrekturen
Control-Menüs öffnen für alle Fensterarten am [≡]-Symbol des aktiven
Fensters: eigener Auswahlzustand statt Kopplung an die Menüleiste,
bevorzugt unter der Titelzeile, bei Platzmangel nach oben aufgeklappt,
am rechten Rand nur so weit nach links wie nötig. Regressionstest über
TestBackend für Code-, Projekt-, Output-, Immediate-, Debug- und
Hilfefenster, maximiert, minimiert, Rand und Maus.

Nebenbefunde der Windows-Testausführung: Temporärdatei vor sync_all
schreibend öffnen (Zugriff verweigert), relative Projektverweise immer
mit / schreiben, zeilenendenneutrale Vergleiche in Referenzmatrix-,
Kompatibilitäts- und MAK-Beispieltests, DriveListBox-Zeichenbild
plattformneutral. Korpus-Sollausgaben per .gitattributes auf LF.

Specs ide-oberflaeche und ide-projekte synchronisiert, Change archiviert.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-08 11:02:40 +02:00

6.0 KiB

Befund: Fenstermenü falsch positioniert und „File“ hervorgehoben

Datum: 08.09.2026, Validierung Phase 6 (Change 07), Windows Terminal / cmd.exe, target\debug\tb.

Beobachtung (Screenshot Run-Fenster)

  • Aktives Fenster: Run-Fenster (Magenta-Titel), Position etwa Spalte 3, Zeile 6.
  • Nach Öffnen des Fenstermenüs erscheint der Aufklappbereich (Restore, Move, Size, Minimize, Maximize, Close) in Zeile 1 direkt unter der Menüleiste, beginnend an der linken Fensterkante, und überdeckt den Titel des dahinterliegenden Codefensters.
  • Gleichzeitig ist der Hauptmenüeintrag „File“ in der Menüleiste hervorgehoben, obwohl kein Menüleistenmenü geöffnet wurde.

Das Run-Fenster ist nur das Beispiel; der Fehler betrifft alle Fenster gleich, da Zustand und Renderpfad des Control-Menüs fensterartunabhängig sind.

Erwartung

  • Aufklappbereich an das Symbol [≡] des aktiven Fensters angehängt: linke Spalte = Symbolspalte, bevorzugt unmittelbar unter der Titelzeile.
  • Reicht der Platz unten nicht (z. B. minimiertes Fenster am unteren Rand), klappt das Menü nach oben und grenzt mit seiner Unterkante an die Titelzeile; es bleibt immer vollständig im Terminalbereich und sichtbar mit dem Fenster verbunden.
  • Gleiche Regel für alle Fensterarten.
  • Kein hervorgehobener Menüleistentitel.

Ursache im Code (Stand 6e742d9)

  • crates/tb-ide/src/app.rs, Command::ControlMenu: setzt self.menu = Some((0, 0)) und damit den Menüleistenindex 0 („File“) als ausgewählt.
  • crates/tb-ide/src/render.rs, Menüleiste: hebt den Titel i hervor, wenn self.menu == Some((i, _)); bei Control-Menü also „File“.
  • crates/tb-ide/src/render.rs, Popup: Rect::new(x, 1, …) mit x = linke Fensterkante; die Zeile ist fest 1 statt Titelzeile des Fensters + 1.

Korrektur (08.09.2026)

  • crates/tb-ide/src/app.rs: control_menu trägt jetzt die eigene Auswahl (Option<usize>); Command::ControlMenu setzt menu nicht mehr. Gemeinsame Eintragsnavigation über open_entries/select_open, menu_open() ersetzt alle „ein Menü ist offen“-Abfragen. Neue Platzierungsfunktion control_menu_rect für alle Fensterarten: linke Spalte = Symbolspalte, bevorzugt unter der Titelzeile, sonst nach oben aufgeklappt bis an die Titelzeile, rechts nur so weit nach links wie nötig.
  • crates/tb-ide/src/render.rs: Popup zeichnet die offene Liste an der berechneten Position; Menüleiste hebt nur bei echter Menüleistenauswahl hervor.
  • crates/tb-ide/tests/app.rs: control_menus_attach_to_the_symbol_of_every_window prüft Code-, Projekt-, Output- und Immediate-Fenster, maximiert, minimiert (klappt nach oben), an den rechten Rand verschoben (rückt nach links) sowie Mausklick auf [≡] und auf einen Eintrag; vor der Korrektur schlug der Test mit menu == Some((0, 0)) fehl.

Nebenbefund: Export-Tests unter Windows

Bei der Testausführung scheiterten auf unverändertem Stand 6e742d9 sechs Export-Tests (tb-export und tb-ide) mit „Zugriff verweigert (os error 5)“. Ursache in crates/tb-export/src/lib.rs, prepare_publication: Die Temporärdatei wurde nur lesend geöffnet und dann sync_all aufgerufen; Windows verlangt für FlushFileBuffers Schreibrechte. Korrektur: schreibend öffnen. Auf Linux war das Verhalten unauffällig, daher blieb es in den Gitea-Läufen unentdeckt. Für Change 07 (Aufgabe 2.2/2.4) bedeutet das: Windows-Zielprüfungen des Exports müssen mit dieser Korrektur wiederholt werden.

Nebenbefunde: Windows-Checkout mit CRLF und Pfadtrennern

Der vollständige Workspace-Lauf auf dem Windows-Prüfsystem (core.autocrlf=true) zeigte weitere plattformabhängige Fehler auf unverändertem Stand:

  • crates/tb-cli/src/ide_acceptance.rs, Referenzmatrix: suchte #[test]\nfn …( in Quelldateien, die im Checkout CRLF tragen. Korrektur: Suche zeilenendenneutral.

  • crates/tb-cli/tests/compat.rs: release-formular und isamopen verglichen CRLF-Sollausgaben direkt mit LF-Snapshots (die Hauptschleife normalisierte bereits, die beiden Einzeltests nicht). Korrektur: assert_output_matches und der isamopen-Vergleich normalisieren; .gitattributes erklärt tests/compat/*.out zu LF, wie der bestehende Kommentar es bereits behauptete.

  • crates/tb-vm/tests/project_io.rs: suchte den Block ```mak\n in docs/dateiformate.md (CRLF im Checkout). Korrektur: zeilenendenneutral.

  • crates/tb-vm/src/project_io.rs, relative_path: schrieb relative Projektverweise mit dem Plattformtrenner (..\lib.tbl), die drei save_as-Tests in crates/tb-ide/tests/documents.rs erwarten /. Unter Linux/macOS ist \ kein Trenner, ein unter Windows gespeichertes Projekt wäre dort nicht ladbar. Korrektur: Verweise werden immer mit / geschrieben; beide Plattformen lösen / beim Laden auf.

  • crates/tb-ui/src/forms.rs, Zeichenbildtest: erwartete für die DriveListBox fest / ▼; die Implementierung zeigt absichtlich den Wurzeltrenner der Plattform (std::path::MAIN_SEPARATOR, unter Windows \). Korrektur: Test plattformneutral, docs/forms-referenz.md nennt beide Bilder.

Diese Befunde sind für Change 07 (Plattformmatrix, Aufgabe 2.2/2.4) relevant: Die Windows-Zielprüfung muss mit diesem Stand wiederholt werden. Der vollständige Workspace-Lauf unter Windows (cargo test --workspace --no-fail-fast) bestand nach den Korrekturen; die Zahlen stehen unten.

Testlauf Windows (08.09.2026, Arbeitsstand auf 6e742d9)

cargo fmt --all -- --check sauber, cargo clippy -p tb-ide --tests ohne Warnung.

Lauf Testziele bestanden fehlgeschlagen ignoriert
Vor den Nebenbefund-Korrekturen 42 636 12 4
cargo test --workspace --no-fail-fast, final 42 637 0 4

Manuelle Gegenprobe (08.09.2026)

Der Benutzer hat die Korrektur im realen Windows Terminal geprüft und als erfolgreich gemeldet: Control-Menüs öffnen fensterlokal am [≡]-Symbol des aktiven Fensters, die Menüleiste zeigt keinen ausgewählten Titel mehr.

Status

Behoben. Automatisiert und manuell nachgewiesen; Übergabe an Change 07 Aufgabe 2.3 als erledigter Fachbefund.