Upgrade TUI stack: ratatui 0.30, crossterm 0.29, portable-pty 0.9, vt100 0.16

- Capture OSC 0/2 window title in scan_osc_sequences since vt100 0.16
  no longer exposes Screen::title()
- Remove committed build artifacts (testapps/mouse-test/target) and
  extend .gitignore

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 19:31:41 +02:00
parent 339ad9530e
commit b8d6a18a2e
194 changed files with 1112 additions and 2688 deletions

View File

@@ -548,8 +548,12 @@ impl App {
for resp in responses {
let _ = pty.write_input(&resp);
}
// Scanna för OSC-sekvenser (clipboard, etc.)
scan_osc_sequences(&data);
// Scanna för OSC-sekvenser (titel, clipboard, etc.)
// vt100 0.16 exponerar inte längre titeln på Screen,
// så vi fångar OSC 0/2 själva här.
if let Some(t) = scan_osc_sequences(&data) {
*title = t;
}
// Extrahera Kitty graphics-sekvenser och bearbeta resten genom parsern
let gfx = process_pty_with_kitty_gfx(
&data,
@@ -566,11 +570,6 @@ impl App {
}
}
}
// Uppdatera fönsterrubrik från OSC 0/2 om programmet satte en
let osc_title = parser.screen().title();
if !osc_title.is_empty() {
*title = osc_title.to_string();
}
}
// ── PTY resize om fönsterstorlek ändrats ─────────────────────────────
@@ -1639,9 +1638,12 @@ fn scan_terminal_queries(data: &[u8], parser: &vt100::Parser) -> Vec<Vec<u8>> {
/// Skannar rå PTY-data efter OSC-sekvenser.
/// Hanterar:
/// OSC 0/2 (fönstertitel) → returneras så fönsterrubriken kan uppdateras
/// OSC 52 (clipboard copy) → skickar vidare till värdterminalen via stdout
/// OSC 11 (query bg color) → svarar med standardfärg
fn scan_osc_sequences(data: &[u8]) {
/// Returnerar senast satta fönstertitel i chunken, om någon.
fn scan_osc_sequences(data: &[u8]) -> Option<String> {
let mut new_title = None;
let mut i = 0;
while i < data.len() {
// OSC startar med ESC ] eller 0x9d
@@ -1663,6 +1665,12 @@ fn scan_osc_sequences(data: &[u8]) {
}
if let Some(term_pos) = end {
if let Ok(payload) = std::str::from_utf8(&data[osc_start..term_pos]) {
// OSC 0;<titel> / OSC 2;<titel> → fönstertitel
if let Some(t) = payload.strip_prefix("0;").or_else(|| payload.strip_prefix("2;")) {
if !t.is_empty() {
new_title = Some(t.to_string());
}
}
// OSC 52;c;<base64-data> → clipboard copy
if payload.starts_with("52;") {
// Vidarebefordra till värdterminalen
@@ -1681,6 +1689,7 @@ fn scan_osc_sequences(data: &[u8]) {
i += 1;
}
}
new_title
}
/// Skannar ett chunk av r\u00e5 PTY-data efter DEC private mode escape-sekvenser som