diff --git a/src/bin/dosh-client.rs b/src/bin/dosh-client.rs index f3079bb..dcc58ed 100644 --- a/src/bin/dosh-client.rs +++ b/src/bin/dosh-client.rs @@ -5774,6 +5774,7 @@ fn stale_mouse_report_len(bytes: &[u8], offset: usize) -> Option { }, byte if byte.is_ascii_digit() => mouse_report_params_len(bytes, offset, 1) .or_else(|| orphan_mouse_suffix_len(bytes, offset)), + b'M' | b'm' if offset == 0 => orphan_leading_mouse_terminator_len(bytes, offset), _ => None, } } @@ -5810,6 +5811,13 @@ fn orphan_mouse_suffix_len(bytes: &[u8], offset: usize) -> Option { None } +fn orphan_leading_mouse_terminator_len(bytes: &[u8], offset: usize) -> Option { + if offset != 0 || !matches!(bytes.get(offset), Some(b'M' | b'm')) { + return None; + } + mouse_report_params_len(bytes, offset + 1, 1).map(|len| len + 1) +} + fn stale_mouse_report_maybe_incomplete(bytes: &[u8], offset: usize) -> bool { let Some(rest) = bytes.get(offset..) else { return false; @@ -8907,11 +8915,18 @@ mod tests { assert_eq!(strip_stale_mouse_reports(b"10m"), b""); } + #[test] + fn leading_mouse_terminator_from_split_report_is_stripped() { + assert_eq!(strip_stale_mouse_reports(b"M35;149;1Mls\r"), b"ls\r"); + assert_eq!(strip_stale_mouse_reports(b"m35;149;1Mls\r"), b"ls\r"); + } + #[test] fn numeric_semicolon_input_survives_stale_filter() { assert_eq!(strip_stale_mouse_reports(b"123;"), b"123;"); assert_eq!(strip_stale_mouse_reports(b"12;34"), b"12;34"); assert_eq!(strip_stale_mouse_reports(b"echo 1;"), b"echo 1;"); + assert_eq!(strip_stale_mouse_reports(b"make test"), b"make test"); } #[test]