From 11dc4d104b21b75d63e10e42ea4ee767c7bd5fdf Mon Sep 17 00:00:00 2001 From: sigoden Date: Tue, 7 Mar 2023 11:51:52 +0800 Subject: refactor: optimize ctrl+c/ctrl+d abort handling (#27) --- src/render/mod.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/render/mod.rs') diff --git a/src/render/mod.rs b/src/render/mod.rs index d9fcc95..b6e28f7 100644 --- a/src/render/mod.rs +++ b/src/render/mod.rs @@ -1,7 +1,7 @@ mod markdown; pub use self::markdown::MarkdownRender; -use crate::repl::ReplyStreamEvent; +use crate::repl::{ReplyStreamEvent, SharedAbortSignal}; use anyhow::Result; use crossbeam::channel::Receiver; @@ -13,20 +13,16 @@ use crossterm::{ }; use std::{ io::{self, Stdout, Write}, - sync::{ - atomic::{AtomicBool, Ordering}, - Arc, - }, time::{Duration, Instant}, }; use unicode_width::UnicodeWidthStr; -pub fn render_stream(rx: Receiver, ctrlc: Arc) -> Result<()> { +pub fn render_stream(rx: Receiver, abort: SharedAbortSignal) -> Result<()> { enable_raw_mode()?; let mut stdout = io::stdout(); queue!(stdout, event::DisableMouseCapture)?; - let ret = render_stream_inner(rx, ctrlc, &mut stdout); + let ret = render_stream_inner(rx, abort, &mut stdout); queue!(stdout, event::DisableMouseCapture)?; disable_raw_mode()?; @@ -36,7 +32,7 @@ pub fn render_stream(rx: Receiver, ctrlc: Arc) -> pub fn render_stream_inner( rx: Receiver, - ctrlc: Arc, + abort: SharedAbortSignal, writer: &mut Stdout, ) -> Result<()> { let mut last_tick = Instant::now(); @@ -45,7 +41,7 @@ pub fn render_stream_inner( let mut markdown_render = MarkdownRender::new(); let terminal_columns = terminal::size()?.0; loop { - if ctrlc.load(Ordering::SeqCst) { + if abort.aborted() { return Ok(()); } @@ -89,7 +85,11 @@ pub fn render_stream_inner( if let Event::Key(key) = event::read()? { match key.code { KeyCode::Char('c') if key.modifiers == KeyModifiers::CONTROL => { - ctrlc.store(true, Ordering::SeqCst); + abort.set_ctrlc(); + return Ok(()); + } + KeyCode::Char('d') if key.modifiers == KeyModifiers::CONTROL => { + abort.set_ctrld(); return Ok(()); } _ => {} -- cgit v1.2.3