1use crate::{
2 binding, event,
3 source::{Key, MouseButton},
4};
5use std::convert::{TryFrom, TryInto};
6use winit::event::VirtualKeyCode;
7
8pub fn parse_winit_event<'a, T>(
10 event: &winit::event::Event<'a, T>,
11) -> Result<(event::Source, event::Event), ()> {
12 use winit::event::{DeviceEvent, ElementState, KeyboardInput, MouseScrollDelta};
13 match event {
14 winit::event::Event::DeviceEvent {
15 event: DeviceEvent::MouseMotion { delta },
16 ..
17 } => Ok((
18 event::Source::Mouse,
19 event::Event {
20 source: binding::Source::Mouse(binding::Mouse::Move),
21 state: event::State::MouseMove(delta.0, delta.1),
22 },
23 )),
24 winit::event::Event::DeviceEvent {
25 event:
26 DeviceEvent::MouseWheel {
27 delta: MouseScrollDelta::LineDelta(horizontal, vertical),
28 },
29 ..
30 } => Ok((
31 event::Source::Mouse,
32 event::Event {
33 source: binding::Source::Mouse(binding::Mouse::Scroll),
34 state: event::State::MouseScroll(*horizontal, *vertical),
35 },
36 )),
37 winit::event::Event::DeviceEvent {
38 event: DeviceEvent::Button { button, state },
39 ..
40 } => MouseButton::try_from(*button)
41 .map(|button_enum| {
42 (
43 event::Source::Mouse,
44 event::Event {
45 source: binding::Source::Mouse(binding::Mouse::Button(button_enum)),
46 state: event::State::ButtonState(match state {
47 ElementState::Pressed => event::ButtonState::Pressed,
48 ElementState::Released => event::ButtonState::Released,
49 }),
50 },
51 )
52 })
53 .map_err(|id| {
54 println!("ERROR failed to parse button id {:?}", id);
55 ()
56 }),
57 winit::event::Event::DeviceEvent {
58 event:
59 DeviceEvent::Key(KeyboardInput {
60 state,
61 virtual_keycode: Some(keycode),
62 ..
63 }),
64 ..
65 } => (*keycode)
66 .try_into()
67 .map(|keycode| {
68 (
69 event::Source::Keyboard,
70 event::Event {
71 source: binding::Source::Keyboard(keycode),
72 state: event::State::ButtonState(match state {
73 ElementState::Pressed => event::ButtonState::Pressed,
74 ElementState::Released => event::ButtonState::Released,
75 }),
76 },
77 )
78 })
79 .map_err(|_| ()),
80 _ => Err(()),
81 }
82}
83
84impl TryFrom<winit::event::ButtonId> for MouseButton {
85 type Error = winit::event::ButtonId;
86 fn try_from(id: winit::event::ButtonId) -> Result<Self, Self::Error> {
87 match id {
88 1 => Ok(MouseButton::Left),
89 2 => Ok(MouseButton::Center),
90 3 => Ok(MouseButton::Right),
91 _ => Err(id),
92 }
93 }
94}
95
96impl TryFrom<VirtualKeyCode> for Key {
97 type Error = ();
98 fn try_from(winit: VirtualKeyCode) -> Result<Self, Self::Error> {
99 match winit {
100 VirtualKeyCode::Key1 => Ok(Key::Key1),
101 VirtualKeyCode::Key2 => Ok(Key::Key2),
102 VirtualKeyCode::Key3 => Ok(Key::Key3),
103 VirtualKeyCode::Key4 => Ok(Key::Key4),
104 VirtualKeyCode::Key5 => Ok(Key::Key5),
105 VirtualKeyCode::Key6 => Ok(Key::Key6),
106 VirtualKeyCode::Key7 => Ok(Key::Key7),
107 VirtualKeyCode::Key8 => Ok(Key::Key8),
108 VirtualKeyCode::Key9 => Ok(Key::Key9),
109 VirtualKeyCode::Key0 => Ok(Key::Key0),
110 VirtualKeyCode::A => Ok(Key::A),
111 VirtualKeyCode::B => Ok(Key::B),
112 VirtualKeyCode::C => Ok(Key::C),
113 VirtualKeyCode::D => Ok(Key::D),
114 VirtualKeyCode::E => Ok(Key::E),
115 VirtualKeyCode::F => Ok(Key::F),
116 VirtualKeyCode::G => Ok(Key::G),
117 VirtualKeyCode::H => Ok(Key::H),
118 VirtualKeyCode::I => Ok(Key::I),
119 VirtualKeyCode::J => Ok(Key::J),
120 VirtualKeyCode::K => Ok(Key::K),
121 VirtualKeyCode::L => Ok(Key::L),
122 VirtualKeyCode::M => Ok(Key::M),
123 VirtualKeyCode::N => Ok(Key::N),
124 VirtualKeyCode::O => Ok(Key::O),
125 VirtualKeyCode::P => Ok(Key::P),
126 VirtualKeyCode::Q => Ok(Key::Q),
127 VirtualKeyCode::R => Ok(Key::R),
128 VirtualKeyCode::S => Ok(Key::S),
129 VirtualKeyCode::T => Ok(Key::T),
130 VirtualKeyCode::U => Ok(Key::U),
131 VirtualKeyCode::V => Ok(Key::V),
132 VirtualKeyCode::W => Ok(Key::W),
133 VirtualKeyCode::X => Ok(Key::X),
134 VirtualKeyCode::Y => Ok(Key::Y),
135 VirtualKeyCode::Z => Ok(Key::Z),
136 VirtualKeyCode::Escape => Ok(Key::Escape),
137 VirtualKeyCode::F1 => Ok(Key::F1),
138 VirtualKeyCode::F2 => Ok(Key::F2),
139 VirtualKeyCode::F3 => Ok(Key::F3),
140 VirtualKeyCode::F4 => Ok(Key::F4),
141 VirtualKeyCode::F5 => Ok(Key::F5),
142 VirtualKeyCode::F6 => Ok(Key::F6),
143 VirtualKeyCode::F7 => Ok(Key::F7),
144 VirtualKeyCode::F8 => Ok(Key::F8),
145 VirtualKeyCode::F9 => Ok(Key::F9),
146 VirtualKeyCode::F10 => Ok(Key::F10),
147 VirtualKeyCode::F11 => Ok(Key::F11),
148 VirtualKeyCode::F12 => Ok(Key::F12),
149 VirtualKeyCode::F13 => Ok(Key::F13),
150 VirtualKeyCode::F14 => Ok(Key::F14),
151 VirtualKeyCode::F15 => Ok(Key::F15),
152 VirtualKeyCode::F16 => Ok(Key::F16),
153 VirtualKeyCode::F17 => Ok(Key::F17),
154 VirtualKeyCode::F18 => Ok(Key::F18),
155 VirtualKeyCode::F19 => Ok(Key::F19),
156 VirtualKeyCode::F20 => Ok(Key::F20),
157 VirtualKeyCode::F21 => Ok(Key::F21),
158 VirtualKeyCode::F22 => Ok(Key::F22),
159 VirtualKeyCode::F23 => Ok(Key::F23),
160 VirtualKeyCode::F24 => Ok(Key::F24),
161 VirtualKeyCode::Snapshot => Ok(Key::Snapshot),
162 VirtualKeyCode::Scroll => Ok(Key::ScrollLock),
163 VirtualKeyCode::Pause => Ok(Key::Pause),
164 VirtualKeyCode::Insert => Ok(Key::Insert),
165 VirtualKeyCode::Home => Ok(Key::Home),
166 VirtualKeyCode::Delete => Ok(Key::Delete),
167 VirtualKeyCode::End => Ok(Key::End),
168 VirtualKeyCode::PageDown => Ok(Key::PageDown),
169 VirtualKeyCode::PageUp => Ok(Key::PageUp),
170 VirtualKeyCode::Left => Ok(Key::Left),
171 VirtualKeyCode::Up => Ok(Key::Up),
172 VirtualKeyCode::Right => Ok(Key::Right),
173 VirtualKeyCode::Down => Ok(Key::Down),
174 VirtualKeyCode::Back => Ok(Key::Back),
175 VirtualKeyCode::Return => Ok(Key::Return),
176 VirtualKeyCode::Space => Ok(Key::Space),
177 VirtualKeyCode::Compose => Err(()),
178 VirtualKeyCode::Caret => Err(()),
179 VirtualKeyCode::Numlock => Ok(Key::Numlock),
180 VirtualKeyCode::Numpad0 => Ok(Key::Numpad0),
181 VirtualKeyCode::Numpad1 => Ok(Key::Numpad1),
182 VirtualKeyCode::Numpad2 => Ok(Key::Numpad2),
183 VirtualKeyCode::Numpad3 => Ok(Key::Numpad3),
184 VirtualKeyCode::Numpad4 => Ok(Key::Numpad4),
185 VirtualKeyCode::Numpad5 => Ok(Key::Numpad5),
186 VirtualKeyCode::Numpad6 => Ok(Key::Numpad6),
187 VirtualKeyCode::Numpad7 => Ok(Key::Numpad7),
188 VirtualKeyCode::Numpad8 => Ok(Key::Numpad8),
189 VirtualKeyCode::Numpad9 => Ok(Key::Numpad9),
190 VirtualKeyCode::NumpadAdd => Ok(Key::NumpadPlus),
191 VirtualKeyCode::NumpadDivide => Ok(Key::NumpadSlash),
192 VirtualKeyCode::NumpadDecimal => Err(()),
193 VirtualKeyCode::NumpadComma => Err(()),
194 VirtualKeyCode::NumpadEnter => Ok(Key::NumpadEnter),
195 VirtualKeyCode::NumpadEquals => Err(()),
196 VirtualKeyCode::NumpadMultiply => Ok(Key::NumpadAsterisk),
197 VirtualKeyCode::NumpadSubtract => Ok(Key::NumpadMinus),
198 VirtualKeyCode::AbntC1 => Err(()),
199 VirtualKeyCode::AbntC2 => Err(()),
200 VirtualKeyCode::Apostrophe => Ok(Key::Apostrophe),
201 VirtualKeyCode::Apps => Err(()),
202 VirtualKeyCode::Asterisk => Err(()),
203 VirtualKeyCode::At => Err(()),
204 VirtualKeyCode::Ax => Err(()),
205 VirtualKeyCode::Backslash => Ok(Key::Backslash),
206 VirtualKeyCode::Calculator => Err(()),
207 VirtualKeyCode::Capital => Ok(Key::CapitalLock),
208 VirtualKeyCode::Colon => Err(()),
209 VirtualKeyCode::Comma => Ok(Key::Comma),
210 VirtualKeyCode::Convert => Err(()),
211 VirtualKeyCode::Equals => Ok(Key::Equals),
212 VirtualKeyCode::Grave => Ok(Key::Grave),
213 VirtualKeyCode::Kana => Err(()),
214 VirtualKeyCode::Kanji => Err(()),
215 VirtualKeyCode::LAlt => Ok(Key::LAlt),
216 VirtualKeyCode::LBracket => Ok(Key::LBracket),
217 VirtualKeyCode::LControl => Ok(Key::LControl),
218 VirtualKeyCode::LShift => Ok(Key::LShift),
219 VirtualKeyCode::LWin => Ok(Key::LWin),
220 VirtualKeyCode::Mail => Err(()),
221 VirtualKeyCode::MediaSelect => Err(()),
222 VirtualKeyCode::MediaStop => Err(()),
223 VirtualKeyCode::Minus => Ok(Key::Minus),
224 VirtualKeyCode::Mute => Err(()),
225 VirtualKeyCode::MyComputer => Err(()),
226 VirtualKeyCode::NavigateForward => Err(()),
227 VirtualKeyCode::NavigateBackward => Err(()),
228 VirtualKeyCode::NextTrack => Err(()),
229 VirtualKeyCode::NoConvert => Err(()),
230 VirtualKeyCode::OEM102 => Err(()),
231 VirtualKeyCode::Period => Ok(Key::Period),
232 VirtualKeyCode::PlayPause => Err(()),
233 VirtualKeyCode::Plus => Err(()),
234 VirtualKeyCode::Power => Err(()),
235 VirtualKeyCode::PrevTrack => Err(()),
236 VirtualKeyCode::RAlt => Ok(Key::RAlt),
237 VirtualKeyCode::RBracket => Ok(Key::RBracket),
238 VirtualKeyCode::RControl => Ok(Key::RControl),
239 VirtualKeyCode::RShift => Ok(Key::RShift),
240 VirtualKeyCode::RWin => Ok(Key::RWin),
241 VirtualKeyCode::Semicolon => Ok(Key::Semicolon),
242 VirtualKeyCode::Slash => Ok(Key::Slash),
243 VirtualKeyCode::Sleep => Err(()),
244 VirtualKeyCode::Stop => Err(()),
245 VirtualKeyCode::Sysrq => Err(()),
246 VirtualKeyCode::Tab => Ok(Key::Tab),
247 VirtualKeyCode::Underline => Err(()),
248 VirtualKeyCode::Unlabeled => Err(()),
249 VirtualKeyCode::VolumeDown => Err(()),
250 VirtualKeyCode::VolumeUp => Err(()),
251 VirtualKeyCode::Wake => Err(()),
252 VirtualKeyCode::WebBack => Err(()),
253 VirtualKeyCode::WebFavorites => Err(()),
254 VirtualKeyCode::WebForward => Err(()),
255 VirtualKeyCode::WebHome => Err(()),
256 VirtualKeyCode::WebRefresh => Err(()),
257 VirtualKeyCode::WebSearch => Err(()),
258 VirtualKeyCode::WebStop => Err(()),
259 VirtualKeyCode::Yen => Err(()),
260 VirtualKeyCode::Copy => Err(()),
261 VirtualKeyCode::Paste => Err(()),
262 VirtualKeyCode::Cut => Err(()),
263 }
264 }
265}