keyboard_types/
code.rs

1
2// AUTO GENERATED CODE - DO NOT EDIT
3#![cfg_attr(rustfmt, rustfmt_skip)]
4#![allow(clippy::doc_markdown)]
5#![allow(deprecated)]
6
7use core::fmt::{self, Display};
8use core::str::FromStr;
9#[cfg(not(feature = "std"))]
10use core::error::Error;
11#[cfg(feature = "std")]
12use std::error::Error;
13
14/// Code is the physical position of a key.
15///
16/// The names are based on the US keyboard. If the key
17/// is not present on US keyboards, a name from another
18/// layout is used.
19///
20/// Specification:
21/// <https://w3c.github.io/uievents-code/>
22#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, PartialOrd, Ord)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[non_exhaustive]
25pub enum Code {
26    /// <kbd>`~</kbd> on a US keyboard. This is the <kbd>半角/全角/漢字</kbd> (<span class="unicode">hankaku/zenkaku/kanji</span>) key on Japanese keyboards
27    /// This is also called a backtick or grave.
28    #[doc(alias = "Backtick")]
29    #[doc(alias = "Grave")]
30    Backquote,
31    /// Used for both the US <kbd>\|</kbd> (on the 101-key layout) and also for the key
32    /// located between the <kbd>"</kbd> and <kbd>Enter</kbd> keys on row C of the 102-,
33    /// 104- and 106-key layouts.
34    /// Labelled <kbd>#~</kbd> on a UK (102) keyboard.
35    Backslash,
36    /// <kbd>[{</kbd> on a US keyboard.
37    BracketLeft,
38    /// <kbd>]}</kbd> on a US keyboard.
39    BracketRight,
40    /// <kbd>,&lt;</kbd> on a US keyboard.
41    Comma,
42    /// <kbd>0)</kbd> on a US keyboard.
43    Digit0,
44    /// <kbd>1!</kbd> on a US keyboard.
45    Digit1,
46    /// <kbd>2@</kbd> on a US keyboard.
47    Digit2,
48    /// <kbd>3#</kbd> on a US keyboard.
49    Digit3,
50    /// <kbd>4$</kbd> on a US keyboard.
51    Digit4,
52    /// <kbd>5%</kbd> on a US keyboard.
53    Digit5,
54    /// <kbd>6^</kbd> on a US keyboard.
55    Digit6,
56    /// <kbd>7&amp;</kbd> on a US keyboard.
57    Digit7,
58    /// <kbd>8*</kbd> on a US keyboard.
59    Digit8,
60    /// <kbd>9(</kbd> on a US keyboard.
61    Digit9,
62    /// <kbd>=+</kbd> on a US keyboard.
63    Equal,
64    /// Located between the left <kbd>Shift</kbd> and <kbd>Z</kbd> keys.
65    /// Labelled <kbd>\|</kbd> on a UK keyboard.
66    IntlBackslash,
67    /// Located between the <kbd>/</kbd> and right <kbd>Shift</kbd> keys.
68    /// Labelled <kbd>\ろ</kbd> (<span class="unicode">ro</span>) on a Japanese keyboard.
69    IntlRo,
70    /// Located between the <kbd>=</kbd> and <kbd>Backspace</kbd> keys.
71    /// Labelled <kbd>¥</kbd> (<span class="unicode">yen</span>) on a Japanese keyboard. <kbd>\/</kbd> on a
72    /// Russian keyboard.
73    IntlYen,
74    /// <kbd>a</kbd> on a US keyboard.
75    /// Labelled <kbd>q</kbd> on an AZERTY (e.g., French) keyboard.
76    KeyA,
77    /// <kbd>b</kbd> on a US keyboard.
78    KeyB,
79    /// <kbd>c</kbd> on a US keyboard.
80    KeyC,
81    /// <kbd>d</kbd> on a US keyboard.
82    KeyD,
83    /// <kbd>e</kbd> on a US keyboard.
84    KeyE,
85    /// <kbd>f</kbd> on a US keyboard.
86    KeyF,
87    /// <kbd>g</kbd> on a US keyboard.
88    KeyG,
89    /// <kbd>h</kbd> on a US keyboard.
90    KeyH,
91    /// <kbd>i</kbd> on a US keyboard.
92    KeyI,
93    /// <kbd>j</kbd> on a US keyboard.
94    KeyJ,
95    /// <kbd>k</kbd> on a US keyboard.
96    KeyK,
97    /// <kbd>l</kbd> on a US keyboard.
98    KeyL,
99    /// <kbd>m</kbd> on a US keyboard.
100    KeyM,
101    /// <kbd>n</kbd> on a US keyboard.
102    KeyN,
103    /// <kbd>o</kbd> on a US keyboard.
104    KeyO,
105    /// <kbd>p</kbd> on a US keyboard.
106    KeyP,
107    /// <kbd>q</kbd> on a US keyboard.
108    /// Labelled <kbd>a</kbd> on an AZERTY (e.g., French) keyboard.
109    KeyQ,
110    /// <kbd>r</kbd> on a US keyboard.
111    KeyR,
112    /// <kbd>s</kbd> on a US keyboard.
113    KeyS,
114    /// <kbd>t</kbd> on a US keyboard.
115    KeyT,
116    /// <kbd>u</kbd> on a US keyboard.
117    KeyU,
118    /// <kbd>v</kbd> on a US keyboard.
119    KeyV,
120    /// <kbd>w</kbd> on a US keyboard.
121    /// Labelled <kbd>z</kbd> on an AZERTY (e.g., French) keyboard.
122    KeyW,
123    /// <kbd>x</kbd> on a US keyboard.
124    KeyX,
125    /// <kbd>y</kbd> on a US keyboard.
126    /// Labelled <kbd>z</kbd> on a QWERTZ (e.g., German) keyboard.
127    KeyY,
128    /// <kbd>z</kbd> on a US keyboard.
129    /// Labelled <kbd>w</kbd> on an AZERTY (e.g., French) keyboard, and <kbd>y</kbd> on a
130    /// QWERTZ (e.g., German) keyboard.
131    KeyZ,
132    /// <kbd>-_</kbd> on a US keyboard.
133    Minus,
134    /// <kbd>.&gt;</kbd> on a US keyboard.
135    Period,
136    /// <kbd>'"</kbd> on a US keyboard.
137    /// This is also called an apostrophe.
138    #[doc(alias = "Apostrophe")]
139    Quote,
140    /// <kbd>;:</kbd> on a US keyboard.
141    Semicolon,
142    /// <kbd>/?</kbd> on a US keyboard.
143    Slash,
144    /// <kbd>Alt</kbd>, <kbd>Option</kbd> or <kbd>⌥</kbd>.
145    AltLeft,
146    /// <kbd>Alt</kbd>, <kbd>Option</kbd> or <kbd>⌥</kbd>.
147    /// This is labelled <kbd>AltGr</kbd> key on many keyboard layouts.
148    AltRight,
149    /// <kbd>Backspace</kbd> or <kbd>⌫</kbd>.
150    /// Labelled <kbd>Delete</kbd> on Apple keyboards.
151    Backspace,
152    /// <kbd>CapsLock</kbd> or <kbd>⇪</kbd>
153    CapsLock,
154    /// The application context menu key, which is typically found between the right <kbd>Meta</kbd> key and the right <kbd>Control</kbd> key.
155    ContextMenu,
156    /// <kbd>Control</kbd> or <kbd>⌃</kbd>
157    ControlLeft,
158    /// <kbd>Control</kbd> or <kbd>⌃</kbd>
159    ControlRight,
160    /// <kbd>Enter</kbd> or <kbd>↵</kbd>. Labelled <kbd>Return</kbd> on Apple keyboards.
161    #[doc(alias = "Return")]
162    Enter,
163    /// The Windows, <kbd>⌘</kbd>, <kbd>Command</kbd> or other OS symbol key.
164    /// In Linux (XKB) terminology, this is often referred to as the left "Super".
165    #[doc(alias = "SuperLeft")]
166    #[doc(alias = "OSLeft")]
167    MetaLeft,
168    /// The Windows, <kbd>⌘</kbd>, <kbd>Command</kbd> or other OS symbol key.
169    /// In Linux (XKB) terminology, this is often referred to as the right "Super".
170    #[doc(alias = "SuperRight")]
171    #[doc(alias = "OSRight")]
172    MetaRight,
173    /// <kbd>Shift</kbd> or <kbd>⇧</kbd>
174    ShiftLeft,
175    /// <kbd>Shift</kbd> or <kbd>⇧</kbd>
176    ShiftRight,
177    /// <kbd> </kbd> (space)
178    Space,
179    /// <kbd>Tab</kbd> or <kbd>⇥</kbd>
180    Tab,
181    /// Japanese: <kbd>変換</kbd> (<span class="unicode">henkan</span>)
182    Convert,
183    /// Japanese: <kbd>カタカナ/ひらがな/ローマ字</kbd> (<span class="unicode">katakana/hiragana/romaji</span>)
184    KanaMode,
185    /// Korean: HangulMode <kbd>한/영</kbd> (<span class="unicode">han/yeong</span>)<br/>Japanese (Mac keyboard): <kbd>かな</kbd> (<span class="unicode">kana</span>)
186    Lang1,
187    /// Korean: Hanja <kbd>한자</kbd> (<span class="unicode">hanja</span>)<br/>Japanese (Mac keyboard): <kbd>英数</kbd> (<span class="unicode">eisu</span>)
188    Lang2,
189    /// Japanese (word-processing keyboard): Katakana
190    Lang3,
191    /// Japanese (word-processing keyboard): Hiragana
192    Lang4,
193    /// Japanese (word-processing keyboard): Zenkaku/Hankaku
194    Lang5,
195    /// Japanese: <kbd>無変換</kbd> (<span class="unicode">muhenkan</span>)
196    NonConvert,
197    /// <kbd>⌦</kbd>. The forward delete key.
198    /// Note that on Apple keyboards, the key labelled <kbd>Delete</kbd> on the main part of
199    /// the keyboard should be encoded as [`Backspace`][Code::Backspace].
200    Delete,
201    /// <kbd>End</kbd> or <kbd>↘</kbd>
202    End,
203    /// <kbd>Help</kbd>. Not present on standard PC keyboards.
204    Help,
205    /// <kbd>Home</kbd> or <kbd>↖</kbd>
206    Home,
207    /// <kbd>Insert</kbd> or <kbd>Ins</kbd>. Not present on Apple keyboards.
208    Insert,
209    /// <kbd>Page Down</kbd>, <kbd>PgDn</kbd> or <kbd>⇟</kbd>
210    PageDown,
211    /// <kbd>Page Up</kbd>, <kbd>PgUp</kbd> or <kbd>⇞</kbd>
212    PageUp,
213    /// <kbd>↓</kbd>
214    ArrowDown,
215    /// <kbd>←</kbd>
216    ArrowLeft,
217    /// <kbd>→</kbd>
218    ArrowRight,
219    /// <kbd>↑</kbd>
220    ArrowUp,
221    /// On the Mac, the [`NumLock`][Code::NumLock] code should be used for the numpad <kbd>Clear</kbd> key.
222    NumLock,
223    /// <kbd>0 Ins</kbd> on a keyboard<br/><kbd>0</kbd> on a phone or remote control
224    Numpad0,
225    /// <kbd>1 End</kbd> on a keyboard<br/><kbd>1</kbd> or <kbd>1 QZ</kbd> on a phone or
226    /// remote control
227    Numpad1,
228    /// <kbd>2 ↓</kbd> on a keyboard<br/><kbd>2 ABC</kbd> on a phone or remote control
229    Numpad2,
230    /// <kbd>3 PgDn</kbd> on a keyboard<br/><kbd>3 DEF</kbd> on a phone or remote control
231    Numpad3,
232    /// <kbd>4 ←</kbd> on a keyboard<br/><kbd>4 GHI</kbd> on a phone or remote control
233    Numpad4,
234    /// <kbd>5</kbd> on a keyboard<br/><kbd>5 JKL</kbd> on a phone or remote control
235    Numpad5,
236    /// <kbd>6 →</kbd> on a keyboard<br/><kbd>6 MNO</kbd> on a phone or remote control
237    Numpad6,
238    /// <kbd>7 Home</kbd> on a keyboard<br/><kbd>7 PQRS</kbd> or <kbd>7 PRS</kbd> on a phone
239    /// or remote control
240    Numpad7,
241    /// <kbd>8 ↑</kbd> on a keyboard<br/><kbd>8 TUV</kbd> on a phone or remote control
242    Numpad8,
243    /// <kbd>9 PgUp</kbd> on a keyboard<br/><kbd>9 WXYZ</kbd> or <kbd>9 WXY</kbd> on a phone
244    /// or remote control
245    Numpad9,
246    /// <kbd>+</kbd>
247    NumpadAdd,
248    /// Found on the Microsoft Natural Keyboard.
249    NumpadBackspace,
250    /// <kbd>C</kbd> or <kbd>AC</kbd> (All Clear). Also for use with numpads that have a <kbd>Clear</kbd> key that is separate from the <kbd>NumLock</kbd> key. On the Mac, the numpad <kbd>Clear</kbd> key should always
251    /// be encoded as [`NumLock`][Code::NumLock].
252    NumpadClear,
253    /// <kbd>CE</kbd> (Clear Entry)
254    NumpadClearEntry,
255    /// <kbd>,</kbd> (thousands separator). For locales where the thousands separator
256    /// is a "." (e.g., Brazil), this key may generate a <kbd>.</kbd>.
257    NumpadComma,
258    /// <kbd>. Del</kbd>. For locales where the decimal separator is "," (e.g.,
259    /// Brazil), this key may generate a <kbd>,</kbd>.
260    NumpadDecimal,
261    /// <kbd>/</kbd>
262    NumpadDivide,
263    NumpadEnter,
264    /// <kbd>=</kbd>
265    NumpadEqual,
266    /// <kbd>#</kbd> on a phone or remote control device. This key is typically found
267    /// below the <kbd>9</kbd> key and to the right of the <kbd>0</kbd> key.
268    NumpadHash,
269    /// <kbd>M+</kbd> Add current entry to the value stored in memory.
270    NumpadMemoryAdd,
271    /// <kbd>MC</kbd> Clear the value stored in memory.
272    NumpadMemoryClear,
273    /// <kbd>MR</kbd> Replace the current entry with the value stored in memory.
274    NumpadMemoryRecall,
275    /// <kbd>MS</kbd> Replace the value stored in memory with the current entry.
276    NumpadMemoryStore,
277    /// <kbd>M-</kbd> Subtract current entry from the value stored in memory.
278    NumpadMemorySubtract,
279    /// <kbd>*</kbd> on a keyboard. For use with numpads that provide mathematical
280    /// operations (<kbd>+</kbd>, <kbd>-</kbd>, <kbd>*</kbd> and <kbd>/</kbd>).<br/>Use [`NumpadStar`][Code::NumpadStar] for the <kbd>*</kbd> key on phones and remote controls.
281    NumpadMultiply,
282    /// <kbd>(</kbd> Found on the Microsoft Natural Keyboard.
283    NumpadParenLeft,
284    /// <kbd>)</kbd> Found on the Microsoft Natural Keyboard.
285    NumpadParenRight,
286    /// <kbd>*</kbd> on a phone or remote control device.
287    /// This key is typically found below the <kbd>7</kbd> key and to the left of
288    /// the <kbd>0</kbd> key.<br/>Use [`NumpadMultiply`][Code::NumpadMultiply] for the <kbd>*</kbd> key on
289    /// numeric keypads.
290    NumpadStar,
291    /// <kbd>-</kbd>
292    NumpadSubtract,
293    /// <kbd>Esc</kbd> or <kbd>⎋</kbd>
294    Escape,
295    /// <kbd>Fn</kbd> This is typically a hardware key that does not generate a separate
296    /// code. Most keyboards do not place this key in the function section, but it is
297    /// included here to keep it with related keys.
298    Fn,
299    /// <kbd>FLock</kbd> or <kbd>FnLock</kbd>. Function Lock key. Found on the Microsoft
300    /// Natural Keyboard.
301    FnLock,
302    /// <kbd>PrtScr SysRq</kbd> or <kbd>Print Screen</kbd>
303    PrintScreen,
304    /// <kbd>Scroll Lock</kbd>
305    ScrollLock,
306    /// <kbd>Pause Break</kbd>
307    Pause,
308    /// Some laptops place this key to the left of the <kbd>↑</kbd> key.
309    BrowserBack,
310    BrowserFavorites,
311    /// Some laptops place this key to the right of the <kbd>↑</kbd> key.
312    BrowserForward,
313    BrowserHome,
314    BrowserRefresh,
315    BrowserSearch,
316    BrowserStop,
317    /// <kbd>Eject</kbd> or <kbd>⏏</kbd>. This key is placed in the function
318    /// section on some Apple keyboards.
319    Eject,
320    /// Sometimes labelled <kbd>My Computer</kbd> on the keyboard
321    LaunchApp1,
322    /// Sometimes labelled <kbd>Calculator</kbd> on the keyboard
323    LaunchApp2,
324    LaunchMail,
325    MediaPlayPause,
326    #[doc(alias = "LaunchMediaPlayer")]
327    MediaSelect,
328    MediaStop,
329    MediaTrackNext,
330    MediaTrackPrevious,
331    /// This key is placed in the function section on some Apple keyboards,
332    /// replacing the <kbd>Eject</kbd> key.
333    Power,
334    Sleep,
335    #[doc(alias = "VolumeDown")]
336    AudioVolumeDown,
337    #[doc(alias = "VolumeMute")]
338    AudioVolumeMute,
339    #[doc(alias = "VolumeUp")]
340    AudioVolumeUp,
341    WakeUp,
342    #[deprecated = "marked as legacy in the spec, use Meta instead"]
343    Hyper,
344    #[deprecated = "marked as legacy in the spec, use Meta instead"]
345    Super,
346    #[deprecated = "marked as legacy in the spec, use Meta instead"]
347    Turbo,
348    Abort,
349    Resume,
350    Suspend,
351    /// Found on Sun’s USB keyboard.
352    Again,
353    /// Found on Sun’s USB keyboard.
354    Copy,
355    /// Found on Sun’s USB keyboard.
356    Cut,
357    /// Found on Sun’s USB keyboard.
358    Find,
359    /// Found on Sun’s USB keyboard.
360    Open,
361    /// Found on Sun’s USB keyboard.
362    Paste,
363    /// Found on Sun’s USB keyboard.
364    Props,
365    /// Found on Sun’s USB keyboard.
366    Select,
367    /// Found on Sun’s USB keyboard.
368    Undo,
369    /// Use for dedicated <kbd>ひらがな</kbd> key found on some Japanese word processing keyboards.
370    Hiragana,
371    /// Use for dedicated <kbd>カタカナ</kbd> key found on some Japanese word processing keyboards.
372    Katakana,
373    /// This value code should be used when no other
374    /// value given in this specification is appropriate.
375    Unidentified,
376    /// <kbd>F1</kbd>
377    F1,
378    /// <kbd>F2</kbd>
379    F2,
380    /// <kbd>F3</kbd>
381    F3,
382    /// <kbd>F4</kbd>
383    F4,
384    /// <kbd>F5</kbd>
385    F5,
386    /// <kbd>F6</kbd>
387    F6,
388    /// <kbd>F7</kbd>
389    F7,
390    /// <kbd>F8</kbd>
391    F8,
392    /// <kbd>F9</kbd>
393    F9,
394    /// <kbd>F10</kbd>
395    F10,
396    /// <kbd>F11</kbd>
397    F11,
398    /// <kbd>F12</kbd>
399    F12,
400    /// <kbd>F13</kbd>
401    F13,
402    /// <kbd>F14</kbd>
403    F14,
404    /// <kbd>F15</kbd>
405    F15,
406    /// <kbd>F16</kbd>
407    F16,
408    /// <kbd>F17</kbd>
409    F17,
410    /// <kbd>F18</kbd>
411    F18,
412    /// <kbd>F19</kbd>
413    F19,
414    /// <kbd>F20</kbd>
415    F20,
416    /// <kbd>F21</kbd>
417    F21,
418    /// <kbd>F22</kbd>
419    F22,
420    /// <kbd>F23</kbd>
421    F23,
422    /// <kbd>F24</kbd>
423    F24,
424    /// <kbd>F25</kbd>
425    F25,
426    /// <kbd>F26</kbd>
427    F26,
428    /// <kbd>F27</kbd>
429    F27,
430    /// <kbd>F28</kbd>
431    F28,
432    /// <kbd>F29</kbd>
433    F29,
434    /// <kbd>F30</kbd>
435    F30,
436    /// <kbd>F31</kbd>
437    F31,
438    /// <kbd>F32</kbd>
439    F32,
440    /// <kbd>F33</kbd>
441    F33,
442    /// <kbd>F34</kbd>
443    F34,
444    /// <kbd>F35</kbd>
445    F35,
446    /// Non-standard code value supported by Chromium.
447    BrightnessDown,
448    /// Non-standard code value supported by Chromium.
449    BrightnessUp,
450    /// Non-standard code value supported by Chromium.
451    DisplayToggleIntExt,
452    /// Non-standard code value supported by Chromium.
453    KeyboardLayoutSelect,
454    /// Non-standard code value supported by Chromium.
455    LaunchAssistant,
456    /// Non-standard code value supported by Chromium.
457    LaunchControlPanel,
458    /// Non-standard code value supported by Chromium.
459    LaunchScreenSaver,
460    /// Non-standard code value supported by Chromium.
461    MailForward,
462    /// Non-standard code value supported by Chromium.
463    MailReply,
464    /// Non-standard code value supported by Chromium.
465    MailSend,
466    /// Non-standard code value supported by Chromium.
467    MediaFastForward,
468    /// Non-standard code value supported by Chromium.
469    MediaPause,
470    /// Non-standard code value supported by Chromium.
471    MediaPlay,
472    /// Non-standard code value supported by Chromium.
473    MediaRecord,
474    /// Non-standard code value supported by Chromium.
475    MediaRewind,
476    /// Non-standard code value supported by Chromium.
477    MicrophoneMuteToggle,
478    /// Non-standard code value supported by Chromium.
479    PrivacyScreenToggle,
480    /// Non-standard code value supported by Chromium.
481    KeyboardBacklightToggle,
482    /// Non-standard code value supported by Chromium.
483    SelectTask,
484    /// Non-standard code value supported by Chromium.
485    ShowAllWindows,
486    /// Non-standard code value supported by Chromium.
487    ZoomToggle,
488}
489
490
491impl Display for Code {
492    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
493        use self::Code::*;
494        match *self {
495            Backquote => f.write_str("Backquote"),
496            Backslash => f.write_str("Backslash"),
497            BracketLeft => f.write_str("BracketLeft"),
498            BracketRight => f.write_str("BracketRight"),
499            Comma => f.write_str("Comma"),
500            Digit0 => f.write_str("Digit0"),
501            Digit1 => f.write_str("Digit1"),
502            Digit2 => f.write_str("Digit2"),
503            Digit3 => f.write_str("Digit3"),
504            Digit4 => f.write_str("Digit4"),
505            Digit5 => f.write_str("Digit5"),
506            Digit6 => f.write_str("Digit6"),
507            Digit7 => f.write_str("Digit7"),
508            Digit8 => f.write_str("Digit8"),
509            Digit9 => f.write_str("Digit9"),
510            Equal => f.write_str("Equal"),
511            IntlBackslash => f.write_str("IntlBackslash"),
512            IntlRo => f.write_str("IntlRo"),
513            IntlYen => f.write_str("IntlYen"),
514            KeyA => f.write_str("KeyA"),
515            KeyB => f.write_str("KeyB"),
516            KeyC => f.write_str("KeyC"),
517            KeyD => f.write_str("KeyD"),
518            KeyE => f.write_str("KeyE"),
519            KeyF => f.write_str("KeyF"),
520            KeyG => f.write_str("KeyG"),
521            KeyH => f.write_str("KeyH"),
522            KeyI => f.write_str("KeyI"),
523            KeyJ => f.write_str("KeyJ"),
524            KeyK => f.write_str("KeyK"),
525            KeyL => f.write_str("KeyL"),
526            KeyM => f.write_str("KeyM"),
527            KeyN => f.write_str("KeyN"),
528            KeyO => f.write_str("KeyO"),
529            KeyP => f.write_str("KeyP"),
530            KeyQ => f.write_str("KeyQ"),
531            KeyR => f.write_str("KeyR"),
532            KeyS => f.write_str("KeyS"),
533            KeyT => f.write_str("KeyT"),
534            KeyU => f.write_str("KeyU"),
535            KeyV => f.write_str("KeyV"),
536            KeyW => f.write_str("KeyW"),
537            KeyX => f.write_str("KeyX"),
538            KeyY => f.write_str("KeyY"),
539            KeyZ => f.write_str("KeyZ"),
540            Minus => f.write_str("Minus"),
541            Period => f.write_str("Period"),
542            Quote => f.write_str("Quote"),
543            Semicolon => f.write_str("Semicolon"),
544            Slash => f.write_str("Slash"),
545            AltLeft => f.write_str("AltLeft"),
546            AltRight => f.write_str("AltRight"),
547            Backspace => f.write_str("Backspace"),
548            CapsLock => f.write_str("CapsLock"),
549            ContextMenu => f.write_str("ContextMenu"),
550            ControlLeft => f.write_str("ControlLeft"),
551            ControlRight => f.write_str("ControlRight"),
552            Enter => f.write_str("Enter"),
553            MetaLeft => f.write_str("MetaLeft"),
554            MetaRight => f.write_str("MetaRight"),
555            ShiftLeft => f.write_str("ShiftLeft"),
556            ShiftRight => f.write_str("ShiftRight"),
557            Space => f.write_str("Space"),
558            Tab => f.write_str("Tab"),
559            Convert => f.write_str("Convert"),
560            KanaMode => f.write_str("KanaMode"),
561            Lang1 => f.write_str("Lang1"),
562            Lang2 => f.write_str("Lang2"),
563            Lang3 => f.write_str("Lang3"),
564            Lang4 => f.write_str("Lang4"),
565            Lang5 => f.write_str("Lang5"),
566            NonConvert => f.write_str("NonConvert"),
567            Delete => f.write_str("Delete"),
568            End => f.write_str("End"),
569            Help => f.write_str("Help"),
570            Home => f.write_str("Home"),
571            Insert => f.write_str("Insert"),
572            PageDown => f.write_str("PageDown"),
573            PageUp => f.write_str("PageUp"),
574            ArrowDown => f.write_str("ArrowDown"),
575            ArrowLeft => f.write_str("ArrowLeft"),
576            ArrowRight => f.write_str("ArrowRight"),
577            ArrowUp => f.write_str("ArrowUp"),
578            NumLock => f.write_str("NumLock"),
579            Numpad0 => f.write_str("Numpad0"),
580            Numpad1 => f.write_str("Numpad1"),
581            Numpad2 => f.write_str("Numpad2"),
582            Numpad3 => f.write_str("Numpad3"),
583            Numpad4 => f.write_str("Numpad4"),
584            Numpad5 => f.write_str("Numpad5"),
585            Numpad6 => f.write_str("Numpad6"),
586            Numpad7 => f.write_str("Numpad7"),
587            Numpad8 => f.write_str("Numpad8"),
588            Numpad9 => f.write_str("Numpad9"),
589            NumpadAdd => f.write_str("NumpadAdd"),
590            NumpadBackspace => f.write_str("NumpadBackspace"),
591            NumpadClear => f.write_str("NumpadClear"),
592            NumpadClearEntry => f.write_str("NumpadClearEntry"),
593            NumpadComma => f.write_str("NumpadComma"),
594            NumpadDecimal => f.write_str("NumpadDecimal"),
595            NumpadDivide => f.write_str("NumpadDivide"),
596            NumpadEnter => f.write_str("NumpadEnter"),
597            NumpadEqual => f.write_str("NumpadEqual"),
598            NumpadHash => f.write_str("NumpadHash"),
599            NumpadMemoryAdd => f.write_str("NumpadMemoryAdd"),
600            NumpadMemoryClear => f.write_str("NumpadMemoryClear"),
601            NumpadMemoryRecall => f.write_str("NumpadMemoryRecall"),
602            NumpadMemoryStore => f.write_str("NumpadMemoryStore"),
603            NumpadMemorySubtract => f.write_str("NumpadMemorySubtract"),
604            NumpadMultiply => f.write_str("NumpadMultiply"),
605            NumpadParenLeft => f.write_str("NumpadParenLeft"),
606            NumpadParenRight => f.write_str("NumpadParenRight"),
607            NumpadStar => f.write_str("NumpadStar"),
608            NumpadSubtract => f.write_str("NumpadSubtract"),
609            Escape => f.write_str("Escape"),
610            Fn => f.write_str("Fn"),
611            FnLock => f.write_str("FnLock"),
612            PrintScreen => f.write_str("PrintScreen"),
613            ScrollLock => f.write_str("ScrollLock"),
614            Pause => f.write_str("Pause"),
615            BrowserBack => f.write_str("BrowserBack"),
616            BrowserFavorites => f.write_str("BrowserFavorites"),
617            BrowserForward => f.write_str("BrowserForward"),
618            BrowserHome => f.write_str("BrowserHome"),
619            BrowserRefresh => f.write_str("BrowserRefresh"),
620            BrowserSearch => f.write_str("BrowserSearch"),
621            BrowserStop => f.write_str("BrowserStop"),
622            Eject => f.write_str("Eject"),
623            LaunchApp1 => f.write_str("LaunchApp1"),
624            LaunchApp2 => f.write_str("LaunchApp2"),
625            LaunchMail => f.write_str("LaunchMail"),
626            MediaPlayPause => f.write_str("MediaPlayPause"),
627            MediaSelect => f.write_str("MediaSelect"),
628            MediaStop => f.write_str("MediaStop"),
629            MediaTrackNext => f.write_str("MediaTrackNext"),
630            MediaTrackPrevious => f.write_str("MediaTrackPrevious"),
631            Power => f.write_str("Power"),
632            Sleep => f.write_str("Sleep"),
633            AudioVolumeDown => f.write_str("AudioVolumeDown"),
634            AudioVolumeMute => f.write_str("AudioVolumeMute"),
635            AudioVolumeUp => f.write_str("AudioVolumeUp"),
636            WakeUp => f.write_str("WakeUp"),
637            Hyper => f.write_str("Hyper"),
638            Super => f.write_str("Super"),
639            Turbo => f.write_str("Turbo"),
640            Abort => f.write_str("Abort"),
641            Resume => f.write_str("Resume"),
642            Suspend => f.write_str("Suspend"),
643            Again => f.write_str("Again"),
644            Copy => f.write_str("Copy"),
645            Cut => f.write_str("Cut"),
646            Find => f.write_str("Find"),
647            Open => f.write_str("Open"),
648            Paste => f.write_str("Paste"),
649            Props => f.write_str("Props"),
650            Select => f.write_str("Select"),
651            Undo => f.write_str("Undo"),
652            Hiragana => f.write_str("Hiragana"),
653            Katakana => f.write_str("Katakana"),
654            Unidentified => f.write_str("Unidentified"),
655            F1 => f.write_str("F1"),
656            F2 => f.write_str("F2"),
657            F3 => f.write_str("F3"),
658            F4 => f.write_str("F4"),
659            F5 => f.write_str("F5"),
660            F6 => f.write_str("F6"),
661            F7 => f.write_str("F7"),
662            F8 => f.write_str("F8"),
663            F9 => f.write_str("F9"),
664            F10 => f.write_str("F10"),
665            F11 => f.write_str("F11"),
666            F12 => f.write_str("F12"),
667            F13 => f.write_str("F13"),
668            F14 => f.write_str("F14"),
669            F15 => f.write_str("F15"),
670            F16 => f.write_str("F16"),
671            F17 => f.write_str("F17"),
672            F18 => f.write_str("F18"),
673            F19 => f.write_str("F19"),
674            F20 => f.write_str("F20"),
675            F21 => f.write_str("F21"),
676            F22 => f.write_str("F22"),
677            F23 => f.write_str("F23"),
678            F24 => f.write_str("F24"),
679            F25 => f.write_str("F25"),
680            F26 => f.write_str("F26"),
681            F27 => f.write_str("F27"),
682            F28 => f.write_str("F28"),
683            F29 => f.write_str("F29"),
684            F30 => f.write_str("F30"),
685            F31 => f.write_str("F31"),
686            F32 => f.write_str("F32"),
687            F33 => f.write_str("F33"),
688            F34 => f.write_str("F34"),
689            F35 => f.write_str("F35"),
690            BrightnessDown => f.write_str("BrightnessDown"),
691            BrightnessUp => f.write_str("BrightnessUp"),
692            DisplayToggleIntExt => f.write_str("DisplayToggleIntExt"),
693            KeyboardLayoutSelect => f.write_str("KeyboardLayoutSelect"),
694            LaunchAssistant => f.write_str("LaunchAssistant"),
695            LaunchControlPanel => f.write_str("LaunchControlPanel"),
696            LaunchScreenSaver => f.write_str("LaunchScreenSaver"),
697            MailForward => f.write_str("MailForward"),
698            MailReply => f.write_str("MailReply"),
699            MailSend => f.write_str("MailSend"),
700            MediaFastForward => f.write_str("MediaFastForward"),
701            MediaPause => f.write_str("MediaPause"),
702            MediaPlay => f.write_str("MediaPlay"),
703            MediaRecord => f.write_str("MediaRecord"),
704            MediaRewind => f.write_str("MediaRewind"),
705            MicrophoneMuteToggle => f.write_str("MicrophoneMuteToggle"),
706            PrivacyScreenToggle => f.write_str("PrivacyScreenToggle"),
707            KeyboardBacklightToggle => f.write_str("KeyboardBacklightToggle"),
708            SelectTask => f.write_str("SelectTask"),
709            ShowAllWindows => f.write_str("ShowAllWindows"),
710            ZoomToggle => f.write_str("ZoomToggle"),
711
712        }
713    }
714}
715
716impl FromStr for Code {
717    type Err = UnrecognizedCodeError;
718
719    fn from_str(s: &str) -> Result<Self, Self::Err> {
720        use crate::Code::*;
721        match s {
722            "Backquote" => Ok(Backquote),
723            "Backslash" => Ok(Backslash),
724            "BracketLeft" => Ok(BracketLeft),
725            "BracketRight" => Ok(BracketRight),
726            "Comma" => Ok(Comma),
727            "Digit0" => Ok(Digit0),
728            "Digit1" => Ok(Digit1),
729            "Digit2" => Ok(Digit2),
730            "Digit3" => Ok(Digit3),
731            "Digit4" => Ok(Digit4),
732            "Digit5" => Ok(Digit5),
733            "Digit6" => Ok(Digit6),
734            "Digit7" => Ok(Digit7),
735            "Digit8" => Ok(Digit8),
736            "Digit9" => Ok(Digit9),
737            "Equal" => Ok(Equal),
738            "IntlBackslash" => Ok(IntlBackslash),
739            "IntlRo" => Ok(IntlRo),
740            "IntlYen" => Ok(IntlYen),
741            "KeyA" => Ok(KeyA),
742            "KeyB" => Ok(KeyB),
743            "KeyC" => Ok(KeyC),
744            "KeyD" => Ok(KeyD),
745            "KeyE" => Ok(KeyE),
746            "KeyF" => Ok(KeyF),
747            "KeyG" => Ok(KeyG),
748            "KeyH" => Ok(KeyH),
749            "KeyI" => Ok(KeyI),
750            "KeyJ" => Ok(KeyJ),
751            "KeyK" => Ok(KeyK),
752            "KeyL" => Ok(KeyL),
753            "KeyM" => Ok(KeyM),
754            "KeyN" => Ok(KeyN),
755            "KeyO" => Ok(KeyO),
756            "KeyP" => Ok(KeyP),
757            "KeyQ" => Ok(KeyQ),
758            "KeyR" => Ok(KeyR),
759            "KeyS" => Ok(KeyS),
760            "KeyT" => Ok(KeyT),
761            "KeyU" => Ok(KeyU),
762            "KeyV" => Ok(KeyV),
763            "KeyW" => Ok(KeyW),
764            "KeyX" => Ok(KeyX),
765            "KeyY" => Ok(KeyY),
766            "KeyZ" => Ok(KeyZ),
767            "Minus" => Ok(Minus),
768            "Period" => Ok(Period),
769            "Quote" => Ok(Quote),
770            "Semicolon" => Ok(Semicolon),
771            "Slash" => Ok(Slash),
772            "AltLeft" => Ok(AltLeft),
773            "AltRight" => Ok(AltRight),
774            "Backspace" => Ok(Backspace),
775            "CapsLock" => Ok(CapsLock),
776            "ContextMenu" => Ok(ContextMenu),
777            "ControlLeft" => Ok(ControlLeft),
778            "ControlRight" => Ok(ControlRight),
779            "Enter" => Ok(Enter),
780            "MetaLeft" | "OSLeft" => Ok(MetaLeft),
781            "MetaRight" | "OSRight" => Ok(MetaRight),
782            "ShiftLeft" => Ok(ShiftLeft),
783            "ShiftRight" => Ok(ShiftRight),
784            "Space" => Ok(Space),
785            "Tab" => Ok(Tab),
786            "Convert" => Ok(Convert),
787            "KanaMode" => Ok(KanaMode),
788            "Lang1" => Ok(Lang1),
789            "Lang2" => Ok(Lang2),
790            "Lang3" => Ok(Lang3),
791            "Lang4" => Ok(Lang4),
792            "Lang5" => Ok(Lang5),
793            "NonConvert" => Ok(NonConvert),
794            "Delete" => Ok(Delete),
795            "End" => Ok(End),
796            "Help" => Ok(Help),
797            "Home" => Ok(Home),
798            "Insert" => Ok(Insert),
799            "PageDown" => Ok(PageDown),
800            "PageUp" => Ok(PageUp),
801            "ArrowDown" => Ok(ArrowDown),
802            "ArrowLeft" => Ok(ArrowLeft),
803            "ArrowRight" => Ok(ArrowRight),
804            "ArrowUp" => Ok(ArrowUp),
805            "NumLock" => Ok(NumLock),
806            "Numpad0" => Ok(Numpad0),
807            "Numpad1" => Ok(Numpad1),
808            "Numpad2" => Ok(Numpad2),
809            "Numpad3" => Ok(Numpad3),
810            "Numpad4" => Ok(Numpad4),
811            "Numpad5" => Ok(Numpad5),
812            "Numpad6" => Ok(Numpad6),
813            "Numpad7" => Ok(Numpad7),
814            "Numpad8" => Ok(Numpad8),
815            "Numpad9" => Ok(Numpad9),
816            "NumpadAdd" => Ok(NumpadAdd),
817            "NumpadBackspace" => Ok(NumpadBackspace),
818            "NumpadClear" => Ok(NumpadClear),
819            "NumpadClearEntry" => Ok(NumpadClearEntry),
820            "NumpadComma" => Ok(NumpadComma),
821            "NumpadDecimal" => Ok(NumpadDecimal),
822            "NumpadDivide" => Ok(NumpadDivide),
823            "NumpadEnter" => Ok(NumpadEnter),
824            "NumpadEqual" => Ok(NumpadEqual),
825            "NumpadHash" => Ok(NumpadHash),
826            "NumpadMemoryAdd" => Ok(NumpadMemoryAdd),
827            "NumpadMemoryClear" => Ok(NumpadMemoryClear),
828            "NumpadMemoryRecall" => Ok(NumpadMemoryRecall),
829            "NumpadMemoryStore" => Ok(NumpadMemoryStore),
830            "NumpadMemorySubtract" => Ok(NumpadMemorySubtract),
831            "NumpadMultiply" => Ok(NumpadMultiply),
832            "NumpadParenLeft" => Ok(NumpadParenLeft),
833            "NumpadParenRight" => Ok(NumpadParenRight),
834            "NumpadStar" => Ok(NumpadStar),
835            "NumpadSubtract" => Ok(NumpadSubtract),
836            "Escape" => Ok(Escape),
837            "Fn" => Ok(Fn),
838            "FnLock" => Ok(FnLock),
839            "PrintScreen" => Ok(PrintScreen),
840            "ScrollLock" => Ok(ScrollLock),
841            "Pause" => Ok(Pause),
842            "BrowserBack" => Ok(BrowserBack),
843            "BrowserFavorites" => Ok(BrowserFavorites),
844            "BrowserForward" => Ok(BrowserForward),
845            "BrowserHome" => Ok(BrowserHome),
846            "BrowserRefresh" => Ok(BrowserRefresh),
847            "BrowserSearch" => Ok(BrowserSearch),
848            "BrowserStop" => Ok(BrowserStop),
849            "Eject" => Ok(Eject),
850            "LaunchApp1" => Ok(LaunchApp1),
851            "LaunchApp2" => Ok(LaunchApp2),
852            "LaunchMail" => Ok(LaunchMail),
853            "MediaPlayPause" => Ok(MediaPlayPause),
854            "MediaSelect" | "LaunchMediaPlayer" => Ok(MediaSelect),
855            "MediaStop" => Ok(MediaStop),
856            "MediaTrackNext" => Ok(MediaTrackNext),
857            "MediaTrackPrevious" => Ok(MediaTrackPrevious),
858            "Power" => Ok(Power),
859            "Sleep" => Ok(Sleep),
860            "AudioVolumeDown" | "VolumeDown" => Ok(AudioVolumeDown),
861            "AudioVolumeMute" | "VolumeMute" => Ok(AudioVolumeMute),
862            "AudioVolumeUp" | "VolumeUp" => Ok(AudioVolumeUp),
863            "WakeUp" => Ok(WakeUp),
864            "Hyper" => Ok(Hyper),
865            "Super" => Ok(Super),
866            "Turbo" => Ok(Turbo),
867            "Abort" => Ok(Abort),
868            "Resume" => Ok(Resume),
869            "Suspend" => Ok(Suspend),
870            "Again" => Ok(Again),
871            "Copy" => Ok(Copy),
872            "Cut" => Ok(Cut),
873            "Find" => Ok(Find),
874            "Open" => Ok(Open),
875            "Paste" => Ok(Paste),
876            "Props" => Ok(Props),
877            "Select" => Ok(Select),
878            "Undo" => Ok(Undo),
879            "Hiragana" => Ok(Hiragana),
880            "Katakana" => Ok(Katakana),
881            "Unidentified" => Ok(Unidentified),
882            "F1" => Ok(F1),
883            "F2" => Ok(F2),
884            "F3" => Ok(F3),
885            "F4" => Ok(F4),
886            "F5" => Ok(F5),
887            "F6" => Ok(F6),
888            "F7" => Ok(F7),
889            "F8" => Ok(F8),
890            "F9" => Ok(F9),
891            "F10" => Ok(F10),
892            "F11" => Ok(F11),
893            "F12" => Ok(F12),
894            "F13" => Ok(F13),
895            "F14" => Ok(F14),
896            "F15" => Ok(F15),
897            "F16" => Ok(F16),
898            "F17" => Ok(F17),
899            "F18" => Ok(F18),
900            "F19" => Ok(F19),
901            "F20" => Ok(F20),
902            "F21" => Ok(F21),
903            "F22" => Ok(F22),
904            "F23" => Ok(F23),
905            "F24" => Ok(F24),
906            "F25" => Ok(F25),
907            "F26" => Ok(F26),
908            "F27" => Ok(F27),
909            "F28" => Ok(F28),
910            "F29" => Ok(F29),
911            "F30" => Ok(F30),
912            "F31" => Ok(F31),
913            "F32" => Ok(F32),
914            "F33" => Ok(F33),
915            "F34" => Ok(F34),
916            "F35" => Ok(F35),
917            "BrightnessDown" => Ok(BrightnessDown),
918            "BrightnessUp" => Ok(BrightnessUp),
919            "DisplayToggleIntExt" => Ok(DisplayToggleIntExt),
920            "KeyboardLayoutSelect" => Ok(KeyboardLayoutSelect),
921            "LaunchAssistant" => Ok(LaunchAssistant),
922            "LaunchControlPanel" => Ok(LaunchControlPanel),
923            "LaunchScreenSaver" => Ok(LaunchScreenSaver),
924            "MailForward" => Ok(MailForward),
925            "MailReply" => Ok(MailReply),
926            "MailSend" => Ok(MailSend),
927            "MediaFastForward" => Ok(MediaFastForward),
928            "MediaPause" => Ok(MediaPause),
929            "MediaPlay" => Ok(MediaPlay),
930            "MediaRecord" => Ok(MediaRecord),
931            "MediaRewind" => Ok(MediaRewind),
932            "MicrophoneMuteToggle" => Ok(MicrophoneMuteToggle),
933            "PrivacyScreenToggle" => Ok(PrivacyScreenToggle),
934            "KeyboardBacklightToggle" => Ok(KeyboardBacklightToggle),
935            "SelectTask" => Ok(SelectTask),
936            "ShowAllWindows" => Ok(ShowAllWindows),
937            "ZoomToggle" => Ok(ZoomToggle),
938
939            _ => Err(UnrecognizedCodeError),
940        }
941    }
942}
943
944/// Parse from string error, returned when string does not match to any [`Code`] variant.
945#[derive(Clone, Debug)]
946pub struct UnrecognizedCodeError;
947
948impl fmt::Display for UnrecognizedCodeError {
949    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
950        write!(f, "Unrecognized code")
951    }
952}
953
954impl Error for UnrecognizedCodeError {}