mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
fix: can't clear screen and restore cursor when exit on Windows (#525)
This commit is contained in:
parent
1036685f91
commit
9083535741
2 changed files with 23 additions and 13 deletions
7
scripts/publish.sh
Executable file
7
scripts/publish.sh
Executable 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
|
||||||
|
|
@ -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 }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue