Skip to main content

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        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                    // accept incoming selection requests
45                    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}