code_scanner_driver/keyboard/
manager.rs

1use tokio::sync::mpsc::Sender;
2use rdev::{Event, EventType, Key, listen};
3use anyhow::Result;
4use std::sync::{Arc, Mutex};
5use std::thread;
6use std::time::{Duration, Instant};
7use crate::event::scanner_event::ScannerEvent;
8use crate::event::source::Source;
9use crate::util::time::now_ms;
10
11pub fn start_keyboard_worker(tx: Sender<ScannerEvent>) -> Result<()> {
12    let buffer = Arc::new(Mutex::new(String::new()));
13    let burst_start = Arc::new(Mutex::new(None::<Instant>));
14    let last_time = Arc::new(Mutex::new(Instant::now()));
15
16    thread::spawn(move || {
17        if let Err(e) = listen(move |event: Event| {
18            if let EventType::KeyPress(key) = event.event_type {
19                let now = Instant::now();
20                let mut last = last_time.lock().unwrap();
21                let mut buf = buffer.lock().unwrap();
22                let mut start = burst_start.lock().unwrap();
23
24                if now.duration_since(*last) > Duration::from_millis(200) && !buf.is_empty() {
25                    buf.clear();
26                    *start = None;
27                }
28                *last = now;
29
30                if buf.is_empty() && key != Key::Return {
31                    *start = Some(now);
32                }
33
34                if key == Key::Return {
35                    if !buf.is_empty() {
36                        let s = buf.clone();
37
38                        let ev = ScannerEvent {
39                            source: Source::Keyboard,
40                            text: Some(s.clone()),
41                            raw: s.as_bytes().to_vec(),
42                            timestamp: now_ms(),
43                        };
44
45                        let _ = tx.blocking_send(ev);
46
47                        buf.clear();
48                        *start = None;
49                    }
50                    return;
51                }
52
53                if let Some(ch) = crate::keyboard::keymap::key_to_char(key, event.name.as_deref()) {
54                    buf.push(ch);
55                }
56            }
57        }) {
58            eprintln!("keyboard listen error: {:?}", e);
59        }
60    });
61
62    Ok(())
63}