aboutsummaryrefslogtreecommitdiff
path: root/src/pane
diff options
context:
space:
mode:
authorakbash <akbash@herdr.dev>2026-08-20 00:41:32 +0300
committerGitHub <noreply@github.com>2026-08-20 00:41:32 +0300
commit52960ea5b6ee5d194d38cb1484c8bbed2f8bba98 (patch)
treeaeba075003eff44e1f14f24f52174a4d5e60885f /src/pane
parent4d17957c43938ef49aaf395fa8ff954c604e0e35 (diff)
fix(input): preserve mouse forwarding through handoff (#3002)
refs #3000 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Diffstat (limited to 'src/pane')
-rw-r--r--src/pane/terminal.rs64
1 files changed, 25 insertions, 39 deletions
diff --git a/src/pane/terminal.rs b/src/pane/terminal.rs
index 0b06302e..f1c6e2e5 100644
--- a/src/pane/terminal.rs
+++ b/src/pane/terminal.rs
@@ -1489,49 +1489,28 @@ impl GhosttyPaneTerminal {
input_state.color_scheme_reporting,
);
- for mode in [
- MODE_MOUSE_X10,
- MODE_MOUSE_PRESS_RELEASE,
- MODE_MOUSE_BUTTON_MOTION,
- MODE_MOUSE_ANY_MOTION,
- ] {
- let _ = core.terminal.mode_set(mode, false);
- }
- let mouse_mode = match input_state.mouse_protocol_mode {
+ core.terminal
+ .write(b"\x1b[?9l\x1b[?1000l\x1b[?1002l\x1b[?1003l");
+ let mouse_mode_ansi: Option<&[u8]> = match input_state.mouse_protocol_mode {
crate::input::MouseProtocolMode::None => None,
- crate::input::MouseProtocolMode::Press => Some(MODE_MOUSE_X10),
- crate::input::MouseProtocolMode::PressRelease => Some(MODE_MOUSE_PRESS_RELEASE),
- crate::input::MouseProtocolMode::ButtonMotion => Some(MODE_MOUSE_BUTTON_MOTION),
- crate::input::MouseProtocolMode::AnyMotion => Some(MODE_MOUSE_ANY_MOTION),
+ crate::input::MouseProtocolMode::Press => Some(b"\x1b[?9h"),
+ crate::input::MouseProtocolMode::PressRelease => Some(b"\x1b[?1000h"),
+ crate::input::MouseProtocolMode::ButtonMotion => Some(b"\x1b[?1002h"),
+ crate::input::MouseProtocolMode::AnyMotion => Some(b"\x1b[?1003h"),
};
- if let Some(mode) = mouse_mode {
- let _ = core.terminal.mode_set(mode, true);
+ if let Some(ansi) = mouse_mode_ansi {
+ core.terminal.write(ansi);
}
- let _ = core
- .terminal
- .mode_set(crate::ghostty::MODE_MOUSE_UTF8, false);
- let _ = core
- .terminal
- .mode_set(crate::ghostty::MODE_MOUSE_SGR, false);
- let _ = core
- .terminal
- .mode_set(crate::ghostty::MODE_MOUSE_SGR_PIXELS, false);
- match input_state.mouse_protocol_encoding {
- crate::input::MouseProtocolEncoding::Default => {}
- crate::input::MouseProtocolEncoding::Utf8 => {
- let _ = core
- .terminal
- .mode_set(crate::ghostty::MODE_MOUSE_UTF8, true);
- }
- crate::input::MouseProtocolEncoding::Sgr => {
- let _ = core.terminal.mode_set(crate::ghostty::MODE_MOUSE_SGR, true);
- }
- crate::input::MouseProtocolEncoding::SgrPixels => {
- let _ = core
- .terminal
- .mode_set(crate::ghostty::MODE_MOUSE_SGR_PIXELS, true);
- }
+ core.terminal.write(b"\x1b[?1005l\x1b[?1006l\x1b[?1016l");
+ let mouse_encoding_ansi: Option<&[u8]> = match input_state.mouse_protocol_encoding {
+ crate::input::MouseProtocolEncoding::Default => None,
+ crate::input::MouseProtocolEncoding::Utf8 => Some(b"\x1b[?1005h"),
+ crate::input::MouseProtocolEncoding::Sgr => Some(b"\x1b[?1006h"),
+ crate::input::MouseProtocolEncoding::SgrPixels => Some(b"\x1b[?1016h"),
+ };
+ if let Some(ansi) = mouse_encoding_ansi {
+ core.terminal.write(ansi);
}
if input_state.modify_other_keys {
@@ -4510,6 +4489,13 @@ mod tests {
let key = crate::input::parse_terminal_key_sequence("\x1b[13;2u").unwrap();
let encoded = pane.encode_terminal_key(key.clone(), crate::input::KeyboardProtocol::Legacy);
assert_eq!(encoded, b"\x1b[27;2;13~");
+
+ let encoded = pane.encode_mouse_wheel(
+ crossterm::event::MouseEventKind::ScrollUp,
+ crate::input::mouse::Position::Cell { column: 11, row: 9 },
+ crossterm::event::KeyModifiers::empty(),
+ );
+ assert_eq!(encoded.as_deref(), Some(&b"\x1b[<64;12;10M"[..]));
}
#[test]