From faee35fc44bd6cfe924410f1a3dc3b8b8eb12fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E9=9B=85=20=C2=B7=20Misaki=20Masa?= Date: Tue, 11 Mar 2025 15:19:30 +0800 Subject: [PATCH] fix: force ANSI for keyboard progressive enhancement on Windows (#2474) --- yazi-fm/src/term.rs | 18 ++++++++---------- yazi-shared/src/tty/tty.rs | 8 +++++++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/yazi-fm/src/term.rs b/yazi-fm/src/term.rs index c73a3441..78a63602 100644 --- a/yazi-fm/src/term.rs +++ b/yazi-fm/src/term.rs @@ -1,7 +1,7 @@ use std::{io, ops::{Deref, DerefMut}, sync::atomic::{AtomicBool, AtomicU8, Ordering}}; use anyhow::Result; -use crossterm::{event::{DisableBracketedPaste, EnableBracketedPaste, KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags}, execute, queue, style::Print, terminal::{LeaveAlternateScreen, SetTitle, disable_raw_mode, enable_raw_mode}}; +use crossterm::{Command, event::{DisableBracketedPaste, EnableBracketedPaste, KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags}, execute, queue, style::Print, terminal::{LeaveAlternateScreen, SetTitle, disable_raw_mode, enable_raw_mode}}; use cursor::RestoreCursor; use ratatui::{CompletedFrame, Frame, Terminal, backend::CrosstermBackend, buffer::Buffer, layout::Rect}; use yazi_adapter::{Emulator, Mux}; @@ -59,13 +59,11 @@ impl Term { ); if CSI_U.load(Ordering::Relaxed) { - queue!( - TTY.writer(), - PushKeyboardEnhancementFlags( - KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES - | KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS - ) - )?; + PushKeyboardEnhancementFlags( + KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES + | KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS, + ) + .write_ansi(&mut TTY.writer())?; } term.hide_cursor()?; @@ -76,7 +74,7 @@ impl Term { fn stop(&mut self) -> Result<()> { if CSI_U.swap(false, Ordering::Relaxed) { - execute!(TTY.writer(), PopKeyboardEnhancementFlags)?; + PopKeyboardEnhancementFlags.write_ansi(&mut TTY.writer())?; } execute!( @@ -93,7 +91,7 @@ impl Term { pub(super) fn goodbye(f: impl FnOnce() -> bool) -> ! { if CSI_U.swap(false, Ordering::Relaxed) { - execute!(TTY.writer(), PopKeyboardEnhancementFlags).ok(); + PopKeyboardEnhancementFlags.write_ansi(&mut TTY.writer()).ok(); } if !MGR.title_format.is_empty() { diff --git a/yazi-shared/src/tty/tty.rs b/yazi-shared/src/tty/tty.rs index 74690348..3da833ec 100644 --- a/yazi-shared/src/tty/tty.rs +++ b/yazi-shared/src/tty/tty.rs @@ -67,8 +67,14 @@ impl Read for TtyReader<'_> { // --- Writer pub struct TtyWriter<'a>(&'a Mutex>); -impl Write for TtyWriter<'_> { +impl std::io::Write for TtyWriter<'_> { fn write(&mut self, buf: &[u8]) -> std::io::Result { self.0.lock().write(buf) } fn flush(&mut self) -> std::io::Result<()> { self.0.lock().flush() } } + +impl std::fmt::Write for TtyWriter<'_> { + fn write_str(&mut self, s: &str) -> std::fmt::Result { + self.0.lock().write_all(s.as_bytes()).map_err(|_| std::fmt::Error) + } +}