diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-14 23:23:19 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-14 23:26:02 +0300 |
| commit | 464c658fdd3a9257b1eb5095b0ae024a306b29ee (patch) | |
| tree | 30ed49f5ec85c296ec0ed5c3580b1d0795de58c3 /src/client | |
| parent | 30232287361f753d071ecd6bca7b9dda276ec0f9 (diff) | |
fix: reassemble split sgr mouse input
refs #1382
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/input.rs | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/src/client/input.rs b/src/client/input.rs index bc7faf35..a49c4316 100644 --- a/src/client/input.rs +++ b/src/client/input.rs @@ -133,8 +133,10 @@ fn idle_flush_timeout_ms( framer: &crate::raw_input::RawInputByteFramer, host_mouse_capture_active: bool, ) -> i32 { - if host_mouse_capture_active && framer.has_pending_lone_escape() { - crate::raw_input::MOUSE_ACTIVE_LONE_ESCAPE_FLUSH_TIMEOUT_MS + if host_mouse_capture_active + && (framer.has_pending_lone_escape() || framer.has_pending_incomplete_sgr_mouse_sequence()) + { + crate::raw_input::MOUSE_ACTIVE_ESCAPE_SEQUENCE_FLUSH_TIMEOUT_MS } else { crate::raw_input::RAW_INPUT_IDLE_FLUSH_TIMEOUT_MS } @@ -402,20 +404,33 @@ mod tests { } #[test] - fn mouse_active_lone_escape_gets_longer_reassembly_window() { - let mut framer = crate::raw_input::RawInputByteFramer::default(); - assert!(framer.push(b"\x1b").is_empty()); - + fn mouse_active_escape_sequences_get_longer_reassembly_window() { + let mut escape = crate::raw_input::RawInputByteFramer::default(); + assert!(escape.push(b"\x1b").is_empty()); + let mut mouse = crate::raw_input::RawInputByteFramer::default(); + assert!(mouse.push(b"\x1b[<3").is_empty()); + let mut unrelated = crate::raw_input::RawInputByteFramer::default(); + assert!(unrelated.push(b"\x1b[49:33;2:").is_empty()); + + for framer in [&escape, &mouse, &unrelated] { + assert_eq!( + idle_flush_timeout_ms(framer, false), + crate::raw_input::RAW_INPUT_IDLE_FLUSH_TIMEOUT_MS + ); + } + for framer in [&escape, &mouse] { + assert_eq!( + idle_flush_timeout_ms(framer, true), + crate::raw_input::MOUSE_ACTIVE_ESCAPE_SEQUENCE_FLUSH_TIMEOUT_MS + ); + } assert_eq!( - idle_flush_timeout_ms(&framer, false), + idle_flush_timeout_ms(&unrelated, true), crate::raw_input::RAW_INPUT_IDLE_FLUSH_TIMEOUT_MS ); - assert_eq!( - idle_flush_timeout_ms(&framer, true), - crate::raw_input::MOUSE_ACTIVE_LONE_ESCAPE_FLUSH_TIMEOUT_MS - ); + let mouse_timeout_ms = - std::hint::black_box(crate::raw_input::MOUSE_ACTIVE_LONE_ESCAPE_FLUSH_TIMEOUT_MS); + std::hint::black_box(crate::raw_input::MOUSE_ACTIVE_ESCAPE_SEQUENCE_FLUSH_TIMEOUT_MS); assert!(mouse_timeout_ms > 100); } } |
