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, 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, EiEvent::ScrollCancel(_) => Events::None, 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, EiEvent::TouchUp(_) => Events::None, EiEvent::TouchMotion(_) => Events::None, _ => Events::None,
145 }
146}