diff options
| author | Eric Yue <jiacheng.yue@foxmail.com> | 2026-09-15 03:02:55 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-14 21:02:55 +0200 |
| commit | 4c3b613c8470885df44f0844b8eaecca744c84fb (patch) | |
| tree | eaafdf24efa3203685165ec352af7cdf14b4db91 /src/pane/kitty_keyboard.rs | |
| parent | 01a9733f59ef205d113359fa778ae5521ac9cc9f (diff) | |
fix: keep modified enter compatible with legacy panes (#4110)
* fix: keep modified enter compatible with legacy panes
refs #4103
* fix: synchronize modified key negotiation state
refs #4103
* test: cover windows legacy modified enter
refs #4103
---------
Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com>
Diffstat (limited to 'src/pane/kitty_keyboard.rs')
| -rw-r--r-- | src/pane/kitty_keyboard.rs | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/pane/kitty_keyboard.rs b/src/pane/kitty_keyboard.rs index 74de2538..bc8876e6 100644 --- a/src/pane/kitty_keyboard.rs +++ b/src/pane/kitty_keyboard.rs @@ -53,7 +53,6 @@ impl KittyKeyboardTracker { match bytes[end] { b'u' => self.observe_csi_u(&bytes[index + 2..end]), b'm' => self.observe_modify_other_keys(&bytes[index + 2..end]), - #[cfg(windows)] b'n' if bytes[index + 2..end] .strip_prefix(b">") .is_some_and(|params| { @@ -210,4 +209,32 @@ mod tests { tracker.observe(b"\x1b[>4;0m"); assert_eq!(tracker.modify_other_keys_level(), 0); } + + #[test] + fn modify_other_keys_disable_clears_state_across_chunks() { + for level in [1, 2] { + for sequence in [b"\x1b[>4n".as_slice(), b"\x1b[>04n".as_slice()] { + for split in 0..=sequence.len() { + let mut tracker = KittyKeyboardTracker::default(); + tracker.observe(b"\x1b[>5u"); + tracker.observe(format!("\x1b[>4;{level}m").as_bytes()); + tracker.observe(b"\x1b[4n\x1b[>1n\x1b[>4;2n"); + assert_eq!(tracker.modify_other_keys_level(), level); + + tracker.observe(&sequence[..split]); + tracker.observe(&sequence[split..]); + + assert_eq!( + tracker.modify_other_keys_level(), + 0, + "mode {level}, sequence {sequence:?}, split {split}" + ); + assert_eq!(tracker.flags, 5); + assert_eq!(tracker.stack, vec![0]); + #[cfg(unix)] + assert_eq!(tracker.replay_ansi().as_deref(), Some("\x1b[>5u")); + } + } + } + } } |
