emerald_runtime/
mouse.rs

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            // Safety: we are using the same size as the MouseEvent struct
20            // and this is provided by the kernel, so it must
21            // be valid
22            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    // TODO: this is a temporary solution, we should use a better way to wait for input
33    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}