code_scanner_driver/keyboard/
manager.rs1use 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}