aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-08-03 01:49:11 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-08-03 01:49:11 +0300
commitcbc31d34a1fb3da64415737de57ad10fe6af5ba5 (patch)
treea83c6c61d7e22b5ee3af17f277ca30f1ed08011b /src
parent6b6abf2d5645b368735188c93442fc08c94365d5 (diff)
fix(input): preserve hover during extended-button drags
Diffstat (limited to 'src')
-rw-r--r--src/raw_input.rs18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/raw_input.rs b/src/raw_input.rs
index 60c57af3..5bd57719 100644
--- a/src/raw_input.rs
+++ b/src/raw_input.rs
@@ -1209,7 +1209,9 @@ fn parse_mouse_cb(cb: u8) -> Option<(MouseEventKind, KeyModifiers)> {
(1, true) => MouseEventKind::Drag(MouseButton::Middle),
(2, true) => MouseEventKind::Drag(MouseButton::Right),
(3, false) => MouseEventKind::Up(MouseButton::Left),
- (3, true) | (4, true) | (5, true) => MouseEventKind::Moved,
+ // Crossterm cannot represent extended-button drags. Preserve their
+ // position as motion so a stuck host button cannot suppress hover.
+ (3, true) | (4, true) | (5, true) | (8, true) | (9, true) => MouseEventKind::Moved,
(4, false) => MouseEventKind::ScrollUp,
(5, false) => MouseEventKind::ScrollDown,
(6, false) => MouseEventKind::ScrollLeft,
@@ -1360,6 +1362,20 @@ mod tests {
}
#[test]
+ fn parses_extended_button_drag_as_mouse_motion() {
+ for input in [
+ b"\x1b[<160;20;10M".as_slice(),
+ b"\x1b[<161;20;10M".as_slice(),
+ ] {
+ let (RawInputEvent::Mouse(mouse), _) = extract_one_event(input).unwrap() else {
+ panic!("expected mouse");
+ };
+ assert_eq!(mouse.kind, MouseEventKind::Moved);
+ assert_eq!((mouse.column, mouse.row), (19, 9));
+ }
+ }
+
+ #[test]
fn parses_sgr_mouse_observable_modifiers() {
let cases = [
(b"\x1b[<8;20;10M".as_slice(), KeyModifiers::ALT),