ltrender 0.1.11

a diff based terminal rendering engine
Documentation
use std::{process::exit, thread};

use crossterm::event::{KeyCode, MouseButton};
use log::info;
use ltrender::{
    CrosstermEventManager, init_logger, init_terminal,
    input_handler::{
        hook::InputButton,
        manager::{MouseButtons, MouseMessage, SubscriptionMessage, TargetScreen},
        screen_select_handler::ScreenSelectHMsg,
    },
};

fn main() {
    init_terminal!();
    init_logger("./input_handler_test.log").unwrap();
    let (_input_manager, input_handler, screen_select_h) =
        CrosstermEventManager::new_with_select_sub(TargetScreen::None);
    let handle = thread::spawn(move || {
        macro_rules! try_send {
            ($message: expr) => {
                if let Err(e) = screen_select_h.send($message) {
                    info!("error sending select {:?}", e);
                    break;
                } else {
                };
            };
        }
        loop {
            if let Ok(sshm) = screen_select_h.recv() {
                match sshm {
                    ScreenSelectHMsg::Event(sm) => {
                        if let SubscriptionMessage::Mouse {
                            msg,
                            screen: _screen,
                        } = sm
                            && let MouseMessage::Pressed(_) = msg
                        {
                            try_send!(Some(TargetScreen::Screen(1)));
                        } else {
                            try_send!(None);
                        };
                    }
                    // accept incoming selection requests
                    ScreenSelectHMsg::Selection(s) => {
                        try_send!(Some(s));
                    }
                }
            }
        }
    });
    let mut hook = input_handler.create_hook();

    hook.on_key_press(KeyCode::Char('q'), |_| exit(0)).unwrap();
    hook.on_key_press(KeyCode::Char('n'), |_| eprintln!("n"))
        .unwrap();

    hook.on_mouse_button_press(MouseButtons::Left, |m| eprintln!("{:?}", m))
        .unwrap();

    while !hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {}
    while hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {}
    handle.join().unwrap();
    restore_terminal().unwrap();
}