aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-14 23:23:19 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-14 23:26:02 +0300
commit464c658fdd3a9257b1eb5095b0ae024a306b29ee (patch)
tree30ed49f5ec85c296ec0ed5c3580b1d0795de58c3 /src/client
parent30232287361f753d071ecd6bca7b9dda276ec0f9 (diff)
fix: reassemble split sgr mouse input
refs #1382
Diffstat (limited to 'src/client')
-rw-r--r--src/client/input.rs39
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);
}
}