diff --git a/crates/apps/snake/src/main.rs b/crates/apps/snake/src/main.rs index b3c2e0f..7f48397 100644 --- a/crates/apps/snake/src/main.rs +++ b/crates/apps/snake/src/main.rs @@ -65,16 +65,19 @@ extern "C" fn main() { } fn handle_input(snake: &mut Snake) { - let _ = syscall::send(INPUT_EP, 0, 0, 0, 0); - let (tag, kind, _, _) = syscall::receive(INPUT_EP); - - if tag == 1 { - match kind { - 0 => snake.set_direction(Direction::Up), - 1 => snake.set_direction(Direction::Down), - 2 => snake.set_direction(Direction::Left), - 3 => snake.set_direction(Direction::Right), - _ => {} + // Drain all pending events, apply the latest direction + loop { + let _ = syscall::send(INPUT_EP, 0, 0, 0, 0); + let (tag, kind, _, _) = syscall::receive(INPUT_EP); + if tag == 0 { break; } // NoEvent — queue drained + if tag == 1 { + match kind { + 0 => snake.set_direction(Direction::Up), + 1 => snake.set_direction(Direction::Down), + 2 => snake.set_direction(Direction::Left), + 3 => snake.set_direction(Direction::Right), + _ => {} + } } } } diff --git a/crates/drivers/input/virtio/src/lib.rs b/crates/drivers/input/virtio/src/lib.rs index ed4240c..0046bb9 100644 --- a/crates/drivers/input/virtio/src/lib.rs +++ b/crates/drivers/input/virtio/src/lib.rs @@ -129,28 +129,29 @@ fn linux_keycode_to_key(code: u16) -> Option { impl InputDevice for VirtioInputDevice { fn poll(&mut self) -> Option { - let current_used = self.used_idx(); - if current_used == self.last_used { - return None; - } + loop { + let current_used = self.used_idx(); + if current_used == self.last_used { + return None; + } - let desc_idx = self.used_entry_id(self.last_used); - self.last_used = self.last_used.wrapping_add(1); + let desc_idx = self.used_entry_id(self.last_used); + self.last_used = self.last_used.wrapping_add(1); - let (ev_type, ev_code, ev_value) = self.read_event(desc_idx); - self.resubmit(desc_idx); + let (ev_type, ev_code, ev_value) = self.read_event(desc_idx); + self.resubmit(desc_idx); - if ev_type == EV_KEY { - if let Some(key) = linux_keycode_to_key(ev_code) { - if ev_value == KEY_PRESS { - return Some(InputEvent::KeyDown(key)); - } else if ev_value == 0 { - return Some(InputEvent::KeyUp(key)); + if ev_type == EV_KEY { + if let Some(key) = linux_keycode_to_key(ev_code) { + if ev_value == KEY_PRESS { + return Some(InputEvent::KeyDown(key)); + } else if ev_value == 0 { + return Some(InputEvent::KeyUp(key)); + } } } + // Skip SYN events, repeats, and unknown keys — keep draining } - - None } fn has_event(&self) -> bool {