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 screen_select_handler::ScreenSelectHMsg,
11 },
12};
13
14fn main() {
15 init_terminal!();
16 init_logger("./input_handler_test.log").unwrap();
17 let (_input_manager, input_handler, screen_select_h) =
18 CrosstermEventManager::new_with_select_sub(TargetScreen::None);
19 let handle = thread::spawn(move || {
20 macro_rules! try_send {
21 ($message: expr) => {
22 if let Err(e) = screen_select_h.send($message) {
23 info!("error sending select {:?}", e);
24 break;
25 } else {
26 };
27 };
28 }
29 loop {
30 if let Ok(sshm) = screen_select_h.recv() {
31 match sshm {
32 ScreenSelectHMsg::Event(sm) => {
33 if let SubscriptionMessage::Mouse {
34 msg,
35 screen: _screen,
36 } = sm
37 && let MouseMessage::Pressed(_) = msg
38 {
39 try_send!(Some(TargetScreen::Screen(1)));
40 } else {
41 try_send!(None);
42 };
43 }
44 ScreenSelectHMsg::Selection(s) => {
46 try_send!(Some(s));
47 }
48 }
49 }
50 }
51 });
52 let mut hook = input_handler.create_hook();
53
54 hook.on_key_press(KeyCode::Char('q'), |_| exit(0)).unwrap();
55 hook.on_key_press(KeyCode::Char('n'), |_| eprintln!("n"))
56 .unwrap();
57
58 hook.on_mouse_button_press(MouseButtons::Left, |m| eprintln!("{:?}", m))
59 .unwrap();
60
61 while !hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {}
62 while hook.is_pressed(InputButton::Mouse(MouseButton::Right)) {}
63 handle.join().unwrap();
64 restore_terminal().unwrap();
65}