diff --git a/Cargo.toml b/Cargo.toml index 8bdaf66..94a4276 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,8 @@ [package] name = "tlock" -version = "0.0.1" +version = "0.1.0" edition = "2021" +[dependencies] +crossterm = "0.27.0" + diff --git a/src/main.rs b/src/main.rs index bff1fe9..f93fce2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,77 @@ -use std::time::SystemTime; +use std::{ + io::{self, Write}, + thread, + time::Duration, +}; -fn main() { - println!("{:?}", SystemTime::now()); +use crossterm::{ + cursor, + event::{self, Event, KeyCode, KeyModifiers}, + execute, queue, + style::{self, Color}, + terminal::{self, ClearType}, +}; + +fn main() -> io::Result<()> { + let mut stdout = io::stdout(); + + // Switch to alternate screen, hide the cursor and enable raw mode + execute!(stdout, terminal::EnterAlternateScreen, cursor::Hide)?; + let _ = terminal::enable_raw_mode()?; + + // Main loop + let mut quit = false; + while !quit { + // Handle events + while event::poll(Duration::ZERO)? { + match event::read()? { + Event::Key(e) => match e.code { + KeyCode::Char(x) => { + // Handle CTRL-C + if x == 'c' && e.modifiers.contains(KeyModifiers::CONTROL) { + quit = true; + } + } + _ => {} + }, + _ => {} + } + } + + // Clear frame + queue!(stdout, terminal::Clear(ClearType::All))?; + + // Render + render_frame()?; + + stdout.flush()?; + + // 30fps + thread::sleep(Duration::from_millis(33)); + } + + // Disale raw mode, leave the alternate screen and show the cursor back + let _ = terminal::disable_raw_mode().unwrap(); + execute!(stdout, terminal::LeaveAlternateScreen, cursor::Show)?; + + // Be polite + println!("CTRL-C pressed, bye!\n"); + + return Ok(()); +} + +fn render_frame() -> io::Result<()> { + let mut stdout = io::stdout(); + let (width, height) = terminal::size()?; + + // Render red X at middle of screen + queue!( + stdout, + cursor::MoveTo(width / 2, height / 2), + style::SetForegroundColor(Color::Red) + )?; + + write!(stdout, "X")?; + + return Ok(()); }