input_handler/
input_handler.rs1use 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}