diff options
Diffstat (limited to 'src/buffer.rs')
| -rw-r--r-- | src/buffer.rs | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/src/buffer.rs b/src/buffer.rs index 6d983db..dcb7b8b 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -1,8 +1,11 @@ -use std::io::Write; +use std::{io::Write, time::Duration}; use crossterm::{ cursor::{Hide, MoveTo, Show}, - event::{self, KeyEvent}, + event::{ + self, DisableFocusChange, DisableMouseCapture, EnableFocusChange, EnableMouseCapture, + KeyEvent, MouseEvent, + }, execute, queue, style::{ContentStyle, PrintStyledContent, StyledContent}, terminal::{ @@ -29,6 +32,8 @@ pub struct Buffer { #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum Event { Key(KeyEvent), + Mouse(MouseEvent), + FocusChanged(bool), Render, } @@ -38,6 +43,9 @@ impl TryFrom<crossterm::event::Event> for Event { fn try_from(value: crossterm::event::Event) -> Result<Self, Self::Error> { match value { crossterm::event::Event::Key(event) => Ok(Event::Key(event)), + crossterm::event::Event::Mouse(event) => Ok(Event::Mouse(event)), + crossterm::event::Event::FocusGained => Ok(Event::FocusChanged(true)), + crossterm::event::Event::FocusLost => Ok(Event::FocusChanged(false)), _ => Err(()), } } @@ -54,7 +62,13 @@ impl Buffer { fn initialize(writer: &mut impl Write) -> std::io::Result<()> { enable_raw_mode()?; - execute!(writer, Hide, EnterAlternateScreen)?; + queue!( + writer, + Hide, + EnterAlternateScreen, + EnableMouseCapture, + EnableFocusChange + )?; Ok(()) } @@ -82,7 +96,13 @@ impl Buffer { } pub fn finish(&mut self) -> std::io::Result<()> { - execute!(self.stdout, Show, LeaveAlternateScreen)?; + execute!( + self.stdout, + Show, + DisableMouseCapture, + DisableFocusChange, + LeaveAlternateScreen + )?; disable_raw_mode()?; Ok(()) } @@ -92,29 +112,18 @@ impl Buffer { mut event_handler: impl FnMut(&mut Self, Event), ) -> std::io::Result<()> { Self::initialize(&mut self.stdout)?; - let (sender, receiver) = std::sync::mpsc::channel(); - std::thread::scope(|scope| -> std::io::Result<()> { - scope.spawn(|| { - loop { - let Ok(event) = event::read() else { - continue; - }; - let _ = sender.send(event); - } - }); - loop { - puffin::profile_scope!("frame"); - while let Ok(event) = receiver.try_recv() { - if let Ok(event) = event.try_into() { - event_handler(self, event); - } - } - event_handler(self, Event::Render); - self.render()?; - puffin::GlobalProfiler::lock().new_frame(); + loop { + puffin::profile_scope!("frame"); + while matches!(event::poll(Duration::ZERO), Ok(true)) { + let Ok(event) = event::read() else { continue }; + let Ok(event) = event.try_into() else { + continue; + }; + event_handler(self, event); } - })?; - self.finish()?; - Ok(()) + event_handler(self, Event::Render); + self.render()?; + puffin::GlobalProfiler::lock().new_frame(); + } } } |
