input_event/
libei.rs

1use reis::{
2    ei::{button::ButtonState, keyboard::KeyState},
3    event::EiEvent,
4};
5
6use crate::{Event, KeyboardEvent, PointerEvent};
7
8impl Event {
9    pub fn from_ei_event(ei_event: EiEvent) -> impl Iterator<Item = Self> {
10        to_input_events(ei_event).into_iter()
11    }
12}
13
14enum Events {
15    None,
16    One(Event),
17    Two(Event, Event),
18}
19
20impl Events {
21    fn into_iter(self) -> impl Iterator<Item = Event> {
22        EventIterator::new(self)
23    }
24}
25
26struct EventIterator {
27    events: [Option<Event>; 2],
28    pos: usize,
29}
30
31impl EventIterator {
32    fn new(events: Events) -> Self {
33        let events = match events {
34            Events::None => [None, None],
35            Events::One(e) => [Some(e), None],
36            Events::Two(e, f) => [Some(e), Some(f)],
37        };
38        Self { events, pos: 0 }
39    }
40}
41
42impl Iterator for EventIterator {
43    type Item = Event;
44
45    fn next(&mut self) -> Option<Self::Item> {
46        let res = if self.pos >= self.events.len() {
47            None
48        } else {
49            self.events[self.pos]
50        };
51        self.pos += 1;
52        res
53    }
54}
55
56fn to_input_events(ei_event: EiEvent) -> Events {
57    match ei_event {
58        EiEvent::KeyboardModifiers(mods) => {
59            let modifier_event = KeyboardEvent::Modifiers {
60                depressed: mods.depressed,
61                latched: mods.latched,
62                locked: mods.locked,
63                group: mods.group,
64            };
65            Events::One(Event::Keyboard(modifier_event))
66        }
67        EiEvent::Frame(_) => Events::None, /* FIXME */
68        EiEvent::PointerMotion(motion) => {
69            let motion_event = PointerEvent::Motion {
70                time: motion.time as u32,
71                dx: motion.dx as f64,
72                dy: motion.dy as f64,
73            };
74            Events::One(Event::Pointer(motion_event))
75        }
76        EiEvent::PointerMotionAbsolute(_) => Events::None,
77        EiEvent::Button(button) => {
78            let button_event = PointerEvent::Button {
79                time: button.time as u32,
80                button: button.button,
81                state: match button.state {
82                    ButtonState::Released => 0,
83                    ButtonState::Press => 1,
84                },
85            };
86            Events::One(Event::Pointer(button_event))
87        }
88        EiEvent::ScrollDelta(delta) => {
89            let dy = Event::Pointer(PointerEvent::Axis {
90                time: 0,
91                axis: 0,
92                value: delta.dy as f64,
93            });
94            let dx = Event::Pointer(PointerEvent::Axis {
95                time: 0,
96                axis: 1,
97                value: delta.dx as f64,
98            });
99            if delta.dy != 0. && delta.dx != 0. {
100                Events::Two(dy, dx)
101            } else if delta.dy != 0. {
102                Events::One(dy)
103            } else if delta.dx != 0. {
104                Events::One(dx)
105            } else {
106                Events::None
107            }
108        }
109        EiEvent::ScrollStop(_) => Events::None,   /* TODO */
110        EiEvent::ScrollCancel(_) => Events::None, /* TODO */
111        EiEvent::ScrollDiscrete(scroll) => {
112            let dy = Event::Pointer(PointerEvent::AxisDiscrete120 {
113                axis: 0,
114                value: scroll.discrete_dy,
115            });
116            let dx = Event::Pointer(PointerEvent::AxisDiscrete120 {
117                axis: 1,
118                value: scroll.discrete_dx,
119            });
120            if scroll.discrete_dy != 0 && scroll.discrete_dx != 0 {
121                Events::Two(dy, dx)
122            } else if scroll.discrete_dy != 0 {
123                Events::One(dy)
124            } else if scroll.discrete_dx != 0 {
125                Events::One(dx)
126            } else {
127                Events::None
128            }
129        }
130        EiEvent::KeyboardKey(key) => {
131            let key_event = KeyboardEvent::Key {
132                key: key.key,
133                state: match key.state {
134                    KeyState::Press => 1,
135                    KeyState::Released => 0,
136                },
137                time: key.time as u32,
138            };
139            Events::One(Event::Keyboard(key_event))
140        }
141        EiEvent::TouchDown(_) => Events::None,   /* TODO */
142        EiEvent::TouchUp(_) => Events::None,     /* TODO */
143        EiEvent::TouchMotion(_) => Events::None, /* TODO */
144        _ => Events::None,
145    }
146}