pub use jay_keyboard::{KbvmContext, KbvmError, KbvmMap, KbvmMapId, KbvmState}; use { crate::{ backend::KeyState, ifs::wl_seat::WlSeatGlobal, utils::{syncqueue::SyncQueue, vecset::VecSet}, }, kbvm::{ Keycode, state_machine::{Direction, Event}, }, std::{ cell::{Cell, RefCell}, rc::Rc, }, }; pub struct PhysicalKeyboardState { state: Rc>, inner: RefCell, events: SyncQueue, flushing: Cell, } #[derive(Default)] struct PkInner { pressed_keys: VecSet, event_stash: Vec, } impl PhysicalKeyboardState { pub fn new(state: &Rc>) -> Self { Self { state: state.clone(), inner: Default::default(), events: Default::default(), flushing: Cell::new(false), } } fn flush(&self, time_usec: u64, seat: &Rc) { if self.flushing.replace(true) { return; } seat.key_events(time_usec, &self.events, &self.state); self.flushing.set(false); } pub fn update(&self, time_usec: u64, seat: &Rc, key: u32, key_state: KeyState) { { let inner = &mut *self.inner.borrow_mut(); match key_state { KeyState::Released => { if !inner.pressed_keys.remove(&key) { return; } } KeyState::Pressed => { if !inner.pressed_keys.insert(key) { return; } } KeyState::Repeated => { return; } } let state = &mut *self.state.borrow_mut(); state.map.state_machine.handle_key( &mut state.state, &mut inner.event_stash, Keycode::from_evdev(key), match key_state { KeyState::Released => Direction::Up, KeyState::Pressed => Direction::Down, KeyState::Repeated => unreachable!(), }, ); self.events.append(&mut inner.event_stash); } self.flush(time_usec, seat); } pub fn destroy(&self, time_usec: u64, seat: &Rc) { { let inner = &mut *self.inner.borrow_mut(); let state = &mut *self.state.borrow_mut(); let sm = &state.map.state_machine; while let Some(key) = inner.pressed_keys.pop() { sm.handle_key( &mut state.state, &mut inner.event_stash, Keycode::from_evdev(key), Direction::Up, ); } self.events.append(&mut inner.event_stash); } self.flush(time_usec, seat); } }