summaryrefslogtreecommitdiff
path: root/src/buffer.rs
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2026-10-26 10:51:49 -0400
committerMica White <botahamec@outlook.com>2026-10-26 10:51:49 -0400
commit0c128e472b1b49e32c313874eaeccc8c5f1b1202 (patch)
tree2ce06455440e85ec3387f7348b7bd69bf2119634 /src/buffer.rs
parentc687e2aba30ca231b03288108b632f1bad464028 (diff)
Finish engineHEADmain
Diffstat (limited to 'src/buffer.rs')
-rw-r--r--src/buffer.rs63
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();
+ }
}
}