input_handler/
input_handler.rs

1use std::{process::exit, thread};
2
3use crossterm::event::{KeyCode, MouseButton};
4use log::info;
5use ltrender::{
6    CrosstermEventManager, init_logger, init_terminal,
7    input_handler::{
8        hook::InputButton,
9        manager::{MouseButtons, MouseMessage, SubscriptionMessage, TargetScreen},
10    },
11};
12
13fn main() {
14    init_terminal!();
15    init_logger("./input_handler_test.log").unwrap();
16    let (_input_manager, input_handler, screen_select_h) =
17        CrosstermEventManager::new_with_select_sub(TargetScreen::None);
18    let handle = thread::spawn(move || {
19        macro_rules! try_send {
20            ($message: expr) => {
21                if let Err(e) = screen_select_h.send($message) {
22                    info!("error sending select {:?}", e);
23                    break;
24                } else {
25                };
26            };
27        }
28        loop {
29            if let Ok(sm) = screen_select_h.recv()
30                && let SubscriptionMessage::Mouse {
31                    msg,
32                    screen: _screen,
33                } = sm
34                && let MouseMessage::Pressed(_) = msg
35            {
36                try_send!(Some(TargetScreen::Screen(1)));
37            } else {
38                try_send!(None);
39            };
40        }
41    });
42    let mut hook = input_handler.create_hook();
43
44    hook.on_key_press(KeyCode::Char('q'), |_| exit(0)).unwrap();
45    hook.on_key_press(KeyCode::Char('n'), |_| eprintln!("n"))
46        .unwrap();
47
48    hook.on_mouse_button_press(MouseButtons::Left, |m| eprintln!("{:?}", m))
49        .unwrap();
50
51    while !hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {}
52    while hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {}
53    handle.join().unwrap();
54    restore_terminal().unwrap();
55}