input_event/
scancode.rs

1use num_enum::TryFromPrimitive;
2use serde::{Deserialize, Serialize};
3
4/*
5 * https://learn.microsoft.com/en-us/windows/win32/inputdev/about-keyboard-input
6 * https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf
7 * https://kbd-project.org/docs/scancodes/scancodes-1.html
8 */
9#[repr(u32)]
10#[derive(Debug, Clone, Copy, TryFromPrimitive)]
11pub enum Windows {
12    Shutdown = 0xE05E,
13    SystemSleep = 0xE05F,
14    SystemWakeUp = 0xE063,
15    ErrorRollOver = 0x00FF,
16    KeyA = 0x001E,
17    KeyB = 0x0030,
18    KeyC = 0x002E,
19    KeyD = 0x0020,
20    KeyE = 0x0012,
21    KeyF = 0x0021,
22    KeyG = 0x0022,
23    KeyH = 0x0023,
24    KeyI = 0x0017,
25    KeyJ = 0x0024,
26    KeyK = 0x0025,
27    KeyL = 0x0026,
28    KeyM = 0x0032,
29    KeyN = 0x0031,
30    KeyO = 0x0018,
31    KeyP = 0x0019,
32    KeyQ = 0x0010,
33    KeyR = 0x0013,
34    KeyS = 0x001F,
35    KeyT = 0x0014,
36    KeyU = 0x0016,
37    KeyV = 0x002F,
38    KeyW = 0x0011,
39    KeyX = 0x002D,
40    KeyY = 0x0015,
41    KeyZ = 0x002C,
42    Key1 = 0x0002,
43    Key2 = 0x0003,
44    Key3 = 0x0004,
45    Key4 = 0x0005,
46    Key5 = 0x0006,
47    Key6 = 0x0007,
48    Key7 = 0x0008,
49    Key8 = 0x0009,
50    Key9 = 0x000A,
51    Key0 = 0x000B,
52    KeyEnter = 0x001C,
53    KeyEsc = 0x0001,
54    KeyDelete = 0x000E,
55    KeyTab = 0x000F,
56    KeySpace = 0x0039,
57    KeyMinus = 0x000C,
58    KeyEqual = 0x000D,
59    KeyLeftBrace = 0x001A,
60    KeyRightBrace = 0x001B,
61    KeyBackslash = 0x002B,
62    KeySemiColon = 0x0027,
63    KeyApostrophe = 0x0028,
64    KeyGrave = 0x0029,
65    KeyComma = 0x0033,
66    KeyDot = 0x0034,
67    KeySlash = 0x0035,
68    KeyCapsLock = 0x003A,
69    KeyF1 = 0x003B,
70    KeyF2 = 0x003C,
71    KeyF3 = 0x003D,
72    KeyF4 = 0x003E,
73    KeyF5 = 0x003F,
74    KeyF6 = 0x0040,
75    KeyF7 = 0x0041,
76    KeyF8 = 0x0042,
77    KeyF9 = 0x0043,
78    KeyF10 = 0x0044,
79    KeyF11 = 0x0057,
80    KeyF12 = 0x0058,
81    KeyPrintScreen = 0xE037,
82    KeyScrollLock = 0x0046,
83    KeyPause = 0xE11D45,
84    KeyInsert = 0xE052,
85    KeyHome = 0xE047,
86    KeyPageUp = 0xE049,
87    KeyDeleteForward = 0xE053,
88    KeyEnd = 0xE04F,
89    KeyPageDown = 0xE051,
90    KeyRight = 0xE04D,
91    KeyLeft = 0xE04B,
92    KeyDown = 0xE050,
93    KeyUp = 0xE048,
94    KeypadNumLock = 0x0045,
95    KeypadSlash = 0xE035,
96    KeypadStar = 0x0037,
97    KeypadDash = 0x004A,
98    KeypadPlus = 0x004E,
99    KeypadEnter = 0xE01C,
100    Keypad1End = 0x004F,
101    Keypad2DownArrow = 0x0050,
102    Keypad3PageDn = 0x0051,
103    Keypad4LeftArrow = 0x004B,
104    Keypad5 = 0x004C,
105    Keypad6RightArrow = 0x004D,
106    Keypad7Home = 0x0047,
107    Keypad8UpArrow = 0x0048,
108    Keypad9PageUp = 0x0049,
109    Keypad0Insert = 0x0052,
110    KeypadDot = 0x0053,
111    KeyNonUSSlashBar = 0x0056,
112    KeyApplication = 0xE05D,
113    KeypadEquals = 0x0059,
114    KeyF13 = 0x0064,
115    KeyF14 = 0x0065,
116    KeyF15 = 0x0066,
117    KeyF16 = 0x0067,
118    KeyF17 = 0x0068,
119    KeyF18 = 0x0069,
120    KeyF19 = 0x006A,
121    KeyF20 = 0x006B,
122    KeyF21 = 0x006C,
123    KeyF22 = 0x006D,
124    KeyF23 = 0x006E,
125    KeyF24 = 0x0076, // KeyLANG5
126    KeypadComma = 0x007E,
127    KeyInternational1 = 0x0073,
128    KeyInternational2 = 0x0070,
129    KeyInternational3 = 0x007D, // typo in doc -> its Int'l 3 not Int'l 2
130    #[allow(dead_code)]
131    KeyInternational4 = 0x0079,
132    #[allow(dead_code)]
133    KeyInternational5 = 0x007B,
134    // KeyInternational6 = 0x005C,
135    KeyLANG1 = 0x0072,
136    KeyLANG2 = 0x0071,
137    KeyLANG3 = 0x0078,
138    KeyLANG4 = 0x0077,
139    // KeyLANG5 = 0x0076,
140    KeyLeftCtrl = 0x001D,
141    KeyLeftShift = 0x002A,
142    KeyLeftAlt = 0x0038,
143    KeyLeftGUI = 0xE05B,
144    KeyRightCtrl = 0xE01D,
145    KeyRightShift = 0x0036,
146    KeyFakeRightShift = 0xE036,
147    KeyRightAlt = 0xE038,
148    KeyRightGUI = 0xE05C,
149    KeyScanNextTrack = 0xE019,
150    KeyScanPreviousTrack = 0xE010,
151    KeyStop = 0xE024,
152    KeyPlayPause = 0xE022,
153    KeyMute = 0xE020,
154    KeyVolumeUp = 0xE030,
155    KeyVolumeDown = 0xE02E,
156    #[allow(dead_code)]
157    ALConsumerControlConfiguration = 0xE06D, // TODO Unused
158    ALEmailReader = 0xE06C,
159    ALCalculator = 0xE021,
160    ALLocalMachineBrowser = 0xE06B,
161    ACSearch = 0xE065,
162    ACHome = 0xE032,
163    ACBack = 0xE06A,
164    ACForward = 0xE069,
165    ACStop = 0xE068,
166    ACRefresh = 0xE067,
167    ACBookmarks = 0xE066,
168}
169
170/*
171 * https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h
172 */
173#[repr(u32)]
174#[derive(Serialize, Deserialize, Debug, Clone, Copy, Eq, Hash, PartialEq, TryFromPrimitive)]
175#[allow(dead_code)]
176pub enum Linux {
177    KeyReserved = 0,
178    KeyEsc = 1,
179    Key1 = 2,
180    Key2 = 3,
181    Key3 = 4,
182    Key4 = 5,
183    Key5 = 6,
184    Key6 = 7,
185    Key7 = 8,
186    Key8 = 9,
187    Key9 = 10,
188    Key0 = 11,
189    KeyMinus = 12,
190    KeyEqual = 13,
191    KeyBackspace = 14,
192    KeyTab = 15,
193    KeyQ = 16,
194    KeyW = 17,
195    KeyE = 18,
196    KeyR = 19,
197    KeyT = 20,
198    KeyY = 21,
199    KeyU = 22,
200    KeyI = 23,
201    KeyO = 24,
202    KeyP = 25,
203    KeyLeftbrace = 26,
204    KeyRightbrace = 27,
205    KeyEnter = 28,
206    KeyLeftCtrl = 29,
207    KeyA = 30,
208    KeyS = 31,
209    KeyD = 32,
210    KeyF = 33,
211    KeyG = 34,
212    KeyH = 35,
213    KeyJ = 36,
214    KeyK = 37,
215    KeyL = 38,
216    KeySemicolon = 39,
217    KeyApostrophe = 40,
218    KeyGrave = 41,
219    KeyLeftShift = 42,
220    KeyBackslash = 43,
221    KeyZ = 44,
222    KeyX = 45,
223    KeyC = 46,
224    KeyV = 47,
225    KeyB = 48,
226    KeyN = 49,
227    KeyM = 50,
228    KeyComma = 51,
229    KeyDot = 52,
230    KeySlash = 53,
231    KeyRightShift = 54,
232    KeyKpAsterisk = 55,
233    KeyLeftAlt = 56,
234    KeySpace = 57,
235    KeyCapsLock = 58,
236    KeyF1 = 59,
237    KeyF2 = 60,
238    KeyF3 = 61,
239    KeyF4 = 62,
240    KeyF5 = 63,
241    KeyF6 = 64,
242    KeyF7 = 65,
243    KeyF8 = 66,
244    KeyF9 = 67,
245    KeyF10 = 68,
246    KeyNumlock = 69,
247    KeyScrollLock = 70,
248    KeyKp7 = 71,
249    KeyKp8 = 72,
250    KeyKp9 = 73,
251    KeyKpMinus = 74,
252    KeyKp4 = 75,
253    KeyKp5 = 76,
254    KeyKp6 = 77,
255    KeyKpplus = 78,
256    KeyKp1 = 79,
257    KeyKp2 = 80,
258    KeyKp3 = 81,
259    KeyKp0 = 82,
260    KeyKpDot = 83,
261    Invalid = 84,
262    KeyZenkakuhankaku = 85,
263    Key102nd = 86,
264    KeyF11 = 87,
265    KeyF12 = 88,
266    KeyRo = 89,
267    KeyKatakana = 90,
268    KeyHiragana = 91,
269    KeyHenkan = 92,
270    KeyKatakanahiragana = 93,
271    KeyMuhenkan = 94,
272    KeyKpJpComma = 95,
273    KeyKpEnter = 96,
274    KeyRightCtrl = 97,
275    KeyKpslash = 98,
276    KeySysrq = 99,
277    KeyRightalt = 100,
278    KeyLinefeed = 101,
279    KeyHome = 102,
280    KeyUp = 103,
281    KeyPageup = 104,
282    KeyLeft = 105,
283    KeyRight = 106,
284    KeyEnd = 107,
285    KeyDown = 108,
286    KeyPagedown = 109,
287    KeyInsert = 110,
288    KeyDelete = 111,
289    KeyMacro = 112,
290    KeyMute = 113,
291    KeyVolumeDown = 114,
292    KeyVolumeUp = 115,
293    KeyPower = 116, /* SC System Power Down */
294    KeyKpequal = 117,
295    KeyKpplusminus = 118,
296    KeyPause = 119,
297    KeyScale = 120, /* AL Compiz Scale (Expose) */
298    KeyKpcomma = 121,
299    KeyHanguel = 122,
300    // KEY_HANGUEL = KeyHangeul,
301    KeyHanja = 123,
302    KeyYen = 124,
303    KeyLeftMeta = 125,
304    KeyRightmeta = 126,
305    KeyCompose = 127,
306    KeyStop = 128, /* AC Stop */
307    KeyAgain = 129,
308    KeyProps = 130, /* AC Properties */
309    KeyUndo = 131,  /* AC Undo */
310    KeyFront = 132,
311    KeyCopy = 133,  /* AC Copy */
312    KeyOpen = 134,  /* AC Open */
313    KeyPaste = 135, /* AC Paste */
314    KeyFind = 136,  /* AC Search */
315    KeyCut = 137,   /* AC Cut */
316    KeyHelp = 138,  /* AL Integrated Help Center */
317    KeyMenu = 139,  /* Menu (show menu) */
318    KeyCalc = 140,  /* AL Calculator */
319    KeySetup = 141,
320    KeySleep = 142,  /* SC System Sleep */
321    KeyWakeup = 143, /* System Wake Up */
322    KeyFile = 144,   /* AL Local Machine Browser */
323    KeySendfile = 145,
324    KeyDeletefile = 146,
325    KeyXfer = 147,
326    KeyProg1 = 148,
327    KeyProg2 = 149,
328    KeyWww = 150, /* AL Internet Browser */
329    KeyMsdos = 151,
330    KeyCoffee = 152, /* AL Terminal Lock/Screensaver */
331    // KEY_SCREENLOCK = KeyCoffee,
332    KeyRotateDisplay = 153, /* Display orientation for e.g. tablets */
333    // KEY_DIRECTION = KeyRotateDisplay,
334    KeyCyclewindows = 154,
335    KeyMail = 155,
336    KeyBookmarks = 156, /* AC Bookmarks */
337    KeyComputer = 157,
338    KeyBack = 158,    /* AC Back */
339    KeyForward = 159, /* AC Forward */
340    KeyClosecd = 160,
341    KeyEjectcd = 161,
342    KeyEjectclosecd = 162,
343    KeyNextsong = 163,
344    KeyPlaypause = 164,
345    KeyPrevioussong = 165,
346    KeyStopcd = 166,
347    KeyRecord = 167,
348    KeyRewind = 168,
349    KeyPhone = 169, /* Media Select Telephone */
350    KeyIso = 170,
351    KeyConfig = 171,   /* AL Consumer Control Configuration */
352    KeyHomepage = 172, /* AC Home */
353    KeyRefresh = 173,  /* AC Refresh */
354    KeyExit = 174,     /* AC Exit */
355    KeyMove = 175,
356    KeyEdit = 176,
357    KeyScrollup = 177,
358    KeyScrolldown = 178,
359    KeyKpleftparen = 179,
360    KeyKprightparen = 180,
361    KeyNew = 181,  /* AC New */
362    KeyRedo = 182, /* AC Redo/Repeat */
363    KeyF13 = 183,
364    KeyF14 = 184,
365    KeyF15 = 185,
366    KeyF16 = 186,
367    KeyF17 = 187,
368    KeyF18 = 188,
369    KeyF19 = 189,
370    KeyF20 = 190,
371    KeyF21 = 191,
372    KeyF22 = 192,
373    KeyF23 = 193,
374    KeyF24 = 194,
375    Invalid1 = 195,
376    Invalid2 = 196,
377    Invalid3 = 197,
378    Invalid4 = 198,
379    Invalid5 = 199,
380    KeyPlaycd = 200,
381    KeyPausecd = 201,
382    KeyProg3 = 202,
383    KeyProg4 = 203,
384    KeyAllApplications = 204, /* AC Desktop Show All Applications */
385    // KEY_DASHBOARD = KeyAllApplications,
386    KeySuspend = 205,
387    KeyClose = 206, /* AC Close */
388    KeyPlay = 207,
389    KeyFastforward = 208,
390    KeyBassboost = 209,
391    KeyPrint = 210, /* AC Print */
392    KeyHp = 211,
393    KeyCamera = 212,
394    KeySound = 213,
395    KeyQuestion = 214,
396    KeyEmail = 215,
397    KeyChat = 216,
398    KeySearch = 217,
399    KeyConnect = 218,
400    KeyFinance = 219, /* AL Checkbook/Finance */
401    KeySport = 220,
402    KeyShop = 221,
403    KeyAlterase = 222,
404    KeyCancel = 223, /* AC Cancel */
405    KeyBrightnessdown = 224,
406    KeyBrightnessup = 225,
407    KeyMedia = 226,
408    KeySwitchvideomode = 227, /* Cycle between available video, outputs (Monitor/LCD/TV-out/etc) */
409    KeyKbdillumtoggle = 228,
410    KeyKbdillumdown = 229,
411    KeyKbdillumup = 230,
412    KeySend = 231,        /* AC Send */
413    KeyReply = 232,       /* AC Reply */
414    KeyForwardmail = 233, /* AC Forward Msg */
415    KeySave = 234,        /* AC Save */
416    KeyDocuments = 235,
417    KeyBattery = 236,
418    KeyBluetooth = 237,
419    KeyWlan = 238,
420    KeyUwb = 239,
421    KeyUnknown = 240,
422    KeyVideoNext = 241,       /* drive next video source */
423    KeyVideoPrev = 242,       /* drive previous video source */
424    KeyBrightnessCycle = 243, /* brightness up, after max is min */
425    KeyBrightnessAuto = 244, /* Set Auto Brightness: manual, brightness control is off, rely on ambient */
426    // KEY_BRIGHTNESS_ZERO=KeyBrightnessAuto,
427    KeyDisplayOff = 245, /* display device to off state */
428    KeyWwan = 246,       /* Wireless WAN (LTE, UMTS, GSM, etc.) */
429    // KEY_WIMAX =	KeyWwan,
430    KeyRfkill = 247,  /* Key that controls all radios */
431    KeyMicmute = 248, /* Mute / unmute the microphone */
432    KeyCount = 249,
433}
434
435impl TryFrom<Linux> for Windows {
436    type Error = ();
437
438    fn try_from(value: Linux) -> Result<Self, Self::Error> {
439        match value {
440            Linux::KeyReserved => Err(()),
441            Linux::KeyEsc => Ok(Self::KeyEsc),
442            Linux::Key1 => Ok(Self::Key1),
443            Linux::Key2 => Ok(Self::Key2),
444            Linux::Key3 => Ok(Self::Key3),
445            Linux::Key4 => Ok(Self::Key4),
446            Linux::Key5 => Ok(Self::Key5),
447            Linux::Key6 => Ok(Self::Key6),
448            Linux::Key7 => Ok(Self::Key7),
449            Linux::Key8 => Ok(Self::Key8),
450            Linux::Key9 => Ok(Self::Key9),
451            Linux::Key0 => Ok(Self::Key0),
452            Linux::KeyMinus => Ok(Self::KeyMinus),
453            Linux::KeyEqual => Ok(Self::KeyEqual),
454            Linux::KeyBackspace => Ok(Self::KeyDelete),
455            Linux::KeyTab => Ok(Self::KeyTab),
456            Linux::KeyQ => Ok(Self::KeyQ),
457            Linux::KeyW => Ok(Self::KeyW),
458            Linux::KeyE => Ok(Self::KeyE),
459            Linux::KeyR => Ok(Self::KeyR),
460            Linux::KeyT => Ok(Self::KeyT),
461            Linux::KeyY => Ok(Self::KeyY),
462            Linux::KeyU => Ok(Self::KeyU),
463            Linux::KeyI => Ok(Self::KeyI),
464            Linux::KeyO => Ok(Self::KeyO),
465            Linux::KeyP => Ok(Self::KeyP),
466            Linux::KeyLeftbrace => Ok(Self::KeyLeftBrace),
467            Linux::KeyRightbrace => Ok(Self::KeyRightBrace),
468            Linux::KeyEnter => Ok(Self::KeyEnter),
469            Linux::KeyLeftCtrl => Ok(Self::KeyLeftCtrl),
470            Linux::KeyA => Ok(Self::KeyA),
471            Linux::KeyS => Ok(Self::KeyS),
472            Linux::KeyD => Ok(Self::KeyD),
473            Linux::KeyF => Ok(Self::KeyF),
474            Linux::KeyG => Ok(Self::KeyG),
475            Linux::KeyH => Ok(Self::KeyH),
476            Linux::KeyJ => Ok(Self::KeyJ),
477            Linux::KeyK => Ok(Self::KeyK),
478            Linux::KeyL => Ok(Self::KeyL),
479            Linux::KeySemicolon => Ok(Self::KeySemiColon),
480            Linux::KeyApostrophe => Ok(Self::KeyApostrophe),
481            Linux::KeyGrave => Ok(Self::KeyGrave),
482            Linux::KeyLeftShift => Ok(Self::KeyLeftShift),
483            Linux::KeyBackslash => Ok(Self::KeyBackslash),
484            Linux::KeyZ => Ok(Self::KeyZ),
485            Linux::KeyX => Ok(Self::KeyX),
486            Linux::KeyC => Ok(Self::KeyC),
487            Linux::KeyV => Ok(Self::KeyV),
488            Linux::KeyB => Ok(Self::KeyB),
489            Linux::KeyN => Ok(Self::KeyN),
490            Linux::KeyM => Ok(Self::KeyM),
491            Linux::KeyComma => Ok(Self::KeyComma),
492            Linux::KeyDot => Ok(Self::KeyDot),
493            Linux::KeySlash => Ok(Self::KeySlash),
494            Linux::KeyRightShift => Ok(Self::KeyRightShift),
495            Linux::KeyKpAsterisk => Ok(Self::KeypadStar),
496            Linux::KeyLeftAlt => Ok(Self::KeyLeftAlt),
497            Linux::KeySpace => Ok(Self::KeySpace),
498            Linux::KeyCapsLock => Ok(Self::KeyCapsLock),
499            Linux::KeyF1 => Ok(Self::KeyF1),
500            Linux::KeyF2 => Ok(Self::KeyF2),
501            Linux::KeyF3 => Ok(Self::KeyF3),
502            Linux::KeyF4 => Ok(Self::KeyF4),
503            Linux::KeyF5 => Ok(Self::KeyF5),
504            Linux::KeyF6 => Ok(Self::KeyF6),
505            Linux::KeyF7 => Ok(Self::KeyF7),
506            Linux::KeyF8 => Ok(Self::KeyF8),
507            Linux::KeyF9 => Ok(Self::KeyF9),
508            Linux::KeyF10 => Ok(Self::KeyF10),
509            Linux::KeyNumlock => Ok(Self::KeypadNumLock),
510            Linux::KeyScrollLock => Ok(Self::KeyScrollLock),
511            Linux::KeyKp7 => Ok(Self::Keypad7Home),
512            Linux::KeyKp8 => Ok(Self::Keypad8UpArrow),
513            Linux::KeyKp9 => Ok(Self::Keypad9PageUp),
514            Linux::KeyKpMinus => Ok(Self::KeypadDash),
515            Linux::KeyKp4 => Ok(Self::Keypad4LeftArrow),
516            Linux::KeyKp5 => Ok(Self::Keypad5),
517            Linux::KeyKp6 => Ok(Self::Keypad6RightArrow),
518            Linux::KeyKpplus => Ok(Self::KeypadPlus),
519            Linux::KeyKp1 => Ok(Self::Keypad1End),
520            Linux::KeyKp2 => Ok(Self::Keypad2DownArrow),
521            Linux::KeyKp3 => Ok(Self::Keypad3PageDn),
522            Linux::KeyKp0 => Ok(Self::Keypad0Insert),
523            Linux::KeyKpDot => Ok(Self::KeypadDot),
524            Linux::KeyZenkakuhankaku => Ok(Self::KeyF24), // KeyLANG5
525            Linux::Key102nd => Ok(Self::KeyNonUSSlashBar), // TODO unsure
526            Linux::KeyF11 => Ok(Self::KeyF11),
527            Linux::KeyF12 => Ok(Self::KeyF12),
528            Linux::KeyRo => Ok(Self::KeyInternational1),
529            Linux::KeyKatakana => Ok(Self::KeyLANG3),
530            Linux::KeyHiragana => Ok(Self::KeyLANG4),
531            Linux::KeyHenkan => Ok(Self::KeyInternational4),
532            Linux::KeyKatakanahiragana => Ok(Self::KeyInternational2),
533            Linux::KeyMuhenkan => Ok(Self::KeyInternational5),
534            Linux::KeyKpJpComma => Ok(Self::KeypadComma),
535            Linux::KeyKpEnter => Ok(Self::KeypadEnter),
536            Linux::KeyRightCtrl => Ok(Self::KeyRightCtrl),
537            Linux::KeyKpslash => Ok(Self::KeypadSlash),
538            Linux::KeySysrq => Ok(Self::KeyPrintScreen), // TODO Windows does not have Sysrq, right?
539            Linux::KeyRightalt => Ok(Self::KeyRightAlt),
540            Linux::KeyLinefeed => Ok(Self::KeyEnter), // TODO unsure
541            Linux::KeyHome => Ok(Self::KeyHome),
542            Linux::KeyUp => Ok(Self::KeyUp),
543            Linux::KeyPageup => Ok(Self::KeyPageUp),
544            Linux::KeyLeft => Ok(Self::KeyLeft),
545            Linux::KeyRight => Ok(Self::KeyRight),
546            Linux::KeyEnd => Ok(Self::KeyEnd),
547            Linux::KeyDown => Ok(Self::KeyDown),
548            Linux::KeyPagedown => Ok(Self::KeyPageDown),
549            Linux::KeyInsert => Ok(Self::KeyInsert),
550            Linux::KeyDelete => Ok(Self::KeyDeleteForward),
551            Linux::KeyMacro => Err(()), // TODO
552            Linux::KeyMute => Ok(Self::KeyMute),
553            Linux::KeyVolumeDown => Ok(Self::KeyVolumeDown),
554            Linux::KeyVolumeUp => Ok(Self::KeyVolumeUp),
555            Linux::KeyPower => Ok(Self::Shutdown),
556            Linux::KeyKpequal => Ok(Self::KeypadEquals),
557            Linux::KeyKpplusminus => Ok(Self::KeypadPlus),
558            Linux::KeyPause => Ok(Self::KeyPause),
559            Linux::KeyScale => Err(()), // TODO
560            Linux::KeyKpcomma => Ok(Self::KeypadComma),
561            Linux::KeyHanguel => Ok(Self::KeyLANG1), // FIXME should be 00F2?
562            Linux::KeyHanja => Ok(Self::KeyLANG2),   // FIXME should be 00F1?
563            Linux::KeyYen => Ok(Self::KeyInternational3),
564            Linux::KeyLeftMeta => Ok(Self::KeyLeftGUI),
565            Linux::KeyRightmeta => Ok(Self::KeyRightGUI),
566            Linux::KeyCompose => Ok(Self::KeyApplication),
567            Linux::KeyStop => Ok(Self::ACStop),
568            Linux::KeyAgain => Err(()),
569            Linux::KeyProps => Err(()),
570            Linux::KeyUndo => Err(()),
571            Linux::KeyFront => Err(()),
572            Linux::KeyCopy => Err(()),
573            Linux::KeyOpen => Err(()),
574            Linux::KeyPaste => Err(()),
575            Linux::KeyFind => Ok(Self::ACSearch),
576            Linux::KeyCut => Err(()),
577            Linux::KeyHelp => Ok(Self::KeyF1), // AL Integrated Help Center?
578            Linux::KeyMenu => Ok(Self::KeyApplication),
579            Linux::KeyCalc => Ok(Self::ALCalculator),
580            Linux::KeySetup => Err(()),
581            Linux::KeySleep => Ok(Self::SystemSleep),
582            Linux::KeyWakeup => Ok(Self::SystemWakeUp),
583            Linux::KeyFile => Ok(Self::ALLocalMachineBrowser),
584            Linux::KeySendfile => Err(()),
585            Linux::KeyDeletefile => Err(()),
586            Linux::KeyXfer => Err(()),
587            Linux::KeyProg1 => Err(()),
588            Linux::KeyProg2 => Err(()),
589            Linux::KeyWww => Ok(Self::ACSearch), // TODO unsure
590            Linux::KeyMsdos => Err(()),
591            Linux::KeyCoffee => Err(()),
592            Linux::KeyRotateDisplay => Err(()),
593            Linux::KeyCyclewindows => Err(()),
594            Linux::KeyMail => Ok(Self::ALEmailReader),
595            Linux::KeyBookmarks => Ok(Self::ACBookmarks),
596            Linux::KeyComputer => Ok(Self::ACHome),
597            Linux::KeyBack => Ok(Self::ACBack),
598            Linux::KeyForward => Ok(Self::ACForward),
599            Linux::KeyClosecd => Err(()),
600            Linux::KeyEjectcd => Err(()),
601            Linux::KeyEjectclosecd => Err(()),
602            Linux::KeyNextsong => Ok(Self::KeyScanNextTrack),
603            Linux::KeyPlaypause => Ok(Self::KeyPlayPause),
604            Linux::KeyPrevioussong => Ok(Self::KeyScanPreviousTrack),
605            Linux::KeyStopcd => Ok(Self::KeyStop),
606            Linux::KeyRecord => Err(()),
607            Linux::KeyRewind => Err(()),
608            Linux::KeyPhone => Err(()),
609            Linux::KeyIso => Err(()),
610            Linux::KeyConfig => Err(()),
611            Linux::KeyHomepage => Ok(Self::ACHome),
612            Linux::KeyRefresh => Ok(Self::ACRefresh),
613            Linux::KeyExit => Err(()),
614            Linux::KeyMove => Err(()),
615            Linux::KeyEdit => Err(()),
616            Linux::KeyScrollup => Err(()),
617            Linux::KeyScrolldown => Err(()),
618            Linux::KeyKpleftparen => Err(()),
619            Linux::KeyKprightparen => Err(()),
620            Linux::KeyNew => Err(()),
621            Linux::KeyRedo => Err(()),
622            Linux::KeyF13 => Ok(Self::KeyF13),
623            Linux::KeyF14 => Ok(Self::KeyF14),
624            Linux::KeyF15 => Ok(Self::KeyF15),
625            Linux::KeyF16 => Ok(Self::KeyF16),
626            Linux::KeyF17 => Ok(Self::KeyF17),
627            Linux::KeyF18 => Ok(Self::KeyF18),
628            Linux::KeyF19 => Ok(Self::KeyF19),
629            Linux::KeyF20 => Ok(Self::KeyF20),
630            Linux::KeyF21 => Ok(Self::KeyF21),
631            Linux::KeyF22 => Ok(Self::KeyF22),
632            Linux::KeyF23 => Ok(Self::KeyF23),
633            Linux::KeyF24 => Ok(Self::KeyF24),
634            Linux::KeyPlaycd => Err(()),
635            Linux::KeyPausecd => Err(()),
636            Linux::KeyProg3 => Err(()),
637            Linux::KeyProg4 => Err(()),
638            Linux::KeyAllApplications => Err(()),
639            Linux::KeySuspend => Err(()),
640            Linux::KeyClose => Err(()),
641            Linux::KeyPlay => Err(()),
642            Linux::KeyFastforward => Err(()),
643            Linux::KeyBassboost => Err(()),
644            Linux::KeyPrint => Err(()),
645            Linux::KeyHp => Err(()),
646            Linux::KeyCamera => Err(()),
647            Linux::KeySound => Err(()),
648            Linux::KeyQuestion => Err(()),
649            Linux::KeyEmail => Err(()),
650            Linux::KeyChat => Err(()),
651            Linux::KeySearch => Err(()),
652            Linux::KeyConnect => Err(()),
653            Linux::KeyFinance => Err(()),
654            Linux::KeySport => Err(()),
655            Linux::KeyShop => Err(()),
656            Linux::KeyAlterase => Err(()),
657            Linux::KeyCancel => Err(()),
658            Linux::KeyBrightnessdown => Err(()),
659            Linux::KeyBrightnessup => Err(()),
660            Linux::KeyMedia => Err(()),
661            Linux::KeySwitchvideomode => Err(()),
662            Linux::KeyKbdillumtoggle => Err(()),
663            Linux::KeyKbdillumdown => Err(()),
664            Linux::KeyKbdillumup => Err(()),
665            Linux::KeySend => Err(()),
666            Linux::KeyReply => Err(()),
667            Linux::KeyForwardmail => Err(()),
668            Linux::KeySave => Err(()),
669            Linux::KeyDocuments => Err(()),
670            Linux::KeyBattery => Err(()),
671            Linux::KeyBluetooth => Err(()),
672            Linux::KeyWlan => Err(()),
673            Linux::KeyUwb => Err(()),
674            Linux::KeyUnknown => Err(()),
675            Linux::KeyVideoNext => Err(()),
676            Linux::KeyVideoPrev => Err(()),
677            Linux::KeyBrightnessCycle => Err(()),
678            Linux::KeyBrightnessAuto => Err(()),
679            Linux::KeyDisplayOff => Err(()),
680            Linux::KeyWwan => Err(()),
681            Linux::KeyRfkill => Err(()),
682            Linux::KeyMicmute => Err(()),
683            Linux::KeyCount => Err(()),
684            Linux::Invalid => Err(()),
685            Linux::Invalid1 => Err(()),
686            Linux::Invalid2 => Err(()),
687            Linux::Invalid3 => Err(()),
688            Linux::Invalid4 => Err(()),
689            Linux::Invalid5 => Err(()),
690        }
691    }
692}
693impl TryFrom<Windows> for Linux {
694    type Error = ();
695
696    fn try_from(value: Windows) -> Result<Self, Self::Error> {
697        match value {
698            Windows::Shutdown => Ok(Self::KeyPower),
699            Windows::SystemSleep => Ok(Self::KeySleep),
700            Windows::SystemWakeUp => Ok(Self::KeyWakeup),
701            Windows::ErrorRollOver => Ok(Self::KeyRo),
702            Windows::KeyA => Ok(Self::KeyA),
703            Windows::KeyB => Ok(Self::KeyB),
704            Windows::KeyC => Ok(Self::KeyC),
705            Windows::KeyD => Ok(Self::KeyD),
706            Windows::KeyE => Ok(Self::KeyE),
707            Windows::KeyF => Ok(Self::KeyF),
708            Windows::KeyG => Ok(Self::KeyG),
709            Windows::KeyH => Ok(Self::KeyH),
710            Windows::KeyI => Ok(Self::KeyI),
711            Windows::KeyJ => Ok(Self::KeyJ),
712            Windows::KeyK => Ok(Self::KeyK),
713            Windows::KeyL => Ok(Self::KeyL),
714            Windows::KeyM => Ok(Self::KeyM),
715            Windows::KeyN => Ok(Self::KeyN),
716            Windows::KeyO => Ok(Self::KeyO),
717            Windows::KeyP => Ok(Self::KeyP),
718            Windows::KeyQ => Ok(Self::KeyQ),
719            Windows::KeyR => Ok(Self::KeyR),
720            Windows::KeyS => Ok(Self::KeyS),
721            Windows::KeyT => Ok(Self::KeyT),
722            Windows::KeyU => Ok(Self::KeyU),
723            Windows::KeyV => Ok(Self::KeyV),
724            Windows::KeyW => Ok(Self::KeyW),
725            Windows::KeyX => Ok(Self::KeyX),
726            Windows::KeyY => Ok(Self::KeyY),
727            Windows::KeyZ => Ok(Self::KeyZ),
728            Windows::Key1 => Ok(Self::Key1),
729            Windows::Key2 => Ok(Self::Key2),
730            Windows::Key3 => Ok(Self::Key3),
731            Windows::Key4 => Ok(Self::Key4),
732            Windows::Key5 => Ok(Self::Key5),
733            Windows::Key6 => Ok(Self::Key6),
734            Windows::Key7 => Ok(Self::Key7),
735            Windows::Key8 => Ok(Self::Key8),
736            Windows::Key9 => Ok(Self::Key9),
737            Windows::Key0 => Ok(Self::Key0),
738            Windows::KeyEnter => Ok(Self::KeyEnter),
739            Windows::KeyEsc => Ok(Self::KeyEsc),
740            Windows::KeyDelete => Ok(Self::KeyBackspace),
741            Windows::KeyTab => Ok(Self::KeyTab),
742            Windows::KeySpace => Ok(Self::KeySpace),
743            Windows::KeyMinus => Ok(Self::KeyMinus),
744            Windows::KeyEqual => Ok(Self::KeyEqual),
745            Windows::KeyLeftBrace => Ok(Self::KeyLeftbrace),
746            Windows::KeyRightBrace => Ok(Self::KeyRightbrace),
747            Windows::KeyBackslash => Ok(Self::KeyBackslash),
748            Windows::KeySemiColon => Ok(Self::KeySemicolon),
749            Windows::KeyApostrophe => Ok(Self::KeyApostrophe),
750            Windows::KeyGrave => Ok(Self::KeyGrave),
751            Windows::KeyComma => Ok(Self::KeyComma),
752            Windows::KeyDot => Ok(Self::KeyDot),
753            Windows::KeySlash => Ok(Self::KeySlash),
754            Windows::KeyCapsLock => Ok(Self::KeyCapsLock),
755            Windows::KeyF1 => Ok(Self::KeyF1),
756            Windows::KeyF2 => Ok(Self::KeyF2),
757            Windows::KeyF3 => Ok(Self::KeyF3),
758            Windows::KeyF4 => Ok(Self::KeyF4),
759            Windows::KeyF5 => Ok(Self::KeyF5),
760            Windows::KeyF6 => Ok(Self::KeyF6),
761            Windows::KeyF7 => Ok(Self::KeyF7),
762            Windows::KeyF8 => Ok(Self::KeyF8),
763            Windows::KeyF9 => Ok(Self::KeyF9),
764            Windows::KeyF10 => Ok(Self::KeyF10),
765            Windows::KeyF11 => Ok(Self::KeyF11),
766            Windows::KeyF12 => Ok(Self::KeyF12),
767            Windows::KeyPrintScreen => Ok(Self::KeySysrq),
768            Windows::KeyScrollLock => Ok(Self::KeyScrollLock),
769            Windows::KeyPause => Ok(Self::KeyPause),
770            Windows::KeyInsert => Ok(Self::KeyInsert),
771            Windows::KeyHome => Ok(Self::KeyHome),
772            Windows::KeyPageUp => Ok(Self::KeyPageup),
773            Windows::KeyDeleteForward => Ok(Self::KeyDelete),
774            Windows::KeyEnd => Ok(Self::KeyEnd),
775            Windows::KeyPageDown => Ok(Self::KeyPagedown),
776            Windows::KeyRight => Ok(Self::KeyRight),
777            Windows::KeyLeft => Ok(Self::KeyLeft),
778            Windows::KeyDown => Ok(Self::KeyDown),
779            Windows::KeyUp => Ok(Self::KeyUp),
780            Windows::KeypadNumLock => Ok(Self::KeyNumlock),
781            Windows::KeypadSlash => Ok(Self::KeyKpslash),
782            Windows::KeypadStar => Ok(Self::KeyKpAsterisk),
783            Windows::KeypadDash => Ok(Self::KeyKpMinus),
784            Windows::KeypadPlus => Ok(Self::KeyKpplus),
785            Windows::KeypadEnter => Ok(Self::KeyKpEnter),
786            Windows::Keypad1End => Ok(Self::KeyKp1),
787            Windows::Keypad2DownArrow => Ok(Self::KeyKp2),
788            Windows::Keypad3PageDn => Ok(Self::KeyKp3),
789            Windows::Keypad4LeftArrow => Ok(Self::KeyKp4),
790            Windows::Keypad5 => Ok(Self::KeyKp5),
791            Windows::Keypad6RightArrow => Ok(Self::KeyKp6),
792            Windows::Keypad7Home => Ok(Self::KeyKp7),
793            Windows::Keypad8UpArrow => Ok(Self::KeyKp8),
794            Windows::Keypad9PageUp => Ok(Self::KeyKp9),
795            Windows::Keypad0Insert => Ok(Self::KeyKp0),
796            Windows::KeypadDot => Ok(Self::KeyKpDot),
797            Windows::KeyNonUSSlashBar => Ok(Self::Key102nd),
798            Windows::KeyApplication => Ok(Self::KeyMenu),
799            Windows::KeypadEquals => Ok(Self::KeyKpequal),
800            Windows::KeyF13 => Ok(Self::KeyF13),
801            Windows::KeyF14 => Ok(Self::KeyF14),
802            Windows::KeyF15 => Ok(Self::KeyF15),
803            Windows::KeyF16 => Ok(Self::KeyF16),
804            Windows::KeyF17 => Ok(Self::KeyF17),
805            Windows::KeyF18 => Ok(Self::KeyF18),
806            Windows::KeyF19 => Ok(Self::KeyF19),
807            Windows::KeyF20 => Ok(Self::KeyF20),
808            Windows::KeyF21 => Ok(Self::KeyF21),
809            Windows::KeyF22 => Ok(Self::KeyF22),
810            Windows::KeyF23 => Ok(Self::KeyF23),
811            Windows::KeyF24 => Ok(Self::KeyF24),
812            Windows::KeypadComma => Ok(Self::KeyKpcomma),
813            Windows::KeyInternational1 => Ok(Self::KeyRo),
814            Windows::KeyInternational2 => Ok(Self::KeyKatakanahiragana),
815            Windows::KeyInternational3 => Ok(Self::KeyYen),
816            Windows::KeyInternational4 => Ok(Self::KeyHenkan),
817            Windows::KeyInternational5 => Ok(Self::KeyMuhenkan),
818            Windows::KeyLANG1 => Ok(Self::KeyHanguel),
819            Windows::KeyLANG2 => Ok(Self::KeyHanja),
820            Windows::KeyLANG3 => Ok(Self::KeyKatakana),
821            Windows::KeyLANG4 => Ok(Self::KeyHiragana),
822            Windows::KeyLeftCtrl => Ok(Self::KeyLeftCtrl),
823            Windows::KeyLeftShift => Ok(Self::KeyLeftShift),
824            Windows::KeyLeftAlt => Ok(Self::KeyLeftAlt),
825            Windows::KeyLeftGUI => Ok(Self::KeyLeftMeta),
826            Windows::KeyRightCtrl => Ok(Self::KeyRightCtrl),
827            Windows::KeyRightShift => Ok(Self::KeyRightShift),
828            Windows::KeyFakeRightShift => Ok(Self::KeyRightShift),
829            Windows::KeyRightAlt => Ok(Self::KeyRightalt),
830            Windows::KeyRightGUI => Ok(Self::KeyRightmeta),
831            Windows::KeyScanNextTrack => Ok(Self::KeyNextsong),
832            Windows::KeyScanPreviousTrack => Ok(Self::KeyPrevioussong),
833            Windows::KeyStop => Ok(Self::KeyStopcd),
834            Windows::KeyPlayPause => Ok(Self::KeyPlaypause),
835            Windows::KeyMute => Ok(Self::KeyMute),
836            Windows::KeyVolumeUp => Ok(Self::KeyVolumeUp),
837            Windows::KeyVolumeDown => Ok(Self::KeyVolumeDown),
838            Windows::ALConsumerControlConfiguration => Err(()),
839            Windows::ALEmailReader => Ok(Self::KeyMail),
840            Windows::ALCalculator => Ok(Self::KeyCalc),
841            Windows::ALLocalMachineBrowser => Ok(Self::KeyFile),
842            Windows::ACSearch => Ok(Self::KeyWww),
843            Windows::ACHome => Ok(Self::KeyHomepage),
844            Windows::ACBack => Ok(Self::KeyBack),
845            Windows::ACForward => Ok(Self::KeyForward),
846            Windows::ACStop => Ok(Self::KeyStop),
847            Windows::ACRefresh => Ok(Self::KeyRefresh),
848            Windows::ACBookmarks => Ok(Self::KeyBookmarks),
849        }
850    }
851}