feat: minimal app setup
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "tlock"
|
name = "tlock"
|
||||||
version = "0.0.1"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
crossterm = "0.27.0"
|
||||||
|
|
||||||
|
|||||||
78
src/main.rs
78
src/main.rs
@@ -1,5 +1,77 @@
|
|||||||
use std::time::SystemTime;
|
use std::{
|
||||||
|
io::{self, Write},
|
||||||
|
thread,
|
||||||
|
time::Duration,
|
||||||
|
};
|
||||||
|
|
||||||
fn main() {
|
use crossterm::{
|
||||||
println!("{:?}", SystemTime::now());
|
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(());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user