use std::io::{self, Write};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use std::time::Duration;
pub const ESC: &str = "\x1b";
pub mod palettes;
pub mod config;
pub mod display;
pub mod engine;
pub mod tui;
#[cfg(windows)]
pub mod win;
use config::{build_palette, resolve_choice};
use engine::burn;
static SIGINT_FIRED: AtomicBool = AtomicBool::new(false);
#[cfg(unix)]
extern "C" fn sigint_handler(_: libc::c_int) {
SIGINT_FIRED.store(true, Ordering::Relaxed);
}
#[cfg(windows)]
unsafe extern "system" fn ctrl_handler(_: u32) -> i32 {
SIGINT_FIRED.store(true, Ordering::Relaxed);
1
}
fn install_sigint() -> Arc<AtomicBool> {
let flag = Arc::new(AtomicBool::new(false));
let flag2 = Arc::clone(&flag);
#[cfg(unix)]
unsafe {
libc::signal(libc::SIGINT, sigint_handler as *const () as libc::sighandler_t);
}
#[cfg(windows)]
unsafe {
crate::win::SetConsoleCtrlHandler(ctrl_handler, 1);
}
std::thread::spawn(move || loop {
if SIGINT_FIRED.load(Ordering::Relaxed) {
flag2.store(true, Ordering::Relaxed);
break;
}
std::thread::sleep(Duration::from_millis(20));
});
flag
}
fn main() {
let (choice, settings) = resolve_choice();
let palette = build_palette(&choice);
let interrupted = install_sigint();
burn(&palette, &settings, interrupted);
let stdout = io::stdout();
let mut out = stdout.lock();
let _ = write!(out, "{ESC}[H{ESC}[2J");
let _ = out.flush();
}