// client/src/input/mouse.rs use evdev::{Device, InputEvent, EventType, RelativeAxisCode}; use tracing::error; /// Aggregator for a single mouse device pub struct MouseAggregator { dev: Device, dx: i32, dy: i32, // etc } impl MouseAggregator { pub fn new(dev: Device) -> Self { Self { dev, dx: 0, dy: 0, } } pub fn process_events(&mut self) { let events_vec: Vec = match self.dev.fetch_events() { Ok(it) => it.collect(), Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => { return; } Err(e) => { error!("Mouse device read error: {e}"); return; } }; for ev in events_vec { self.handle_event(ev); } } fn handle_event(&mut self, ev: InputEvent) { if ev.event_type() == EventType::RELATIVE { match RelativeAxisCode(ev.code()) { RelativeAxisCode::REL_X => { self.dx += ev.value(); } RelativeAxisCode::REL_Y => { self.dy += ev.value(); } _ => {} } tracing::debug!("mouse dx={} dy={}", self.dx, self.dy); } // etc. Also handle buttons with KEY_B? } }