Skip to content

Commit 74fc8b4

Browse files
committed
Isolate terminal probe parser
1 parent 737450c commit 74fc8b4

2 files changed

Lines changed: 47 additions & 4 deletions

File tree

crates/edit/src/bin/edit/main.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,9 @@ fn run() -> apperr::Result<()> {
8787
// As such, we call this after `handle_args`.
8888
sys::switch_modes()?;
8989

90-
let mut vt_parser = vt::Parser::new();
91-
let mut input_parser = input::Parser::new();
9290
let mut tui = Tui::new()?;
9391

94-
let _restore = setup_terminal(&mut tui, &mut state, &mut vt_parser);
92+
let _restore = setup_terminal(&mut tui, &mut state);
9593

9694
state.menubar_color_bg = tui.indexed(IndexedColor::Background).oklab_blend(tui.indexed_alpha(
9795
IndexedColor::BrightBlue,
@@ -115,6 +113,11 @@ fn run() -> apperr::Result<()> {
115113

116114
sys::inject_window_size_into_stdin();
117115

116+
// Startup probing may leave partial terminal responses in the probe parser.
117+
// Start application input parsing with an independent parser lifecycle.
118+
let mut vt_parser = vt::Parser::new();
119+
let mut input_parser = input::Parser::new();
120+
118121
#[cfg(feature = "debug-latency")]
119122
let mut last_latency_width = 0;
120123

@@ -565,7 +568,7 @@ impl Drop for RestoreModes {
565568
}
566569
}
567570

568-
fn setup_terminal(tui: &mut Tui, state: &mut State, vt_parser: &mut vt::Parser) -> RestoreModes {
571+
fn setup_terminal(tui: &mut Tui, state: &mut State) -> RestoreModes {
569572
sys::write_stdout(concat!(
570573
// 1049: Alternative Screen Buffer
571574
// I put the ASB switch in the beginning, just in case the terminal performs
@@ -597,6 +600,7 @@ fn setup_terminal(tui: &mut Tui, state: &mut State, vt_parser: &mut vt::Parser)
597600
let mut indexed_colors = framebuffer::DEFAULT_THEME;
598601
let mut color_responses = 0;
599602
let mut ambiguous_width = 1;
603+
let mut vt_parser = vt::Parser::new();
600604

601605
while !done {
602606
let scratch = scratch_arena(None);

crates/edit/src/input.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,3 +592,42 @@ impl<'input> Stream<'_, '_, 'input> {
592592
Some(Input::Mouse(mouse))
593593
}
594594
}
595+
596+
#[cfg(test)]
597+
mod tests {
598+
use super::*;
599+
600+
fn parse_resize<'a>(
601+
vt_parser: &mut vt::Parser,
602+
input_parser: &mut Parser,
603+
input: &'a str,
604+
) -> Option<Size> {
605+
input_parser.parse(vt_parser.parse(input)).find_map(|input| match input {
606+
Input::Resize(size) => Some(size),
607+
_ => None,
608+
})
609+
}
610+
611+
#[test]
612+
fn partial_osc_parser_state_does_not_emit_resize() {
613+
let mut vt_parser = vt::Parser::new();
614+
let mut stream = vt_parser.parse("\x1b]4;0;rgb:0c0c/0c0c/0c0c\x1b");
615+
while stream.next().is_some() {}
616+
drop(stream);
617+
618+
let mut input_parser = Parser::new();
619+
let resize = parse_resize(&mut vt_parser, &mut input_parser, "\x1b[8;40;127t");
620+
621+
assert_eq!(resize, None);
622+
}
623+
624+
#[test]
625+
fn fresh_parser_parses_synthetic_resize() {
626+
let mut vt_parser = vt::Parser::new();
627+
let mut input_parser = Parser::new();
628+
629+
let resize = parse_resize(&mut vt_parser, &mut input_parser, "\x1b[8;40;127t");
630+
631+
assert_eq!(resize, Some(Size { width: 127, height: 40 }));
632+
}
633+
}

0 commit comments

Comments
 (0)