diff --git a/yazi-fm/src/term.rs b/yazi-fm/src/term.rs index a1dddf42..803a23a8 100644 --- a/yazi-fm/src/term.rs +++ b/yazi-fm/src/term.rs @@ -34,7 +34,7 @@ impl Term { TTY.writer(), yazi_term::If(!TMUX.get(), EnterAlternateScreen), Print("\x1bP$q q\x1b\\"), // Request cursor shape (DECRQSS query for DECSCUSR) - Print(Mux::csi("\x1b[?12$p")), // Request cursor blink status (DECSET) + Print(Mux::csi("\x1b[?12$p")), // Request cursor blink status (DECRQM query for DECSET 12) Print("\x1b[?u"), // Request keyboard enhancement flags (CSI u) Print(Mux::csi("\x1b[0c")), // Request device attributes yazi_term::If(TMUX.get(), EnterAlternateScreen), diff --git a/yazi-term/src/cursor.rs b/yazi-term/src/cursor.rs index bd8b1034..5808e541 100644 --- a/yazi-term/src/cursor.rs +++ b/yazi-term/src/cursor.rs @@ -2,14 +2,13 @@ use std::sync::atomic::{AtomicBool, AtomicU8, Ordering}; use crossterm::cursor::SetCursorStyle; -static BLINK: AtomicBool = AtomicBool::new(false); static SHAPE: AtomicU8 = AtomicU8::new(0); +static BLINK: AtomicBool = AtomicBool::new(false); pub struct RestoreCursor; impl RestoreCursor { pub fn store(resp: &str) { - BLINK.store(resp.contains("\x1b[?12;1$y"), Ordering::Relaxed); SHAPE.store( resp .split_once("\x1bP1$r") @@ -18,17 +17,18 @@ impl RestoreCursor { .map_or(u8::MAX, |b| b - b'0'), Ordering::Relaxed, ); + BLINK.store(resp.contains("\x1b[?12;1$y"), Ordering::Relaxed); } } impl crossterm::Command for RestoreCursor { fn write_ansi(&self, f: &mut impl std::fmt::Write) -> std::fmt::Result { let (shape, shape_blink) = match SHAPE.load(Ordering::Relaxed) { - u8::MAX => (0, false), - n => (n.max(1).div_ceil(2), n.max(1) & 1 == 1), + u8::MAX => (0, None), + n => (n.max(1).div_ceil(2), Some(n.max(1) & 1 == 1)), }; - let blink = BLINK.load(Ordering::Relaxed) ^ shape_blink; + let blink = shape_blink.unwrap_or(BLINK.load(Ordering::Relaxed)); Ok(match shape { 2 if blink => SetCursorStyle::BlinkingUnderScore.write_ansi(f)?, 2 if !blink => SetCursorStyle::SteadyUnderScore.write_ansi(f)?,