fix: can't clear screen and restore cursor when exit on Windows (#525)

This commit is contained in:
三咲雅 · Misaki Masa 2024-01-17 00:12:57 +08:00 committed by GitHub
parent 1036685f91
commit 9083535741
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 13 deletions

7
scripts/publish.sh Executable file
View file

@ -0,0 +1,7 @@
cargo publish -p yazi-shared
cargo publish -p yazi-config
cargo publish -p yazi-adaptor
cargo publish -p yazi-scheduler
cargo publish -p yazi-plugin
cargo publish -p yazi-core
cargo publish -p yazi-fm

View file

@ -1,23 +1,21 @@
use std::{io::{stdout, Stdout, Write}, mem, ops::{Deref, DerefMut}}; use std::{io::{stdout, Stdout, Write}, mem, ops::{Deref, DerefMut}, sync::atomic::{AtomicBool, Ordering}};
use anyhow::Result; use anyhow::Result;
use crossterm::{event::{DisableBracketedPaste, DisableFocusChange, EnableBracketedPaste, EnableFocusChange, KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags}, execute, queue, terminal::{disable_raw_mode, enable_raw_mode, supports_keyboard_enhancement, Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen, WindowSize}}; use crossterm::{event::{DisableBracketedPaste, DisableFocusChange, EnableBracketedPaste, EnableFocusChange, KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags}, execute, queue, terminal::{disable_raw_mode, enable_raw_mode, supports_keyboard_enhancement, Clear, ClearType, EnterAlternateScreen, LeaveAlternateScreen, WindowSize}};
use ratatui::{backend::CrosstermBackend, Terminal}; use ratatui::{backend::CrosstermBackend, Terminal};
pub struct Term { static CSI_U: AtomicBool = AtomicBool::new(false);
inner: Terminal<CrosstermBackend<Stdout>>,
csi_u: bool, pub struct Term(Terminal<CrosstermBackend<Stdout>>);
}
impl Term { impl Term {
pub fn start() -> Result<Self> { pub fn start() -> Result<Self> {
let mut term = Self { inner: Terminal::new(CrosstermBackend::new(stdout()))?, csi_u: false }; let mut term = Self(Terminal::new(CrosstermBackend::new(stdout()))?);
enable_raw_mode()?; enable_raw_mode()?;
execute!(stdout(), EnterAlternateScreen, EnableBracketedPaste, EnableFocusChange)?; queue!(stdout(), EnterAlternateScreen, EnableBracketedPaste, EnableFocusChange)?;
term.csi_u = matches!(supports_keyboard_enhancement(), Ok(true)); if let Ok(true) = supports_keyboard_enhancement() {
if term.csi_u {
queue!( queue!(
stdout(), stdout(),
PushKeyboardEnhancementFlags( PushKeyboardEnhancementFlags(
@ -25,15 +23,17 @@ impl Term {
| KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS | KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS
) )
)?; )?;
CSI_U.store(true, Ordering::Relaxed);
} }
term.hide_cursor()?; term.hide_cursor()?;
term.clear()?; term.clear()?;
term.flush()?;
Ok(term) Ok(term)
} }
fn stop(&mut self) -> Result<()> { fn stop(&mut self) -> Result<()> {
if self.csi_u { if CSI_U.swap(false, Ordering::Relaxed) {
execute!(stdout(), PopKeyboardEnhancementFlags)?; execute!(stdout(), PopKeyboardEnhancementFlags)?;
} }
@ -50,9 +50,12 @@ impl Term {
} }
pub fn goodbye(f: impl FnOnce() -> bool) -> ! { pub fn goodbye(f: impl FnOnce() -> bool) -> ! {
if CSI_U.swap(false, Ordering::Relaxed) {
execute!(stdout(), PopKeyboardEnhancementFlags).ok();
}
execute!( execute!(
stdout(), stdout(),
PopKeyboardEnhancementFlags,
DisableFocusChange, DisableFocusChange,
DisableBracketedPaste, DisableBracketedPaste,
LeaveAlternateScreen, LeaveAlternateScreen,
@ -109,9 +112,9 @@ impl Drop for Term {
impl Deref for Term { impl Deref for Term {
type Target = Terminal<CrosstermBackend<Stdout>>; type Target = Terminal<CrosstermBackend<Stdout>>;
fn deref(&self) -> &Self::Target { &self.inner } fn deref(&self) -> &Self::Target { &self.0 }
} }
impl DerefMut for Term { impl DerefMut for Term {
fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } fn deref_mut(&mut self) -> &mut Self::Target { &mut self.0 }
} }