diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-08-03 01:49:11 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-08-03 01:49:11 +0300 |
| commit | cbc31d34a1fb3da64415737de57ad10fe6af5ba5 (patch) | |
| tree | a83c6c61d7e22b5ee3af17f277ca30f1ed08011b /src | |
| parent | 6b6abf2d5645b368735188c93442fc08c94365d5 (diff) | |
fix(input): preserve hover during extended-button drags
Diffstat (limited to 'src')
| -rw-r--r-- | src/raw_input.rs | 18 |
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), |
