Skip to main content

ui_events_floem_winit/
keyboard.rs

1// Copyright 2025 the UI Events Authors
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3
4//! Support routines for converting keyboard data from [`winit`]
5
6use alloc::string::ToString as _;
7
8use ui_events::keyboard::{Code, Key, KeyState, KeyboardEvent, Location, Modifiers, NamedKey};
9use winit::keyboard::{KeyLocation, ModifiersState};
10
11extern crate alloc;
12
13/// Convert a [`winit::event::KeyEvent`] and [`winit::keyboard::ModifiersState`] to a [`KeyboardEvent`].
14pub fn from_winit_keyboard_event(
15    winit_event: winit::event::KeyEvent,
16    mods: ModifiersState,
17) -> KeyboardEvent {
18    KeyboardEvent {
19        key: from_winit_key(winit_event.logical_key),
20        code: from_winit_code(winit_event.physical_key),
21        modifiers: from_winit_modifier_state(mods),
22        location: from_winit_location(winit_event.location),
23        is_composing: false,
24        repeat: winit_event.repeat,
25        state: match winit_event.state {
26            winit::event::ElementState::Pressed => KeyState::Down,
27            winit::event::ElementState::Released => KeyState::Up,
28        },
29    }
30}
31
32/// Convert a [`winit::keyboard::KeyLocation`] to a [`ui_events::keyboard::Location`].
33pub fn from_winit_location(winit_location: KeyLocation) -> Location {
34    match winit_location {
35        KeyLocation::Standard => Location::Standard,
36        KeyLocation::Left => Location::Left,
37        KeyLocation::Right => Location::Right,
38        KeyLocation::Numpad => Location::Numpad,
39    }
40}
41
42/// Convert a [`winit::keyboard::ModifiersState`] to a [`ui_events::keyboard::Modifiers`].
43pub fn from_winit_modifier_state(modifiers_state: ModifiersState) -> Modifiers {
44    let mut modifiers = Modifiers::default();
45    if modifiers_state.control_key() {
46        modifiers.insert(Modifiers::CONTROL);
47    }
48    if modifiers_state.alt_key() {
49        modifiers.insert(Modifiers::ALT);
50    }
51    if modifiers_state.shift_key() {
52        modifiers.insert(Modifiers::SHIFT);
53    }
54    if modifiers_state.meta_key() {
55        modifiers.insert(Modifiers::META);
56    }
57    modifiers
58}
59
60/// Convert a [`winit::keyboard::Key`] to a [`ui_events::keyboard::Key`].
61pub fn from_winit_key(winit_key: winit::keyboard::Key) -> Key {
62    use winit::keyboard::Key as WK;
63    use winit::keyboard::NamedKey as WNK;
64    // TODO: I'm guessing I did something wrong here
65    match winit_key {
66        WK::Character(c) => Key::Character(c.to_string()),
67        WK::Unidentified(_) => Key::Named(NamedKey::Unidentified),
68        WK::Dead(_) => Key::Named(NamedKey::Dead),
69        WK::Named(k) => Key::Named(match k {
70            WNK::Alt => NamedKey::Alt,
71            WNK::AltGraph => NamedKey::AltGraph,
72            WNK::CapsLock => NamedKey::CapsLock,
73            WNK::Control => NamedKey::Control,
74            WNK::Fn => NamedKey::Fn,
75            WNK::FnLock => NamedKey::FnLock,
76            WNK::NumLock => NamedKey::NumLock,
77            WNK::ScrollLock => NamedKey::ScrollLock,
78            WNK::Shift => NamedKey::Shift,
79            WNK::Symbol => NamedKey::Symbol,
80            WNK::SymbolLock => NamedKey::SymbolLock,
81            WNK::Meta => NamedKey::Meta,
82            #[allow(deprecated)]
83            WNK::Hyper => NamedKey::Hyper,
84            #[allow(deprecated)]
85            WNK::Super => NamedKey::Super,
86            WNK::Enter => NamedKey::Enter,
87            WNK::Tab => NamedKey::Tab,
88            WNK::ArrowDown => NamedKey::ArrowDown,
89            WNK::ArrowLeft => NamedKey::ArrowLeft,
90            WNK::ArrowRight => NamedKey::ArrowRight,
91            WNK::ArrowUp => NamedKey::ArrowUp,
92            WNK::End => NamedKey::End,
93            WNK::Home => NamedKey::Home,
94            WNK::PageDown => NamedKey::PageDown,
95            WNK::PageUp => NamedKey::PageUp,
96            WNK::Backspace => NamedKey::Backspace,
97            WNK::Clear => NamedKey::Clear,
98            WNK::Copy => NamedKey::Copy,
99            WNK::CrSel => NamedKey::CrSel,
100            WNK::Cut => NamedKey::Cut,
101            WNK::Delete => NamedKey::Delete,
102            WNK::EraseEof => NamedKey::EraseEof,
103            WNK::ExSel => NamedKey::ExSel,
104            WNK::Insert => NamedKey::Insert,
105            WNK::Paste => NamedKey::Paste,
106            WNK::Redo => NamedKey::Redo,
107            WNK::Undo => NamedKey::Undo,
108            WNK::Accept => NamedKey::Accept,
109            WNK::Again => NamedKey::Again,
110            WNK::Attn => NamedKey::Attn,
111            WNK::Cancel => NamedKey::Cancel,
112            WNK::ContextMenu => NamedKey::ContextMenu,
113            WNK::Escape => NamedKey::Escape,
114            WNK::Execute => NamedKey::Execute,
115            WNK::Find => NamedKey::Find,
116            WNK::Help => NamedKey::Help,
117            WNK::Pause => NamedKey::Pause,
118            WNK::Play => NamedKey::Play,
119            WNK::Props => NamedKey::Props,
120            WNK::Select => NamedKey::Select,
121            WNK::ZoomIn => NamedKey::ZoomIn,
122            WNK::ZoomOut => NamedKey::ZoomOut,
123            WNK::BrightnessDown => NamedKey::BrightnessDown,
124            WNK::BrightnessUp => NamedKey::BrightnessUp,
125            WNK::Eject => NamedKey::Eject,
126            WNK::LogOff => NamedKey::LogOff,
127            WNK::Power => NamedKey::Power,
128            WNK::PowerOff => NamedKey::PowerOff,
129            WNK::PrintScreen => NamedKey::PrintScreen,
130            WNK::Hibernate => NamedKey::Hibernate,
131            WNK::Standby => NamedKey::Standby,
132            WNK::WakeUp => NamedKey::WakeUp,
133            WNK::AllCandidates => NamedKey::AllCandidates,
134            WNK::Alphanumeric => NamedKey::Alphanumeric,
135            WNK::CodeInput => NamedKey::CodeInput,
136            WNK::Compose => NamedKey::Compose,
137            WNK::Convert => NamedKey::Convert,
138            WNK::FinalMode => NamedKey::FinalMode,
139            WNK::GroupFirst => NamedKey::GroupFirst,
140            WNK::GroupLast => NamedKey::GroupLast,
141            WNK::GroupNext => NamedKey::GroupNext,
142            WNK::GroupPrevious => NamedKey::GroupPrevious,
143            WNK::ModeChange => NamedKey::ModeChange,
144            WNK::NextCandidate => NamedKey::NextCandidate,
145            WNK::NonConvert => NamedKey::NonConvert,
146            WNK::PreviousCandidate => NamedKey::PreviousCandidate,
147            WNK::Process => NamedKey::Process,
148            WNK::SingleCandidate => NamedKey::SingleCandidate,
149            WNK::HangulMode => NamedKey::HangulMode,
150            WNK::HanjaMode => NamedKey::HanjaMode,
151            WNK::JunjaMode => NamedKey::JunjaMode,
152            WNK::Eisu => NamedKey::Eisu,
153            WNK::Hankaku => NamedKey::Hankaku,
154            WNK::Hiragana => NamedKey::Hiragana,
155            WNK::HiraganaKatakana => NamedKey::HiraganaKatakana,
156            WNK::KanaMode => NamedKey::KanaMode,
157            WNK::KanjiMode => NamedKey::KanjiMode,
158            WNK::Katakana => NamedKey::Katakana,
159            WNK::Romaji => NamedKey::Romaji,
160            WNK::Zenkaku => NamedKey::Zenkaku,
161            WNK::ZenkakuHankaku => NamedKey::ZenkakuHankaku,
162            WNK::Soft1 => NamedKey::Soft1,
163            WNK::Soft2 => NamedKey::Soft2,
164            WNK::Soft3 => NamedKey::Soft3,
165            WNK::Soft4 => NamedKey::Soft4,
166            WNK::ChannelDown => NamedKey::ChannelDown,
167            WNK::ChannelUp => NamedKey::ChannelUp,
168            WNK::Close => NamedKey::Close,
169            WNK::MailForward => NamedKey::MailForward,
170            WNK::MailReply => NamedKey::MailReply,
171            WNK::MailSend => NamedKey::MailSend,
172            WNK::MediaClose => NamedKey::MediaClose,
173            WNK::MediaFastForward => NamedKey::MediaFastForward,
174            WNK::MediaPause => NamedKey::MediaPause,
175            WNK::MediaPlay => NamedKey::MediaPlay,
176            WNK::MediaPlayPause => NamedKey::MediaPlayPause,
177            WNK::MediaRecord => NamedKey::MediaRecord,
178            WNK::MediaRewind => NamedKey::MediaRewind,
179            WNK::MediaStop => NamedKey::MediaStop,
180            WNK::MediaTrackNext => NamedKey::MediaTrackNext,
181            WNK::MediaTrackPrevious => NamedKey::MediaTrackPrevious,
182            WNK::New => NamedKey::New,
183            WNK::Open => NamedKey::Open,
184            WNK::Print => NamedKey::Print,
185            WNK::Save => NamedKey::Save,
186            WNK::SpellCheck => NamedKey::SpellCheck,
187            WNK::Key11 => NamedKey::Key11,
188            WNK::Key12 => NamedKey::Key12,
189            WNK::AudioBalanceLeft => NamedKey::AudioBalanceLeft,
190            WNK::AudioBalanceRight => NamedKey::AudioBalanceRight,
191            WNK::AudioBassBoostDown => NamedKey::AudioBassBoostDown,
192            WNK::AudioBassBoostToggle => NamedKey::AudioBassBoostToggle,
193            WNK::AudioBassBoostUp => NamedKey::AudioBassBoostUp,
194            WNK::AudioFaderFront => NamedKey::AudioFaderFront,
195            WNK::AudioFaderRear => NamedKey::AudioFaderRear,
196            WNK::AudioSurroundModeNext => NamedKey::AudioSurroundModeNext,
197            WNK::AudioTrebleDown => NamedKey::AudioTrebleDown,
198            WNK::AudioTrebleUp => NamedKey::AudioTrebleUp,
199            WNK::AudioVolumeDown => NamedKey::AudioVolumeDown,
200            WNK::AudioVolumeUp => NamedKey::AudioVolumeUp,
201            WNK::AudioVolumeMute => NamedKey::AudioVolumeMute,
202            WNK::MicrophoneToggle => NamedKey::MicrophoneToggle,
203            WNK::MicrophoneVolumeDown => NamedKey::MicrophoneVolumeDown,
204            WNK::MicrophoneVolumeUp => NamedKey::MicrophoneVolumeUp,
205            WNK::MicrophoneVolumeMute => NamedKey::MicrophoneVolumeMute,
206            WNK::SpeechCorrectionList => NamedKey::SpeechCorrectionList,
207            WNK::SpeechInputToggle => NamedKey::SpeechInputToggle,
208            WNK::LaunchApplication1 => NamedKey::LaunchApplication1,
209            WNK::LaunchApplication2 => NamedKey::LaunchApplication2,
210            WNK::LaunchCalendar => NamedKey::LaunchCalendar,
211            WNK::LaunchContacts => NamedKey::LaunchContacts,
212            WNK::LaunchMail => NamedKey::LaunchMail,
213            WNK::LaunchMediaPlayer => NamedKey::LaunchMediaPlayer,
214            WNK::LaunchMusicPlayer => NamedKey::LaunchMusicPlayer,
215            WNK::LaunchPhone => NamedKey::LaunchPhone,
216            WNK::LaunchScreenSaver => NamedKey::LaunchScreenSaver,
217            WNK::LaunchSpreadsheet => NamedKey::LaunchSpreadsheet,
218            WNK::LaunchWebBrowser => NamedKey::LaunchWebBrowser,
219            WNK::LaunchWebCam => NamedKey::LaunchWebCam,
220            WNK::LaunchWordProcessor => NamedKey::LaunchWordProcessor,
221            WNK::BrowserBack => NamedKey::BrowserBack,
222            WNK::BrowserFavorites => NamedKey::BrowserFavorites,
223            WNK::BrowserForward => NamedKey::BrowserForward,
224            WNK::BrowserHome => NamedKey::BrowserHome,
225            WNK::BrowserRefresh => NamedKey::BrowserRefresh,
226            WNK::BrowserSearch => NamedKey::BrowserSearch,
227            WNK::BrowserStop => NamedKey::BrowserStop,
228            WNK::AppSwitch => NamedKey::AppSwitch,
229            WNK::Call => NamedKey::Call,
230            WNK::Camera => NamedKey::Camera,
231            WNK::CameraFocus => NamedKey::CameraFocus,
232            WNK::EndCall => NamedKey::EndCall,
233            WNK::GoBack => NamedKey::GoBack,
234            WNK::GoHome => NamedKey::GoHome,
235            WNK::HeadsetHook => NamedKey::HeadsetHook,
236            WNK::LastNumberRedial => NamedKey::LastNumberRedial,
237            WNK::Notification => NamedKey::Notification,
238            WNK::MannerMode => NamedKey::MannerMode,
239            WNK::VoiceDial => NamedKey::VoiceDial,
240            WNK::TV => NamedKey::TV,
241            WNK::TV3DMode => NamedKey::TV3DMode,
242            WNK::TVAntennaCable => NamedKey::TVAntennaCable,
243            WNK::TVAudioDescription => NamedKey::TVAudioDescription,
244            WNK::TVAudioDescriptionMixDown => NamedKey::TVAudioDescriptionMixDown,
245            WNK::TVAudioDescriptionMixUp => NamedKey::TVAudioDescriptionMixUp,
246            WNK::TVContentsMenu => NamedKey::TVContentsMenu,
247            WNK::TVDataService => NamedKey::TVDataService,
248            WNK::TVInput => NamedKey::TVInput,
249            WNK::TVInputComponent1 => NamedKey::TVInputComponent1,
250            WNK::TVInputComponent2 => NamedKey::TVInputComponent2,
251            WNK::TVInputComposite1 => NamedKey::TVInputComposite1,
252            WNK::TVInputComposite2 => NamedKey::TVInputComposite2,
253            WNK::TVInputHDMI1 => NamedKey::TVInputHDMI1,
254            WNK::TVInputHDMI2 => NamedKey::TVInputHDMI2,
255            WNK::TVInputHDMI3 => NamedKey::TVInputHDMI3,
256            WNK::TVInputHDMI4 => NamedKey::TVInputHDMI4,
257            WNK::TVInputVGA1 => NamedKey::TVInputVGA1,
258            WNK::TVMediaContext => NamedKey::TVMediaContext,
259            WNK::TVNetwork => NamedKey::TVNetwork,
260            WNK::TVNumberEntry => NamedKey::TVNumberEntry,
261            WNK::TVPower => NamedKey::TVPower,
262            WNK::TVRadioService => NamedKey::TVRadioService,
263            WNK::TVSatellite => NamedKey::TVSatellite,
264            WNK::TVSatelliteBS => NamedKey::TVSatelliteBS,
265            WNK::TVSatelliteCS => NamedKey::TVSatelliteCS,
266            WNK::TVSatelliteToggle => NamedKey::TVSatelliteToggle,
267            WNK::TVTerrestrialAnalog => NamedKey::TVTerrestrialAnalog,
268            WNK::TVTerrestrialDigital => NamedKey::TVTerrestrialDigital,
269            WNK::TVTimer => NamedKey::TVTimer,
270            WNK::AVRInput => NamedKey::AVRInput,
271            WNK::AVRPower => NamedKey::AVRPower,
272            WNK::ColorF0Red => NamedKey::ColorF0Red,
273            WNK::ColorF1Green => NamedKey::ColorF1Green,
274            WNK::ColorF2Yellow => NamedKey::ColorF2Yellow,
275            WNK::ColorF3Blue => NamedKey::ColorF3Blue,
276            WNK::ColorF4Grey => NamedKey::ColorF4Grey,
277            WNK::ColorF5Brown => NamedKey::ColorF5Brown,
278            WNK::ClosedCaptionToggle => NamedKey::ClosedCaptionToggle,
279            WNK::Dimmer => NamedKey::Dimmer,
280            WNK::DisplaySwap => NamedKey::DisplaySwap,
281            WNK::DVR => NamedKey::DVR,
282            WNK::Exit => NamedKey::Exit,
283            WNK::FavoriteClear0 => NamedKey::FavoriteClear0,
284            WNK::FavoriteClear1 => NamedKey::FavoriteClear1,
285            WNK::FavoriteClear2 => NamedKey::FavoriteClear2,
286            WNK::FavoriteClear3 => NamedKey::FavoriteClear3,
287            WNK::FavoriteRecall0 => NamedKey::FavoriteRecall0,
288            WNK::FavoriteRecall1 => NamedKey::FavoriteRecall1,
289            WNK::FavoriteRecall2 => NamedKey::FavoriteRecall2,
290            WNK::FavoriteRecall3 => NamedKey::FavoriteRecall3,
291            WNK::FavoriteStore0 => NamedKey::FavoriteStore0,
292            WNK::FavoriteStore1 => NamedKey::FavoriteStore1,
293            WNK::FavoriteStore2 => NamedKey::FavoriteStore2,
294            WNK::FavoriteStore3 => NamedKey::FavoriteStore3,
295            WNK::Guide => NamedKey::Guide,
296            WNK::GuideNextDay => NamedKey::GuideNextDay,
297            WNK::GuidePreviousDay => NamedKey::GuidePreviousDay,
298            WNK::Info => NamedKey::Info,
299            WNK::InstantReplay => NamedKey::InstantReplay,
300            WNK::Link => NamedKey::Link,
301            WNK::ListProgram => NamedKey::ListProgram,
302            WNK::LiveContent => NamedKey::LiveContent,
303            WNK::Lock => NamedKey::Lock,
304            WNK::MediaApps => NamedKey::MediaApps,
305            WNK::MediaAudioTrack => NamedKey::MediaAudioTrack,
306            WNK::MediaLast => NamedKey::MediaLast,
307            WNK::MediaSkipBackward => NamedKey::MediaSkipBackward,
308            WNK::MediaSkipForward => NamedKey::MediaSkipForward,
309            WNK::MediaStepBackward => NamedKey::MediaStepBackward,
310            WNK::MediaStepForward => NamedKey::MediaStepForward,
311            WNK::MediaTopMenu => NamedKey::MediaTopMenu,
312            WNK::NavigateIn => NamedKey::NavigateIn,
313            WNK::NavigateNext => NamedKey::NavigateNext,
314            WNK::NavigateOut => NamedKey::NavigateOut,
315            WNK::NavigatePrevious => NamedKey::NavigatePrevious,
316            WNK::NextFavoriteChannel => NamedKey::NextFavoriteChannel,
317            WNK::NextUserProfile => NamedKey::NextUserProfile,
318            WNK::OnDemand => NamedKey::OnDemand,
319            WNK::Pairing => NamedKey::Pairing,
320            WNK::PinPDown => NamedKey::PinPDown,
321            WNK::PinPMove => NamedKey::PinPMove,
322            WNK::PinPToggle => NamedKey::PinPToggle,
323            WNK::PinPUp => NamedKey::PinPUp,
324            WNK::PlaySpeedDown => NamedKey::PlaySpeedDown,
325            WNK::PlaySpeedReset => NamedKey::PlaySpeedReset,
326            WNK::PlaySpeedUp => NamedKey::PlaySpeedUp,
327            WNK::RandomToggle => NamedKey::RandomToggle,
328            WNK::RcLowBattery => NamedKey::RcLowBattery,
329            WNK::RecordSpeedNext => NamedKey::RecordSpeedNext,
330            WNK::RfBypass => NamedKey::RfBypass,
331            WNK::ScanChannelsToggle => NamedKey::ScanChannelsToggle,
332            WNK::ScreenModeNext => NamedKey::ScreenModeNext,
333            WNK::Settings => NamedKey::Settings,
334            WNK::SplitScreenToggle => NamedKey::SplitScreenToggle,
335            WNK::STBInput => NamedKey::STBInput,
336            WNK::STBPower => NamedKey::STBPower,
337            WNK::Subtitle => NamedKey::Subtitle,
338            WNK::Teletext => NamedKey::Teletext,
339            WNK::VideoModeNext => NamedKey::VideoModeNext,
340            WNK::Wink => NamedKey::Wink,
341            WNK::ZoomToggle => NamedKey::ZoomToggle,
342            WNK::F1 => NamedKey::F1,
343            WNK::F2 => NamedKey::F2,
344            WNK::F3 => NamedKey::F3,
345            WNK::F4 => NamedKey::F4,
346            WNK::F5 => NamedKey::F5,
347            WNK::F6 => NamedKey::F6,
348            WNK::F7 => NamedKey::F7,
349            WNK::F8 => NamedKey::F8,
350            WNK::F9 => NamedKey::F9,
351            WNK::F10 => NamedKey::F10,
352            WNK::F11 => NamedKey::F11,
353            WNK::F12 => NamedKey::F12,
354            WNK::F13 => NamedKey::F13,
355            WNK::F14 => NamedKey::F14,
356            WNK::F15 => NamedKey::F15,
357            WNK::F16 => NamedKey::F16,
358            WNK::F17 => NamedKey::F17,
359            WNK::F18 => NamedKey::F18,
360            WNK::F19 => NamedKey::F19,
361            WNK::F20 => NamedKey::F20,
362            WNK::F21 => NamedKey::F21,
363            WNK::F22 => NamedKey::F22,
364            WNK::F23 => NamedKey::F23,
365            WNK::F24 => NamedKey::F24,
366            WNK::F25 => NamedKey::F25,
367            WNK::F26 => NamedKey::F26,
368            WNK::F27 => NamedKey::F27,
369            WNK::F28 => NamedKey::F28,
370            WNK::F29 => NamedKey::F29,
371            WNK::F30 => NamedKey::F30,
372            WNK::F31 => NamedKey::F31,
373            WNK::F32 => NamedKey::F32,
374            WNK::F33 => NamedKey::F33,
375            WNK::F34 => NamedKey::F34,
376            WNK::F35 => NamedKey::F35,
377            _ => NamedKey::Unidentified,
378        }),
379    }
380}
381
382/// Convert a [`winit::keyboard::PhysicalKey`] to a [`ui_events::keyboard::Code`].
383pub fn from_winit_code(physical_key: winit::keyboard::PhysicalKey) -> Code {
384    use winit::keyboard::KeyCode as KC;
385    use winit::keyboard::PhysicalKey;
386    match physical_key {
387        PhysicalKey::Unidentified(_) => Code::Unidentified,
388        PhysicalKey::Code(key_code) => match key_code {
389            // Variants that don't match 1:1
390            // With winit 0.31, these are renamed to swap the meta and super to match the W3C specs.
391            KC::Backquote => Code::Backquote,
392            KC::Backslash => Code::Backslash,
393            KC::BracketLeft => Code::BracketLeft,
394            KC::BracketRight => Code::BracketRight,
395            KC::Comma => Code::Comma,
396            KC::Digit0 => Code::Digit0,
397            KC::Digit1 => Code::Digit1,
398            KC::Digit2 => Code::Digit2,
399            KC::Digit3 => Code::Digit3,
400            KC::Digit4 => Code::Digit4,
401            KC::Digit5 => Code::Digit5,
402            KC::Digit6 => Code::Digit6,
403            KC::Digit7 => Code::Digit7,
404            KC::Digit8 => Code::Digit8,
405            KC::Digit9 => Code::Digit9,
406            KC::Equal => Code::Equal,
407            KC::IntlBackslash => Code::IntlBackslash,
408            KC::IntlRo => Code::IntlRo,
409            KC::IntlYen => Code::IntlYen,
410            KC::KeyA => Code::KeyA,
411            KC::KeyB => Code::KeyB,
412            KC::KeyC => Code::KeyC,
413            KC::KeyD => Code::KeyD,
414            KC::KeyE => Code::KeyE,
415            KC::KeyF => Code::KeyF,
416            KC::KeyG => Code::KeyG,
417            KC::KeyH => Code::KeyH,
418            KC::KeyI => Code::KeyI,
419            KC::KeyJ => Code::KeyJ,
420            KC::KeyK => Code::KeyK,
421            KC::KeyL => Code::KeyL,
422            KC::KeyM => Code::KeyM,
423            KC::KeyN => Code::KeyN,
424            KC::KeyO => Code::KeyO,
425            KC::KeyP => Code::KeyP,
426            KC::KeyQ => Code::KeyQ,
427            KC::KeyR => Code::KeyR,
428            KC::KeyS => Code::KeyS,
429            KC::KeyT => Code::KeyT,
430            KC::KeyU => Code::KeyU,
431            KC::KeyV => Code::KeyV,
432            KC::KeyW => Code::KeyW,
433            KC::KeyX => Code::KeyX,
434            KC::KeyY => Code::KeyY,
435            KC::KeyZ => Code::KeyZ,
436            KC::Minus => Code::Minus,
437            KC::Period => Code::Period,
438            KC::Quote => Code::Quote,
439            KC::Semicolon => Code::Semicolon,
440            KC::Slash => Code::Slash,
441            KC::AltLeft => Code::AltLeft,
442            KC::AltRight => Code::AltRight,
443            KC::Backspace => Code::Backspace,
444            KC::CapsLock => Code::CapsLock,
445            KC::ContextMenu => Code::ContextMenu,
446            KC::ControlLeft => Code::ControlLeft,
447            KC::ControlRight => Code::ControlRight,
448            KC::Enter => Code::Enter,
449            KC::ShiftLeft => Code::ShiftLeft,
450            KC::ShiftRight => Code::ShiftRight,
451            KC::Space => Code::Space,
452            KC::Tab => Code::Tab,
453            KC::Convert => Code::Convert,
454            KC::KanaMode => Code::KanaMode,
455            KC::Lang1 => Code::Lang1,
456            KC::Lang2 => Code::Lang2,
457            KC::Lang3 => Code::Lang3,
458            KC::Lang4 => Code::Lang4,
459            KC::Lang5 => Code::Lang5,
460            KC::NonConvert => Code::NonConvert,
461            KC::Delete => Code::Delete,
462            KC::End => Code::End,
463            KC::Help => Code::Help,
464            KC::Home => Code::Home,
465            KC::Insert => Code::Insert,
466            KC::PageDown => Code::PageDown,
467            KC::PageUp => Code::PageUp,
468            KC::ArrowDown => Code::ArrowDown,
469            KC::ArrowLeft => Code::ArrowLeft,
470            KC::ArrowRight => Code::ArrowRight,
471            KC::ArrowUp => Code::ArrowUp,
472            KC::NumLock => Code::NumLock,
473            KC::Numpad0 => Code::Numpad0,
474            KC::Numpad1 => Code::Numpad1,
475            KC::Numpad2 => Code::Numpad2,
476            KC::Numpad3 => Code::Numpad3,
477            KC::Numpad4 => Code::Numpad4,
478            KC::Numpad5 => Code::Numpad5,
479            KC::Numpad6 => Code::Numpad6,
480            KC::Numpad7 => Code::Numpad7,
481            KC::Numpad8 => Code::Numpad8,
482            KC::Numpad9 => Code::Numpad9,
483            KC::NumpadAdd => Code::NumpadAdd,
484            KC::NumpadBackspace => Code::NumpadBackspace,
485            KC::NumpadClear => Code::NumpadClear,
486            KC::NumpadClearEntry => Code::NumpadClearEntry,
487            KC::NumpadComma => Code::NumpadComma,
488            KC::NumpadDecimal => Code::NumpadDecimal,
489            KC::NumpadDivide => Code::NumpadDivide,
490            KC::NumpadEnter => Code::NumpadEnter,
491            KC::NumpadEqual => Code::NumpadEqual,
492            KC::NumpadHash => Code::NumpadHash,
493            KC::NumpadMemoryAdd => Code::NumpadMemoryAdd,
494            KC::NumpadMemoryClear => Code::NumpadMemoryClear,
495            KC::NumpadMemoryRecall => Code::NumpadMemoryRecall,
496            KC::NumpadMemoryStore => Code::NumpadMemoryStore,
497            KC::NumpadMemorySubtract => Code::NumpadMemorySubtract,
498            KC::NumpadMultiply => Code::NumpadMultiply,
499            KC::NumpadParenLeft => Code::NumpadParenLeft,
500            KC::NumpadParenRight => Code::NumpadParenRight,
501            KC::NumpadStar => Code::NumpadStar,
502            KC::NumpadSubtract => Code::NumpadSubtract,
503            KC::Escape => Code::Escape,
504            KC::Fn => Code::Fn,
505            KC::FnLock => Code::FnLock,
506            KC::PrintScreen => Code::PrintScreen,
507            KC::ScrollLock => Code::ScrollLock,
508            KC::Pause => Code::Pause,
509            KC::BrowserBack => Code::BrowserBack,
510            KC::BrowserFavorites => Code::BrowserFavorites,
511            KC::BrowserForward => Code::BrowserForward,
512            KC::BrowserHome => Code::BrowserHome,
513            KC::BrowserRefresh => Code::BrowserRefresh,
514            KC::BrowserSearch => Code::BrowserSearch,
515            KC::BrowserStop => Code::BrowserStop,
516            KC::Eject => Code::Eject,
517            KC::LaunchApp1 => Code::LaunchApp1,
518            KC::LaunchApp2 => Code::LaunchApp2,
519            KC::LaunchMail => Code::LaunchMail,
520            KC::MediaPlayPause => Code::MediaPlayPause,
521            KC::MediaSelect => Code::MediaSelect,
522            KC::MediaStop => Code::MediaStop,
523            KC::MediaTrackNext => Code::MediaTrackNext,
524            KC::MediaTrackPrevious => Code::MediaTrackPrevious,
525            KC::Power => Code::Power,
526            KC::Sleep => Code::Sleep,
527            KC::AudioVolumeDown => Code::AudioVolumeDown,
528            KC::AudioVolumeMute => Code::AudioVolumeMute,
529            KC::AudioVolumeUp => Code::AudioVolumeUp,
530            KC::WakeUp => Code::WakeUp,
531            #[allow(deprecated)]
532            KC::Hyper => Code::Hyper,
533            #[allow(deprecated)]
534            KC::Turbo => Code::Turbo,
535            KC::Abort => Code::Abort,
536            KC::Resume => Code::Resume,
537            KC::Suspend => Code::Suspend,
538            KC::Again => Code::Again,
539            KC::Copy => Code::Copy,
540            KC::Cut => Code::Cut,
541            KC::Find => Code::Find,
542            KC::Open => Code::Open,
543            KC::Paste => Code::Paste,
544            KC::Props => Code::Props,
545            KC::Select => Code::Select,
546            KC::Undo => Code::Undo,
547            KC::Hiragana => Code::Hiragana,
548            KC::Katakana => Code::Katakana,
549            KC::F1 => Code::F1,
550            KC::F2 => Code::F2,
551            KC::F3 => Code::F3,
552            KC::F4 => Code::F4,
553            KC::F5 => Code::F5,
554            KC::F6 => Code::F6,
555            KC::F7 => Code::F7,
556            KC::F8 => Code::F8,
557            KC::F9 => Code::F9,
558            KC::F10 => Code::F10,
559            KC::F11 => Code::F11,
560            KC::F12 => Code::F12,
561            KC::F13 => Code::F13,
562            KC::F14 => Code::F14,
563            KC::F15 => Code::F15,
564            KC::F16 => Code::F16,
565            KC::F17 => Code::F17,
566            KC::F18 => Code::F18,
567            KC::F19 => Code::F19,
568            KC::F20 => Code::F20,
569            KC::F21 => Code::F21,
570            KC::F22 => Code::F22,
571            KC::F23 => Code::F23,
572            KC::F24 => Code::F24,
573            KC::F25 => Code::F25,
574            KC::F26 => Code::F26,
575            KC::F27 => Code::F27,
576            KC::F28 => Code::F28,
577            KC::F29 => Code::F29,
578            KC::F30 => Code::F30,
579            KC::F31 => Code::F31,
580            KC::F32 => Code::F32,
581            KC::F33 => Code::F33,
582            KC::F34 => Code::F34,
583            KC::F35 => Code::F35,
584            _ => Code::Unidentified,
585        },
586    }
587}