aboutsummaryrefslogtreecommitdiff
path: root/src/pane/kitty_keyboard.rs
diff options
context:
space:
mode:
authorEric Yue <jiacheng.yue@foxmail.com>2026-09-15 03:02:55 +0800
committerGitHub <noreply@github.com>2026-09-14 21:02:55 +0200
commit4c3b613c8470885df44f0844b8eaecca744c84fb (patch)
treeeaafdf24efa3203685165ec352af7cdf14b4db91 /src/pane/kitty_keyboard.rs
parent01a9733f59ef205d113359fa778ae5521ac9cc9f (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.rs29
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"));
+ }
+ }
+ }
+ }
}