input_actions/
winit.rs

1use crate::{
2	binding, event,
3	source::{Key, MouseButton},
4};
5use std::convert::{TryFrom, TryInto};
6use winit::event::VirtualKeyCode;
7
8// TODO: Winit gamepad support is still in progress https://github.com/rust-windowing/winit/issues/944
9pub 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}