1use std::{fs::File, io::Read, thread::sleep};
2
3use kernel_user_link::mouse::MOUSE_PATH;
4pub use kernel_user_link::mouse::{buttons, MouseEvent, ScrollType};
5
6pub struct Mouse {
7 file: File,
8}
9
10impl Mouse {
11 pub fn new() -> Self {
12 let file = File::open(MOUSE_PATH).unwrap();
13 Mouse { file }
14 }
15
16 pub fn get_event(&mut self) -> Option<MouseEvent> {
17 let mut buf = [0; MouseEvent::BYTES_SIZE];
18 if self.file.read(&mut buf).unwrap() == MouseEvent::BYTES_SIZE {
19 Some(unsafe { MouseEvent::from_bytes(buf) })
23 } else {
24 None
25 }
26 }
27
28 pub fn iter_events(&mut self) -> impl Iterator<Item = MouseEvent> + '_ {
29 std::iter::from_fn(move || self.get_event())
30 }
31
32 pub fn wait_for_events(&mut self) -> MouseEvent {
34 loop {
35 if let Some(key) = self.get_event() {
36 return key;
37 }
38 sleep(std::time::Duration::from_millis(10));
39 }
40 }
41}