From af7e189bd6749e7ecfa67d8c24f79c1bb1a498b0 Mon Sep 17 00:00:00 2001 From: JJ Liebig Date: Sat, 5 Sep 2026 14:30:00 +0200 Subject: fix: retain mouse selections across unrelated terminal output (#3641) --- src/client/shell/state.rs | 3 +-- src/client/shell/tests/copy.rs | 10 ++++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'src/client') diff --git a/src/client/shell/state.rs b/src/client/shell/state.rs index 6b00e6c3..60307f66 100644 --- a/src/client/shell/state.rs +++ b/src/client/shell/state.rs @@ -1564,8 +1564,7 @@ impl ClientShellState { return false; }; previous.content_revision != next.content_revision - && (!selection.is_in_progress() - || !previous.content_revision.is_multiple_of(2) + && (!previous.content_revision.is_multiple_of(2) || !next.content_revision.is_multiple_of(2) || previous.inner_rect.width != next.inner_rect.width || previous.inner_rect.height != next.inner_rect.height diff --git a/src/client/shell/tests/copy.rs b/src/client/shell/tests/copy.rs index 64cc78e6..e8555db6 100644 --- a/src/client/shell/tests/copy.rs +++ b/src/client/shell/tests/copy.rs @@ -199,6 +199,16 @@ fn retained_mouse_selection_copies_only_on_exact_copy_shortcut() { .as_ref() .is_some_and(crate::selection::Selection::is_finalized)); + // Agent output outside the selected text must not cancel a pending copy. + let mut updated = state.pane_surface.clone().expect("pane surface"); + updated.panes[0].content_revision = 2; + updated.frame.cells[4].symbol = "-".into(); + state.set_pane_surface(updated); + assert!(state + .selection + .as_ref() + .is_some_and(crate::selection::Selection::is_finalized)); + let copy = state.handle_raw_events(vec![RawInputEvent::Key(crate::input::TerminalKey::new( KeyCode::Char('c'), KeyModifiers::CONTROL, -- cgit v1.2.3