1use iced_core::{keyboard, mouse, window, Event, Point, Size};
6use keyboard::key::NativeCode;
7use poolshark::local::LPooled;
8use winit::event::{ElementState, MouseButton, WindowEvent};
9use winit::keyboard::{Key, NamedKey, NativeKeyCode};
10use winit::platform::modifier_supplement::KeyEventExtModifierSupplement;
11
12pub fn window_event(
14 event: &WindowEvent,
15 scale_factor: f64,
16 modifiers: winit::keyboard::ModifiersState,
17) -> LPooled<Vec<Event>> {
18 let mut events: LPooled<Vec<Event>> = LPooled::take();
19 match event {
20 WindowEvent::Resized(size) => {
21 let logical = size.to_logical::<f32>(scale_factor);
22 events.push(Event::Window(window::Event::Resized(Size::new(
23 logical.width,
24 logical.height,
25 ))));
26 }
27 WindowEvent::CursorMoved { position, .. } => {
28 let logical = position.to_logical::<f32>(scale_factor);
29 events.push(Event::Mouse(mouse::Event::CursorMoved {
30 position: Point::new(logical.x, logical.y),
31 }));
32 }
33 WindowEvent::CursorEntered { .. } => {
34 events.push(Event::Mouse(mouse::Event::CursorEntered));
35 }
36 WindowEvent::CursorLeft { .. } => {
37 events.push(Event::Mouse(mouse::Event::CursorLeft));
38 }
39 WindowEvent::MouseInput { state, button, .. } => {
40 if let Some(btn) = mouse_button(*button) {
41 let event = match state {
42 ElementState::Pressed => mouse::Event::ButtonPressed(btn),
43 ElementState::Released => mouse::Event::ButtonReleased(btn),
44 };
45 events.push(Event::Mouse(event));
46 }
47 }
48 WindowEvent::MouseWheel { delta, .. } => {
49 let delta = match delta {
50 winit::event::MouseScrollDelta::LineDelta(x, y) => {
51 mouse::ScrollDelta::Lines { x: *x, y: *y }
52 }
53 winit::event::MouseScrollDelta::PixelDelta(pos) => {
54 let logical = pos.to_logical::<f32>(scale_factor);
55 mouse::ScrollDelta::Pixels { x: logical.x, y: logical.y }
56 }
57 };
58 events.push(Event::Mouse(mouse::Event::WheelScrolled { delta }));
59 }
60 WindowEvent::KeyboardInput { is_synthetic: true, .. } => {}
61 WindowEvent::KeyboardInput { event, .. } => {
62 let key = convert_key(event.key_without_modifiers());
63 let modified_key = convert_key(event.logical_key.clone());
64 let mods = convert_modifiers(modifiers);
65 let text = event
66 .text_with_all_modifiers()
67 .map(|s| s.to_string().into())
68 .filter(|s: &iced_core::SmolStr| {
69 !s.as_str().chars().any(|c| {
70 matches!(c, '\u{E000}'..='\u{F8FF}'
71 | '\u{F0000}'..='\u{FFFFD}'
72 | '\u{100000}'..='\u{10FFFD}')
73 })
74 });
75 let ev = match event.state {
76 ElementState::Pressed => keyboard::Event::KeyPressed {
77 key,
78 modified_key,
79 modifiers: mods,
80 location: convert_key_location(event.location),
81 text,
82 physical_key: physical_key(event.physical_key),
83 repeat: event.repeat,
84 },
85 ElementState::Released => keyboard::Event::KeyReleased {
86 key,
87 modified_key,
88 modifiers: mods,
89 location: convert_key_location(event.location),
90 physical_key: physical_key(event.physical_key),
91 },
92 };
93 events.push(Event::Keyboard(ev));
94 }
95 WindowEvent::Focused(focused) => {
96 events.push(Event::Window(if *focused {
97 window::Event::Focused
98 } else {
99 window::Event::Unfocused
100 }));
101 }
102 WindowEvent::CloseRequested => {
103 events.push(Event::Window(window::Event::CloseRequested));
104 }
105 WindowEvent::ScaleFactorChanged { scale_factor, .. } => {
106 events.push(Event::Window(window::Event::Rescaled(*scale_factor as f32)));
107 }
108 _ => {}
109 }
110 events
111}
112
113fn mouse_button(button: MouseButton) -> Option<mouse::Button> {
114 match button {
115 MouseButton::Left => Some(mouse::Button::Left),
116 MouseButton::Right => Some(mouse::Button::Right),
117 MouseButton::Middle => Some(mouse::Button::Middle),
118 MouseButton::Other(n) => Some(mouse::Button::Other(n)),
119 _ => None,
120 }
121}
122
123fn convert_key(key: Key) -> keyboard::Key {
124 match key {
125 Key::Character(c) => keyboard::Key::Character(c.as_str().to_string().into()),
126 Key::Named(named) => match convert_named_key(named) {
127 Some(n) => keyboard::Key::Named(n),
128 None => keyboard::Key::Unidentified,
129 },
130 Key::Unidentified(_) | Key::Dead(_) => keyboard::Key::Unidentified,
131 }
132}
133
134fn convert_named_key(key: NamedKey) -> Option<keyboard::key::Named> {
135 use keyboard::key::Named;
136 Some(match key {
137 NamedKey::Alt => Named::Alt,
138 NamedKey::AltGraph => Named::AltGraph,
139 NamedKey::CapsLock => Named::CapsLock,
140 NamedKey::Control => Named::Control,
141 NamedKey::Fn => Named::Fn,
142 NamedKey::FnLock => Named::FnLock,
143 NamedKey::NumLock => Named::NumLock,
144 NamedKey::ScrollLock => Named::ScrollLock,
145 NamedKey::Shift => Named::Shift,
146 NamedKey::Symbol => Named::Symbol,
147 NamedKey::SymbolLock => Named::SymbolLock,
148 NamedKey::Meta => Named::Meta,
149 NamedKey::Hyper => Named::Hyper,
150 NamedKey::Super => Named::Super,
151 NamedKey::Enter => Named::Enter,
152 NamedKey::Tab => Named::Tab,
153 NamedKey::Space => Named::Space,
154 NamedKey::ArrowDown => Named::ArrowDown,
155 NamedKey::ArrowLeft => Named::ArrowLeft,
156 NamedKey::ArrowRight => Named::ArrowRight,
157 NamedKey::ArrowUp => Named::ArrowUp,
158 NamedKey::End => Named::End,
159 NamedKey::Home => Named::Home,
160 NamedKey::PageDown => Named::PageDown,
161 NamedKey::PageUp => Named::PageUp,
162 NamedKey::Backspace => Named::Backspace,
163 NamedKey::Clear => Named::Clear,
164 NamedKey::Copy => Named::Copy,
165 NamedKey::CrSel => Named::CrSel,
166 NamedKey::Cut => Named::Cut,
167 NamedKey::Delete => Named::Delete,
168 NamedKey::EraseEof => Named::EraseEof,
169 NamedKey::ExSel => Named::ExSel,
170 NamedKey::Insert => Named::Insert,
171 NamedKey::Paste => Named::Paste,
172 NamedKey::Redo => Named::Redo,
173 NamedKey::Undo => Named::Undo,
174 NamedKey::Accept => Named::Accept,
175 NamedKey::Again => Named::Again,
176 NamedKey::Attn => Named::Attn,
177 NamedKey::Cancel => Named::Cancel,
178 NamedKey::ContextMenu => Named::ContextMenu,
179 NamedKey::Escape => Named::Escape,
180 NamedKey::Execute => Named::Execute,
181 NamedKey::Find => Named::Find,
182 NamedKey::Help => Named::Help,
183 NamedKey::Pause => Named::Pause,
184 NamedKey::Play => Named::Play,
185 NamedKey::Props => Named::Props,
186 NamedKey::Select => Named::Select,
187 NamedKey::ZoomIn => Named::ZoomIn,
188 NamedKey::ZoomOut => Named::ZoomOut,
189 NamedKey::BrightnessDown => Named::BrightnessDown,
190 NamedKey::BrightnessUp => Named::BrightnessUp,
191 NamedKey::Eject => Named::Eject,
192 NamedKey::LogOff => Named::LogOff,
193 NamedKey::Power => Named::Power,
194 NamedKey::PowerOff => Named::PowerOff,
195 NamedKey::PrintScreen => Named::PrintScreen,
196 NamedKey::Hibernate => Named::Hibernate,
197 NamedKey::Standby => Named::Standby,
198 NamedKey::WakeUp => Named::WakeUp,
199 NamedKey::AllCandidates => Named::AllCandidates,
200 NamedKey::Alphanumeric => Named::Alphanumeric,
201 NamedKey::CodeInput => Named::CodeInput,
202 NamedKey::Compose => Named::Compose,
203 NamedKey::Convert => Named::Convert,
204 NamedKey::FinalMode => Named::FinalMode,
205 NamedKey::GroupFirst => Named::GroupFirst,
206 NamedKey::GroupLast => Named::GroupLast,
207 NamedKey::GroupNext => Named::GroupNext,
208 NamedKey::GroupPrevious => Named::GroupPrevious,
209 NamedKey::ModeChange => Named::ModeChange,
210 NamedKey::NextCandidate => Named::NextCandidate,
211 NamedKey::NonConvert => Named::NonConvert,
212 NamedKey::PreviousCandidate => Named::PreviousCandidate,
213 NamedKey::Process => Named::Process,
214 NamedKey::SingleCandidate => Named::SingleCandidate,
215 NamedKey::HangulMode => Named::HangulMode,
216 NamedKey::HanjaMode => Named::HanjaMode,
217 NamedKey::JunjaMode => Named::JunjaMode,
218 NamedKey::Eisu => Named::Eisu,
219 NamedKey::Hankaku => Named::Hankaku,
220 NamedKey::Hiragana => Named::Hiragana,
221 NamedKey::HiraganaKatakana => Named::HiraganaKatakana,
222 NamedKey::KanaMode => Named::KanaMode,
223 NamedKey::KanjiMode => Named::KanjiMode,
224 NamedKey::Katakana => Named::Katakana,
225 NamedKey::Romaji => Named::Romaji,
226 NamedKey::Zenkaku => Named::Zenkaku,
227 NamedKey::ZenkakuHankaku => Named::ZenkakuHankaku,
228 NamedKey::Soft1 => Named::Soft1,
229 NamedKey::Soft2 => Named::Soft2,
230 NamedKey::Soft3 => Named::Soft3,
231 NamedKey::Soft4 => Named::Soft4,
232 NamedKey::ChannelDown => Named::ChannelDown,
233 NamedKey::ChannelUp => Named::ChannelUp,
234 NamedKey::Close => Named::Close,
235 NamedKey::MailForward => Named::MailForward,
236 NamedKey::MailReply => Named::MailReply,
237 NamedKey::MailSend => Named::MailSend,
238 NamedKey::MediaClose => Named::MediaClose,
239 NamedKey::MediaFastForward => Named::MediaFastForward,
240 NamedKey::MediaPause => Named::MediaPause,
241 NamedKey::MediaPlay => Named::MediaPlay,
242 NamedKey::MediaPlayPause => Named::MediaPlayPause,
243 NamedKey::MediaRecord => Named::MediaRecord,
244 NamedKey::MediaRewind => Named::MediaRewind,
245 NamedKey::MediaStop => Named::MediaStop,
246 NamedKey::MediaTrackNext => Named::MediaTrackNext,
247 NamedKey::MediaTrackPrevious => Named::MediaTrackPrevious,
248 NamedKey::New => Named::New,
249 NamedKey::Open => Named::Open,
250 NamedKey::Print => Named::Print,
251 NamedKey::Save => Named::Save,
252 NamedKey::SpellCheck => Named::SpellCheck,
253 NamedKey::Key11 => Named::Key11,
254 NamedKey::Key12 => Named::Key12,
255 NamedKey::AudioBalanceLeft => Named::AudioBalanceLeft,
256 NamedKey::AudioBalanceRight => Named::AudioBalanceRight,
257 NamedKey::AudioBassBoostDown => Named::AudioBassBoostDown,
258 NamedKey::AudioBassBoostToggle => Named::AudioBassBoostToggle,
259 NamedKey::AudioBassBoostUp => Named::AudioBassBoostUp,
260 NamedKey::AudioFaderFront => Named::AudioFaderFront,
261 NamedKey::AudioFaderRear => Named::AudioFaderRear,
262 NamedKey::AudioSurroundModeNext => Named::AudioSurroundModeNext,
263 NamedKey::AudioTrebleDown => Named::AudioTrebleDown,
264 NamedKey::AudioTrebleUp => Named::AudioTrebleUp,
265 NamedKey::AudioVolumeDown => Named::AudioVolumeDown,
266 NamedKey::AudioVolumeUp => Named::AudioVolumeUp,
267 NamedKey::AudioVolumeMute => Named::AudioVolumeMute,
268 NamedKey::MicrophoneToggle => Named::MicrophoneToggle,
269 NamedKey::MicrophoneVolumeDown => Named::MicrophoneVolumeDown,
270 NamedKey::MicrophoneVolumeUp => Named::MicrophoneVolumeUp,
271 NamedKey::MicrophoneVolumeMute => Named::MicrophoneVolumeMute,
272 NamedKey::SpeechCorrectionList => Named::SpeechCorrectionList,
273 NamedKey::SpeechInputToggle => Named::SpeechInputToggle,
274 NamedKey::LaunchApplication1 => Named::LaunchApplication1,
275 NamedKey::LaunchApplication2 => Named::LaunchApplication2,
276 NamedKey::LaunchCalendar => Named::LaunchCalendar,
277 NamedKey::LaunchContacts => Named::LaunchContacts,
278 NamedKey::LaunchMail => Named::LaunchMail,
279 NamedKey::LaunchMediaPlayer => Named::LaunchMediaPlayer,
280 NamedKey::LaunchMusicPlayer => Named::LaunchMusicPlayer,
281 NamedKey::LaunchPhone => Named::LaunchPhone,
282 NamedKey::LaunchScreenSaver => Named::LaunchScreenSaver,
283 NamedKey::LaunchSpreadsheet => Named::LaunchSpreadsheet,
284 NamedKey::LaunchWebBrowser => Named::LaunchWebBrowser,
285 NamedKey::LaunchWebCam => Named::LaunchWebCam,
286 NamedKey::LaunchWordProcessor => Named::LaunchWordProcessor,
287 NamedKey::BrowserBack => Named::BrowserBack,
288 NamedKey::BrowserFavorites => Named::BrowserFavorites,
289 NamedKey::BrowserForward => Named::BrowserForward,
290 NamedKey::BrowserHome => Named::BrowserHome,
291 NamedKey::BrowserRefresh => Named::BrowserRefresh,
292 NamedKey::BrowserSearch => Named::BrowserSearch,
293 NamedKey::BrowserStop => Named::BrowserStop,
294 NamedKey::AppSwitch => Named::AppSwitch,
295 NamedKey::Call => Named::Call,
296 NamedKey::Camera => Named::Camera,
297 NamedKey::CameraFocus => Named::CameraFocus,
298 NamedKey::EndCall => Named::EndCall,
299 NamedKey::GoBack => Named::GoBack,
300 NamedKey::GoHome => Named::GoHome,
301 NamedKey::HeadsetHook => Named::HeadsetHook,
302 NamedKey::LastNumberRedial => Named::LastNumberRedial,
303 NamedKey::Notification => Named::Notification,
304 NamedKey::MannerMode => Named::MannerMode,
305 NamedKey::VoiceDial => Named::VoiceDial,
306 NamedKey::TV => Named::TV,
307 NamedKey::TV3DMode => Named::TV3DMode,
308 NamedKey::TVAntennaCable => Named::TVAntennaCable,
309 NamedKey::TVAudioDescription => Named::TVAudioDescription,
310 NamedKey::TVAudioDescriptionMixDown => Named::TVAudioDescriptionMixDown,
311 NamedKey::TVAudioDescriptionMixUp => Named::TVAudioDescriptionMixUp,
312 NamedKey::TVContentsMenu => Named::TVContentsMenu,
313 NamedKey::TVDataService => Named::TVDataService,
314 NamedKey::TVInput => Named::TVInput,
315 NamedKey::TVInputComponent1 => Named::TVInputComponent1,
316 NamedKey::TVInputComponent2 => Named::TVInputComponent2,
317 NamedKey::TVInputComposite1 => Named::TVInputComposite1,
318 NamedKey::TVInputComposite2 => Named::TVInputComposite2,
319 NamedKey::TVInputHDMI1 => Named::TVInputHDMI1,
320 NamedKey::TVInputHDMI2 => Named::TVInputHDMI2,
321 NamedKey::TVInputHDMI3 => Named::TVInputHDMI3,
322 NamedKey::TVInputHDMI4 => Named::TVInputHDMI4,
323 NamedKey::TVInputVGA1 => Named::TVInputVGA1,
324 NamedKey::TVMediaContext => Named::TVMediaContext,
325 NamedKey::TVNetwork => Named::TVNetwork,
326 NamedKey::TVNumberEntry => Named::TVNumberEntry,
327 NamedKey::TVPower => Named::TVPower,
328 NamedKey::TVRadioService => Named::TVRadioService,
329 NamedKey::TVSatellite => Named::TVSatellite,
330 NamedKey::TVSatelliteBS => Named::TVSatelliteBS,
331 NamedKey::TVSatelliteCS => Named::TVSatelliteCS,
332 NamedKey::TVSatelliteToggle => Named::TVSatelliteToggle,
333 NamedKey::TVTerrestrialAnalog => Named::TVTerrestrialAnalog,
334 NamedKey::TVTerrestrialDigital => Named::TVTerrestrialDigital,
335 NamedKey::TVTimer => Named::TVTimer,
336 NamedKey::AVRInput => Named::AVRInput,
337 NamedKey::AVRPower => Named::AVRPower,
338 NamedKey::ColorF0Red => Named::ColorF0Red,
339 NamedKey::ColorF1Green => Named::ColorF1Green,
340 NamedKey::ColorF2Yellow => Named::ColorF2Yellow,
341 NamedKey::ColorF3Blue => Named::ColorF3Blue,
342 NamedKey::ColorF4Grey => Named::ColorF4Grey,
343 NamedKey::ColorF5Brown => Named::ColorF5Brown,
344 NamedKey::ClosedCaptionToggle => Named::ClosedCaptionToggle,
345 NamedKey::Dimmer => Named::Dimmer,
346 NamedKey::DisplaySwap => Named::DisplaySwap,
347 NamedKey::DVR => Named::DVR,
348 NamedKey::Exit => Named::Exit,
349 NamedKey::FavoriteClear0 => Named::FavoriteClear0,
350 NamedKey::FavoriteClear1 => Named::FavoriteClear1,
351 NamedKey::FavoriteClear2 => Named::FavoriteClear2,
352 NamedKey::FavoriteClear3 => Named::FavoriteClear3,
353 NamedKey::FavoriteRecall0 => Named::FavoriteRecall0,
354 NamedKey::FavoriteRecall1 => Named::FavoriteRecall1,
355 NamedKey::FavoriteRecall2 => Named::FavoriteRecall2,
356 NamedKey::FavoriteRecall3 => Named::FavoriteRecall3,
357 NamedKey::FavoriteStore0 => Named::FavoriteStore0,
358 NamedKey::FavoriteStore1 => Named::FavoriteStore1,
359 NamedKey::FavoriteStore2 => Named::FavoriteStore2,
360 NamedKey::FavoriteStore3 => Named::FavoriteStore3,
361 NamedKey::Guide => Named::Guide,
362 NamedKey::GuideNextDay => Named::GuideNextDay,
363 NamedKey::GuidePreviousDay => Named::GuidePreviousDay,
364 NamedKey::Info => Named::Info,
365 NamedKey::InstantReplay => Named::InstantReplay,
366 NamedKey::Link => Named::Link,
367 NamedKey::ListProgram => Named::ListProgram,
368 NamedKey::LiveContent => Named::LiveContent,
369 NamedKey::Lock => Named::Lock,
370 NamedKey::MediaApps => Named::MediaApps,
371 NamedKey::MediaAudioTrack => Named::MediaAudioTrack,
372 NamedKey::MediaLast => Named::MediaLast,
373 NamedKey::MediaSkipBackward => Named::MediaSkipBackward,
374 NamedKey::MediaSkipForward => Named::MediaSkipForward,
375 NamedKey::MediaStepBackward => Named::MediaStepBackward,
376 NamedKey::MediaStepForward => Named::MediaStepForward,
377 NamedKey::MediaTopMenu => Named::MediaTopMenu,
378 NamedKey::NavigateIn => Named::NavigateIn,
379 NamedKey::NavigateNext => Named::NavigateNext,
380 NamedKey::NavigateOut => Named::NavigateOut,
381 NamedKey::NavigatePrevious => Named::NavigatePrevious,
382 NamedKey::NextFavoriteChannel => Named::NextFavoriteChannel,
383 NamedKey::NextUserProfile => Named::NextUserProfile,
384 NamedKey::OnDemand => Named::OnDemand,
385 NamedKey::Pairing => Named::Pairing,
386 NamedKey::PinPDown => Named::PinPDown,
387 NamedKey::PinPMove => Named::PinPMove,
388 NamedKey::PinPToggle => Named::PinPToggle,
389 NamedKey::PinPUp => Named::PinPUp,
390 NamedKey::PlaySpeedDown => Named::PlaySpeedDown,
391 NamedKey::PlaySpeedReset => Named::PlaySpeedReset,
392 NamedKey::PlaySpeedUp => Named::PlaySpeedUp,
393 NamedKey::RandomToggle => Named::RandomToggle,
394 NamedKey::RcLowBattery => Named::RcLowBattery,
395 NamedKey::RecordSpeedNext => Named::RecordSpeedNext,
396 NamedKey::RfBypass => Named::RfBypass,
397 NamedKey::ScanChannelsToggle => Named::ScanChannelsToggle,
398 NamedKey::ScreenModeNext => Named::ScreenModeNext,
399 NamedKey::Settings => Named::Settings,
400 NamedKey::SplitScreenToggle => Named::SplitScreenToggle,
401 NamedKey::STBInput => Named::STBInput,
402 NamedKey::STBPower => Named::STBPower,
403 NamedKey::Subtitle => Named::Subtitle,
404 NamedKey::Teletext => Named::Teletext,
405 NamedKey::VideoModeNext => Named::VideoModeNext,
406 NamedKey::Wink => Named::Wink,
407 NamedKey::ZoomToggle => Named::ZoomToggle,
408 NamedKey::F1 => Named::F1,
409 NamedKey::F2 => Named::F2,
410 NamedKey::F3 => Named::F3,
411 NamedKey::F4 => Named::F4,
412 NamedKey::F5 => Named::F5,
413 NamedKey::F6 => Named::F6,
414 NamedKey::F7 => Named::F7,
415 NamedKey::F8 => Named::F8,
416 NamedKey::F9 => Named::F9,
417 NamedKey::F10 => Named::F10,
418 NamedKey::F11 => Named::F11,
419 NamedKey::F12 => Named::F12,
420 NamedKey::F13 => Named::F13,
421 NamedKey::F14 => Named::F14,
422 NamedKey::F15 => Named::F15,
423 NamedKey::F16 => Named::F16,
424 NamedKey::F17 => Named::F17,
425 NamedKey::F18 => Named::F18,
426 NamedKey::F19 => Named::F19,
427 NamedKey::F20 => Named::F20,
428 NamedKey::F21 => Named::F21,
429 NamedKey::F22 => Named::F22,
430 NamedKey::F23 => Named::F23,
431 NamedKey::F24 => Named::F24,
432 NamedKey::F25 => Named::F25,
433 NamedKey::F26 => Named::F26,
434 NamedKey::F27 => Named::F27,
435 NamedKey::F28 => Named::F28,
436 NamedKey::F29 => Named::F29,
437 NamedKey::F30 => Named::F30,
438 NamedKey::F31 => Named::F31,
439 NamedKey::F32 => Named::F32,
440 NamedKey::F33 => Named::F33,
441 NamedKey::F34 => Named::F34,
442 NamedKey::F35 => Named::F35,
443 _ => return None,
444 })
445}
446
447fn convert_modifiers(mods: winit::keyboard::ModifiersState) -> keyboard::Modifiers {
448 let mut result = keyboard::Modifiers::empty();
449 if mods.shift_key() {
450 result |= keyboard::Modifiers::SHIFT;
451 }
452 if mods.control_key() {
453 result |= keyboard::Modifiers::CTRL;
454 }
455 if mods.alt_key() {
456 result |= keyboard::Modifiers::ALT;
457 }
458 if mods.super_key() {
459 result |= keyboard::Modifiers::LOGO;
460 }
461 result
462}
463
464fn convert_key_location(loc: winit::keyboard::KeyLocation) -> keyboard::Location {
465 match loc {
466 winit::keyboard::KeyLocation::Standard => keyboard::Location::Standard,
467 winit::keyboard::KeyLocation::Left => keyboard::Location::Left,
468 winit::keyboard::KeyLocation::Right => keyboard::Location::Right,
469 winit::keyboard::KeyLocation::Numpad => keyboard::Location::Numpad,
470 }
471}
472
473fn physical_key(key: winit::keyboard::PhysicalKey) -> keyboard::key::Physical {
474 match key {
475 winit::keyboard::PhysicalKey::Code(code) => match convert_key_code(code) {
476 Some(c) => keyboard::key::Physical::Code(c),
477 None => keyboard::key::Physical::Unidentified(NativeCode::Unidentified),
478 },
479 winit::keyboard::PhysicalKey::Unidentified(code) => {
480 keyboard::key::Physical::Unidentified(match code {
481 NativeKeyCode::Unidentified => NativeCode::Unidentified,
482 NativeKeyCode::Android(n) => NativeCode::Android(n),
483 NativeKeyCode::MacOS(n) => NativeCode::MacOS(n),
484 NativeKeyCode::Windows(n) => NativeCode::Windows(n),
485 NativeKeyCode::Xkb(n) => NativeCode::Xkb(n),
486 })
487 }
488 }
489}
490
491fn convert_key_code(code: winit::keyboard::KeyCode) -> Option<keyboard::key::Code> {
492 use keyboard::key::Code;
493 use winit::keyboard::KeyCode;
494 Some(match code {
495 KeyCode::Backquote => Code::Backquote,
496 KeyCode::Backslash => Code::Backslash,
497 KeyCode::BracketLeft => Code::BracketLeft,
498 KeyCode::BracketRight => Code::BracketRight,
499 KeyCode::Comma => Code::Comma,
500 KeyCode::Digit0 => Code::Digit0,
501 KeyCode::Digit1 => Code::Digit1,
502 KeyCode::Digit2 => Code::Digit2,
503 KeyCode::Digit3 => Code::Digit3,
504 KeyCode::Digit4 => Code::Digit4,
505 KeyCode::Digit5 => Code::Digit5,
506 KeyCode::Digit6 => Code::Digit6,
507 KeyCode::Digit7 => Code::Digit7,
508 KeyCode::Digit8 => Code::Digit8,
509 KeyCode::Digit9 => Code::Digit9,
510 KeyCode::Equal => Code::Equal,
511 KeyCode::IntlBackslash => Code::IntlBackslash,
512 KeyCode::IntlRo => Code::IntlRo,
513 KeyCode::IntlYen => Code::IntlYen,
514 KeyCode::KeyA => Code::KeyA,
515 KeyCode::KeyB => Code::KeyB,
516 KeyCode::KeyC => Code::KeyC,
517 KeyCode::KeyD => Code::KeyD,
518 KeyCode::KeyE => Code::KeyE,
519 KeyCode::KeyF => Code::KeyF,
520 KeyCode::KeyG => Code::KeyG,
521 KeyCode::KeyH => Code::KeyH,
522 KeyCode::KeyI => Code::KeyI,
523 KeyCode::KeyJ => Code::KeyJ,
524 KeyCode::KeyK => Code::KeyK,
525 KeyCode::KeyL => Code::KeyL,
526 KeyCode::KeyM => Code::KeyM,
527 KeyCode::KeyN => Code::KeyN,
528 KeyCode::KeyO => Code::KeyO,
529 KeyCode::KeyP => Code::KeyP,
530 KeyCode::KeyQ => Code::KeyQ,
531 KeyCode::KeyR => Code::KeyR,
532 KeyCode::KeyS => Code::KeyS,
533 KeyCode::KeyT => Code::KeyT,
534 KeyCode::KeyU => Code::KeyU,
535 KeyCode::KeyV => Code::KeyV,
536 KeyCode::KeyW => Code::KeyW,
537 KeyCode::KeyX => Code::KeyX,
538 KeyCode::KeyY => Code::KeyY,
539 KeyCode::KeyZ => Code::KeyZ,
540 KeyCode::Minus => Code::Minus,
541 KeyCode::Period => Code::Period,
542 KeyCode::Quote => Code::Quote,
543 KeyCode::Semicolon => Code::Semicolon,
544 KeyCode::Slash => Code::Slash,
545 KeyCode::AltLeft => Code::AltLeft,
546 KeyCode::AltRight => Code::AltRight,
547 KeyCode::Backspace => Code::Backspace,
548 KeyCode::CapsLock => Code::CapsLock,
549 KeyCode::ContextMenu => Code::ContextMenu,
550 KeyCode::ControlLeft => Code::ControlLeft,
551 KeyCode::ControlRight => Code::ControlRight,
552 KeyCode::Enter => Code::Enter,
553 KeyCode::SuperLeft => Code::SuperLeft,
554 KeyCode::SuperRight => Code::SuperRight,
555 KeyCode::ShiftLeft => Code::ShiftLeft,
556 KeyCode::ShiftRight => Code::ShiftRight,
557 KeyCode::Space => Code::Space,
558 KeyCode::Tab => Code::Tab,
559 KeyCode::Convert => Code::Convert,
560 KeyCode::KanaMode => Code::KanaMode,
561 KeyCode::Lang1 => Code::Lang1,
562 KeyCode::Lang2 => Code::Lang2,
563 KeyCode::Lang3 => Code::Lang3,
564 KeyCode::Lang4 => Code::Lang4,
565 KeyCode::Lang5 => Code::Lang5,
566 KeyCode::NonConvert => Code::NonConvert,
567 KeyCode::Delete => Code::Delete,
568 KeyCode::End => Code::End,
569 KeyCode::Help => Code::Help,
570 KeyCode::Home => Code::Home,
571 KeyCode::Insert => Code::Insert,
572 KeyCode::PageDown => Code::PageDown,
573 KeyCode::PageUp => Code::PageUp,
574 KeyCode::ArrowDown => Code::ArrowDown,
575 KeyCode::ArrowLeft => Code::ArrowLeft,
576 KeyCode::ArrowRight => Code::ArrowRight,
577 KeyCode::ArrowUp => Code::ArrowUp,
578 KeyCode::NumLock => Code::NumLock,
579 KeyCode::Numpad0 => Code::Numpad0,
580 KeyCode::Numpad1 => Code::Numpad1,
581 KeyCode::Numpad2 => Code::Numpad2,
582 KeyCode::Numpad3 => Code::Numpad3,
583 KeyCode::Numpad4 => Code::Numpad4,
584 KeyCode::Numpad5 => Code::Numpad5,
585 KeyCode::Numpad6 => Code::Numpad6,
586 KeyCode::Numpad7 => Code::Numpad7,
587 KeyCode::Numpad8 => Code::Numpad8,
588 KeyCode::Numpad9 => Code::Numpad9,
589 KeyCode::NumpadAdd => Code::NumpadAdd,
590 KeyCode::NumpadBackspace => Code::NumpadBackspace,
591 KeyCode::NumpadClear => Code::NumpadClear,
592 KeyCode::NumpadClearEntry => Code::NumpadClearEntry,
593 KeyCode::NumpadComma => Code::NumpadComma,
594 KeyCode::NumpadDecimal => Code::NumpadDecimal,
595 KeyCode::NumpadDivide => Code::NumpadDivide,
596 KeyCode::NumpadEnter => Code::NumpadEnter,
597 KeyCode::NumpadEqual => Code::NumpadEqual,
598 KeyCode::NumpadHash => Code::NumpadHash,
599 KeyCode::NumpadMemoryAdd => Code::NumpadMemoryAdd,
600 KeyCode::NumpadMemoryClear => Code::NumpadMemoryClear,
601 KeyCode::NumpadMemoryRecall => Code::NumpadMemoryRecall,
602 KeyCode::NumpadMemoryStore => Code::NumpadMemoryStore,
603 KeyCode::NumpadMemorySubtract => Code::NumpadMemorySubtract,
604 KeyCode::NumpadMultiply => Code::NumpadMultiply,
605 KeyCode::NumpadParenLeft => Code::NumpadParenLeft,
606 KeyCode::NumpadParenRight => Code::NumpadParenRight,
607 KeyCode::NumpadStar => Code::NumpadStar,
608 KeyCode::NumpadSubtract => Code::NumpadSubtract,
609 KeyCode::Escape => Code::Escape,
610 KeyCode::Fn => Code::Fn,
611 KeyCode::FnLock => Code::FnLock,
612 KeyCode::PrintScreen => Code::PrintScreen,
613 KeyCode::ScrollLock => Code::ScrollLock,
614 KeyCode::Pause => Code::Pause,
615 KeyCode::BrowserBack => Code::BrowserBack,
616 KeyCode::BrowserFavorites => Code::BrowserFavorites,
617 KeyCode::BrowserForward => Code::BrowserForward,
618 KeyCode::BrowserHome => Code::BrowserHome,
619 KeyCode::BrowserRefresh => Code::BrowserRefresh,
620 KeyCode::BrowserSearch => Code::BrowserSearch,
621 KeyCode::BrowserStop => Code::BrowserStop,
622 KeyCode::Eject => Code::Eject,
623 KeyCode::LaunchApp1 => Code::LaunchApp1,
624 KeyCode::LaunchApp2 => Code::LaunchApp2,
625 KeyCode::LaunchMail => Code::LaunchMail,
626 KeyCode::MediaPlayPause => Code::MediaPlayPause,
627 KeyCode::MediaSelect => Code::MediaSelect,
628 KeyCode::MediaStop => Code::MediaStop,
629 KeyCode::MediaTrackNext => Code::MediaTrackNext,
630 KeyCode::MediaTrackPrevious => Code::MediaTrackPrevious,
631 KeyCode::Power => Code::Power,
632 KeyCode::Sleep => Code::Sleep,
633 KeyCode::AudioVolumeDown => Code::AudioVolumeDown,
634 KeyCode::AudioVolumeMute => Code::AudioVolumeMute,
635 KeyCode::AudioVolumeUp => Code::AudioVolumeUp,
636 KeyCode::WakeUp => Code::WakeUp,
637 KeyCode::Meta => Code::Meta,
638 KeyCode::Hyper => Code::Hyper,
639 KeyCode::Turbo => Code::Turbo,
640 KeyCode::Abort => Code::Abort,
641 KeyCode::Resume => Code::Resume,
642 KeyCode::Suspend => Code::Suspend,
643 KeyCode::Again => Code::Again,
644 KeyCode::Copy => Code::Copy,
645 KeyCode::Cut => Code::Cut,
646 KeyCode::Find => Code::Find,
647 KeyCode::Open => Code::Open,
648 KeyCode::Paste => Code::Paste,
649 KeyCode::Props => Code::Props,
650 KeyCode::Select => Code::Select,
651 KeyCode::Undo => Code::Undo,
652 KeyCode::Hiragana => Code::Hiragana,
653 KeyCode::Katakana => Code::Katakana,
654 KeyCode::F1 => Code::F1,
655 KeyCode::F2 => Code::F2,
656 KeyCode::F3 => Code::F3,
657 KeyCode::F4 => Code::F4,
658 KeyCode::F5 => Code::F5,
659 KeyCode::F6 => Code::F6,
660 KeyCode::F7 => Code::F7,
661 KeyCode::F8 => Code::F8,
662 KeyCode::F9 => Code::F9,
663 KeyCode::F10 => Code::F10,
664 KeyCode::F11 => Code::F11,
665 KeyCode::F12 => Code::F12,
666 KeyCode::F13 => Code::F13,
667 KeyCode::F14 => Code::F14,
668 KeyCode::F15 => Code::F15,
669 KeyCode::F16 => Code::F16,
670 KeyCode::F17 => Code::F17,
671 KeyCode::F18 => Code::F18,
672 KeyCode::F19 => Code::F19,
673 KeyCode::F20 => Code::F20,
674 KeyCode::F21 => Code::F21,
675 KeyCode::F22 => Code::F22,
676 KeyCode::F23 => Code::F23,
677 KeyCode::F24 => Code::F24,
678 KeyCode::F25 => Code::F25,
679 KeyCode::F26 => Code::F26,
680 KeyCode::F27 => Code::F27,
681 KeyCode::F28 => Code::F28,
682 KeyCode::F29 => Code::F29,
683 KeyCode::F30 => Code::F30,
684 KeyCode::F31 => Code::F31,
685 KeyCode::F32 => Code::F32,
686 KeyCode::F33 => Code::F33,
687 KeyCode::F34 => Code::F34,
688 KeyCode::F35 => Code::F35,
689 _ => return None,
690 })
691}