fix: force ANSI for keyboard progressive enhancement on Windows (#2474)

This commit is contained in:
三咲雅 · Misaki Masa 2025-03-11 15:19:30 +08:00 committed by GitHub
parent a0c6842626
commit faee35fc44
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 15 additions and 11 deletions

View file

@ -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() {

View file

@ -67,8 +67,14 @@ impl Read for TtyReader<'_> {
// --- Writer
pub struct TtyWriter<'a>(&'a Mutex<BufWriter<Handle>>);
impl Write for TtyWriter<'_> {
impl std::io::Write for TtyWriter<'_> {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { 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)
}
}