From 8fae7d2bf1666ef7187d120ec1a6f7d51084437d Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 28 May 2022 19:05:31 +0200 Subject: [PATCH] Return Redraw enum instead of bool Boolean values were too easy to accidentally interpret the wrong way. --- examples/hello_world.rs | 35 ++++++++++++++++++------------- examples/overlapping_graphemes.rs | 35 ++++++++++++++++++------------- src/terminal.rs | 12 ++++++++--- 3 files changed, 51 insertions(+), 31 deletions(-) diff --git a/examples/hello_world.rs b/examples/hello_world.rs index 13c1475..57cc976 100644 --- a/examples/hello_world.rs +++ b/examples/hello_world.rs @@ -1,8 +1,7 @@ -use std::io; - +use crossterm::event::Event; use crossterm::style::{ContentStyle, Stylize}; use toss::frame::{Frame, Pos}; -use toss::terminal::Terminal; +use toss::terminal::{Redraw, Terminal}; fn draw(f: &mut Frame) { f.write( @@ -18,24 +17,32 @@ fn draw(f: &mut Frame) { f.show_cursor(Pos::new(16, 0)); } -fn main() -> io::Result<()> { - // Automatically enters alternate screen and enables raw mode - let mut term = Terminal::new()?; - +fn render_frame(term: &mut Terminal) { loop { // Must be called before rendering, otherwise the terminal has out-of-date // size information and will present garbage. - term.autoresize()?; + term.autoresize().unwrap(); draw(term.frame()); - if !term.present()? { + if term.present().unwrap() == Redraw::NotRequired { + break; + } + } +} + +fn main() { + // Automatically enters alternate screen and enables raw mode + let mut term = Terminal::new().unwrap(); + + loop { + // Render and display a frame. A full frame is displayed on the terminal + // once this function exits. + render_frame(&mut term); + + // Exit if the user presses any buttons + if !matches!(crossterm::event::read().unwrap(), Event::Resize(_, _)) { break; } } - - // Wait for input before exiting - let _ = crossterm::event::read(); - - Ok(()) } diff --git a/examples/overlapping_graphemes.rs b/examples/overlapping_graphemes.rs index 67b6a31..db98bae 100644 --- a/examples/overlapping_graphemes.rs +++ b/examples/overlapping_graphemes.rs @@ -1,8 +1,7 @@ -use std::io; - +use crossterm::event::Event; use crossterm::style::{ContentStyle, Stylize}; use toss::frame::{Frame, Pos}; -use toss::terminal::Terminal; +use toss::terminal::{Redraw, Terminal}; fn draw(f: &mut Frame) { f.write( @@ -58,24 +57,32 @@ fn draw(f: &mut Frame) { } } -fn main() -> io::Result<()> { - // Automatically enters alternate screen and enables raw mode - let mut term = Terminal::new()?; - +fn render_frame(term: &mut Terminal) { loop { // Must be called before rendering, otherwise the terminal has out-of-date // size information and will present garbage. - term.autoresize()?; + term.autoresize().unwrap(); draw(term.frame()); - if !term.present()? { + if term.present().unwrap() == Redraw::NotRequired { + break; + } + } +} + +fn main() { + // Automatically enters alternate screen and enables raw mode + let mut term = Terminal::new().unwrap(); + + loop { + // Render and display a frame. A full frame is displayed on the terminal + // once this function exits. + render_frame(&mut term); + + // Exit if the user presses any buttons + if !matches!(crossterm::event::read().unwrap(), Event::Resize(_, _)) { break; } } - - // Wait for input before exiting - let _ = crossterm::event::read(); - - Ok(()) } diff --git a/src/terminal.rs b/src/terminal.rs index 2f2b35f..eb5645e 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -11,6 +11,12 @@ use crossterm::{ExecutableCommand, QueueableCommand}; use crate::buffer::{Buffer, Size}; use crate::frame::Frame; +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Redraw { + Required, + NotRequired, +} + pub struct Terminal { /// Render target. out: Box, @@ -71,7 +77,7 @@ impl Terminal { /// /// After calling this function, the frame returned by [`Self::frame`] will /// be empty again and have no cursor position. - pub fn present(&mut self) -> io::Result { + pub fn present(&mut self) -> io::Result { if self.frame.widthdb.measuring_required() { self.frame.widthdb.measure_widths(&mut self.out)?; // Since we messed up the screen by measuring widths, we'll need to @@ -81,7 +87,7 @@ impl Terminal { // with unconfirmed width data. Also, this function guarantees that // after it is called, the frame is empty. self.frame.reset(); - return Ok(true); + return Ok(Redraw::Required); } if self.full_redraw { @@ -97,7 +103,7 @@ impl Terminal { mem::swap(&mut self.prev_frame_buffer, &mut self.frame.buffer); self.frame.reset(); - Ok(false) + Ok(Redraw::NotRequired) } fn draw_differences(&mut self) -> io::Result<()> {