megalock 0.1.0

X11 xlock replacement
use anyhow::Result;
use megalock::{
    utils::{get_display, get_username},
    wm::Client,
};
use tracing::debug;

const PROGRAM_NAME: &str = "megalock";

fn get_tracing_level() -> tracing::Level {
    if std::env::var("TRACE").map_or(false, |x| !x.is_empty()) {
        tracing::Level::TRACE
    } else if std::env::var("DEBUG").map_or(false, |x| !x.is_empty()) {
        tracing::Level::DEBUG
    } else {
        tracing::Level::INFO
    }
}

fn setup_tracing() -> Result<()> {
    let subscriber = tracing_subscriber::FmtSubscriber::builder()
        .with_max_level(get_tracing_level())
        .finish();

    tracing::subscriber::set_global_default(subscriber)?;
    Ok(())
}

fn main() -> Result<()> {
    setup_tracing()?;

    debug!(
        "Locking desktop for '{}', display '{}'",
        get_username()?,
        get_display()
    );

    let client = megalock::x11::Client::get_client(0)?;

    if let Ok(timer) = std::env::var("EXIT_TRAP") {
        let timer = timer.parse()?;
        std::thread::spawn(move || {
            std::thread::sleep(std::time::Duration::new(timer, 0));
            std::process::exit(0)
        });
    }

    client.lock().unwrap().select_focused_window()?;
    client
        .lock()
        .unwrap()
        .open_fullscreen_window(PROGRAM_NAME.to_string())?;
    client.lock().unwrap().grab_pointer_and_keyboard()?;
    client.lock().unwrap().unlock_sleep()?;
    client.lock().unwrap().redraw_screen()?;
    client.lock().unwrap().raise_window()?;
    client.lock().unwrap().loop_until_pam(PROGRAM_NAME)?;

    Ok(())
}