Skip to main content

graphix_package_gui/
convert.rs

1//! Convert winit events to iced events.
2//!
3//! Based on iced_winit/src/conversion.rs but adapted for our event loop.
4
5use 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
12/// Convert a winit WindowEvent to zero or more iced Events.
13pub 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}