1use crate::{PixelabError, Point};
2use std::fmt::Formatter;
3
4#[derive(Clone, Debug)]
5pub enum TouchPad {
6 Press(Point),
7 Motion(Point),
8 Release(Point),
9}
10
11#[derive(Clone, Debug)]
12pub enum Keyboard {
13 Press(char),
14 Release(char),
15}
16
17#[derive(Clone, Debug)]
18pub enum Mouse {
19 Press(u8),
20 Motion(Point),
21 Release(u8),
22}
23
24#[derive(Clone, Debug)]
25pub enum Event {
26 TouchPad(TouchPad),
27 Keyboard(Keyboard),
28 Mouse(Mouse),
29 KeyValue(&'static str, u32),
30 Message(&'static str),
31 Timer(u8),
32}
33impl core::fmt::Display for Event {
34 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
35 write!(f, "{:?}", self)
36 }
37}
38
39pub trait InputDevice {
40 fn init(&mut self) -> Result<(), PixelabError>;
41 fn read(&mut self) -> Result<Event, PixelabError>;
42}
43
44pub struct EventReader {
45 pub readers: Vec<Box<dyn InputDevice>>,
46 pub events: Vec<Event>,
47}
48impl EventReader {
49 pub fn new() -> Self {
50 Self {
51 readers: vec![],
52 events: vec![],
53 }
54 }
55 pub fn add_reader(
56 &mut self,
57 mut reader: impl InputDevice + 'static,
58 ) -> Result<(), PixelabError> {
59 reader.init()?;
60 self.readers.push(Box::new(reader));
61 Ok(())
62 }
63 pub fn read_all(&mut self) -> Result<(), PixelabError> {
64 for reader in self.readers.iter_mut() {
65 match reader.read() {
66 Ok(event) => self.events.push(event),
67 Err(_) => {}
68 }
69 }
70 Ok(())
71 }
72 pub fn get(&mut self) -> Result<Event, PixelabError> {
73 match self.events.pop() {
74 Some(event) => Ok(event),
75 None => Err(PixelabError::EmptyEvent),
76 }
77 }
78 pub fn send(&mut self, event: Event) {
79 self.events.push(event)
80 }
81}