From ca14500717864b1c9b1885cbbc6a451a19b9caf8 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Mon, 30 Mar 2026 04:12:56 +0300 Subject: refactor keyboard protocol parsing and forwarding --- src/pty_callbacks.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/pty_callbacks.rs') diff --git a/src/pty_callbacks.rs b/src/pty_callbacks.rs index 113dbc89..44000701 100644 --- a/src/pty_callbacks.rs +++ b/src/pty_callbacks.rs @@ -8,7 +8,7 @@ //! don't need responses. Only QUERY sequences need us to reply. use std::sync::{ - atomic::{AtomicBool, Ordering}, + atomic::{AtomicBool, AtomicU16, Ordering}, Arc, Mutex, }; @@ -23,8 +23,10 @@ pub struct PtyResponses { /// pops → fish's mode 1 is restored). kitty_stack: Arc>>, /// Derived from kitty_stack: true when stack is non-empty. - /// Shared with PaneRuntime for fast-path key encoding decisions. + /// Kept for quick feature checks. pub kitty_keyboard: Arc, + /// Exact active kitty keyboard flags from the top of the stack. + pub kitty_keyboard_flags: Arc, } impl PtyResponses { @@ -123,6 +125,7 @@ impl vt100::Callbacks for PtyResponses { let mut stack = self.kitty_stack.lock().unwrap(); stack.push(param0); self.kitty_keyboard.store(true, Ordering::Relaxed); + self.kitty_keyboard_flags.store(param0, Ordering::Relaxed); } // Kitty keyboard pop: \e[1u"); assert!(r.kitty_keyboard.load(Ordering::Relaxed)); + assert_eq!(r.kitty_keyboard_flags.load(Ordering::Relaxed), 1); p.process(b"\x1b[?u"); assert_eq!(r.take(), b"\x1b[?1u"); // Neovim pushes mode 3 p.process(b"\x1b[>3u"); assert!(r.kitty_keyboard.load(Ordering::Relaxed)); + assert_eq!(r.kitty_keyboard_flags.load(Ordering::Relaxed), 3); p.process(b"\x1b[?u"); assert_eq!(r.take(), b"\x1b[?3u"); // Neovim pops → fish's mode 1 is restored p.process(b"\x1b[3u"); p.process(b"\x1b[>5u"); assert!(r.kitty_keyboard.load(Ordering::Relaxed)); + assert_eq!(r.kitty_keyboard_flags.load(Ordering::Relaxed), 5); // Pop 2 at once p.process(b"\x1b[<2u"); assert!(r.kitty_keyboard.load(Ordering::Relaxed)); + assert_eq!(r.kitty_keyboard_flags.load(Ordering::Relaxed), 1); p.process(b"\x1b[?u"); assert_eq!(r.take(), b"\x1b[?1u"); // only first push remains // Pop last one p.process(b"\x1b[