From 9083535741a70d9243dac72dd8347dd832616b86 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: Wed, 17 Jan 2024 00:12:57 +0800 Subject: [PATCH] fix: can't clear screen and restore cursor when exit on Windows (#525) --- scripts/publish.sh | 7 +++++++ yazi-shared/src/term/term.rs | 29 ++++++++++++++++------------- 2 files changed, 23 insertions(+), 13 deletions(-) create mode 100755 scripts/publish.sh diff --git a/scripts/publish.sh b/scripts/publish.sh new file mode 100755 index 00000000..dcb6ba0f --- /dev/null +++ b/scripts/publish.sh @@ -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 diff --git a/yazi-shared/src/term/term.rs b/yazi-shared/src/term/term.rs index 55124f39..67ae7315 100644 --- a/yazi-shared/src/term/term.rs +++ b/yazi-shared/src/term/term.rs @@ -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 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}; -pub struct Term { - inner: Terminal>, - csi_u: bool, -} +static CSI_U: AtomicBool = AtomicBool::new(false); + +pub struct Term(Terminal>); impl Term { pub fn start() -> Result { - 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()?; - execute!(stdout(), EnterAlternateScreen, EnableBracketedPaste, EnableFocusChange)?; + queue!(stdout(), EnterAlternateScreen, EnableBracketedPaste, EnableFocusChange)?; - term.csi_u = matches!(supports_keyboard_enhancement(), Ok(true)); - if term.csi_u { + if let Ok(true) = supports_keyboard_enhancement() { queue!( stdout(), PushKeyboardEnhancementFlags( @@ -25,15 +23,17 @@ impl Term { | KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS ) )?; + CSI_U.store(true, Ordering::Relaxed); } term.hide_cursor()?; term.clear()?; + term.flush()?; Ok(term) } fn stop(&mut self) -> Result<()> { - if self.csi_u { + if CSI_U.swap(false, Ordering::Relaxed) { execute!(stdout(), PopKeyboardEnhancementFlags)?; } @@ -50,9 +50,12 @@ impl Term { } pub fn goodbye(f: impl FnOnce() -> bool) -> ! { + if CSI_U.swap(false, Ordering::Relaxed) { + execute!(stdout(), PopKeyboardEnhancementFlags).ok(); + } + execute!( stdout(), - PopKeyboardEnhancementFlags, DisableFocusChange, DisableBracketedPaste, LeaveAlternateScreen, @@ -109,9 +112,9 @@ impl Drop for Term { impl Deref for Term { type Target = Terminal>; - fn deref(&self) -> &Self::Target { &self.inner } + fn deref(&self) -> &Self::Target { &self.0 } } 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 } }