extern crate pancurses;
extern crate r_matrix;
extern crate signal_hook;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use pancurses::*;
use signal_hook::consts::signal::{SIGINT, SIGQUIT, SIGTERM, SIGWINCH};
use signal_hook::flag;
use r_matrix::config::Config;
use r_matrix::Matrix;
fn main() {
let mut config = Config::default();
let window = r_matrix::ncurses_init();
let exit_signal = Arc::new(AtomicBool::new(false));
let resize_signal = Arc::new(AtomicBool::new(false));
flag::register(SIGWINCH, Arc::clone(&resize_signal)).unwrap();
flag::register(SIGINT, Arc::clone(&exit_signal)).unwrap();
flag::register(SIGTERM, Arc::clone(&exit_signal)).unwrap();
flag::register(SIGQUIT, Arc::clone(&exit_signal)).unwrap();
let mut matrix: Matrix = Matrix::default();
loop {
if resize_signal.swap(false, Ordering::Relaxed) {
r_matrix::resize_window();
matrix = Matrix::default();
}
if exit_signal.swap(false, Ordering::Relaxed) {
r_matrix::finish();
}
if let Some(Input::Character(c)) = window.getch() {
config.handle_keypress(c)
}
matrix.arrange(&config);
matrix.draw(&window, &config);
}
}