macro_rules! map_enum { ($target:expr, $enum:ident, $( ($code:expr, $variant:ident), )+ ) => { match $target { $( $enum::$variant => $code, )+ _ => 0, } }; } macro_rules! map { ($target:expr, $( ($code:expr, $variant:literal), )+ ) => { match $target { $( $variant => $code, )+ _ => 0, } }; } // Windows Virtual keyboard binary representation pub(crate) trait ToVKBits { fn to_vk_bits(&self) -> i32; } impl ToVKBits for winit::keyboard::NamedKey { fn to_vk_bits(&self) -> i32 { use winit::keyboard::NamedKey; map_enum!( self, NamedKey, (0x12, Alt), (0xA5, AltGraph), (0x14, CapsLock), (0x11, Control), (0x90, NumLock), (0x91, ScrollLock), (0x10, Shift), (0x5B, Meta), (0x5C, Super), (0x0D, Enter), (0x09, Tab), (0x20, Space), (0x28, ArrowDown), (0x25, ArrowLeft), (0x27, ArrowRight), (0x26, ArrowUp), (0x23, End), (0x24, Home), (0x22, PageDown), (0x21, PageUp), (0x08, Backspace), (0x0C, Clear), (0xF7, CrSel), (0x2E, Delete), (0xF9, EraseEof), (0xF8, ExSel), (0x2D, Insert), (0x1E, Accept), (0xF6, Attn), (0x03, Cancel), (0x5D, ContextMenu), (0x1B, Escape), (0x2B, Execute), (0x2F, Help), (0x13, Pause), (0xFA, Play), (0x5D, Props), (0x29, Select), (0xFB, ZoomIn), (0xFB, ZoomOut), (0x2C, PrintScreen), (0x5F, Standby), (0x1C, Convert), (0x18, FinalMode), (0x1F, ModeChange), (0x1D, NonConvert), (0xE5, Process), (0x15, HangulMode), (0x19, HanjaMode), (0x17, JunjaMode), (0x15, KanaMode), (0x19, KanjiMode), (0xB0, MediaFastForward), (0xB3, MediaPause), (0xB3, MediaPlay), (0xB3, MediaPlayPause), (0xB1, MediaRewind), (0xB2, MediaStop), (0xB0, MediaTrackNext), (0xB1, MediaTrackPrevious), (0x2A, Print), (0xAE, AudioVolumeDown), (0xAF, AudioVolumeUp), (0xAD, AudioVolumeMute), (0xB6, LaunchApplication1), (0xB7, LaunchApplication2), (0xB4, LaunchMail), (0xB5, LaunchMediaPlayer), (0xB5, LaunchMusicPlayer), (0xA6, BrowserBack), (0xAB, BrowserFavorites), (0xA7, BrowserForward), (0xAC, BrowserHome), (0xA8, BrowserRefresh), (0xAA, BrowserSearch), (0xA9, BrowserStop), (0xFB, ZoomToggle), (0x70, F1), (0x71, F2), (0x72, F3), (0x73, F4), (0x74, F5), (0x75, F6), (0x76, F7), (0x77, F8), (0x78, F9), (0x79, F10), (0x7A, F11), (0x7B, F12), (0x7C, F13), (0x7D, F14), (0x7E, F15), (0x7F, F16), (0x80, F17), (0x81, F18), (0x82, F19), (0x83, F20), (0x84, F21), (0x85, F22), (0x86, F23), (0x87, F24), ) } } impl ToVKBits for char { fn to_vk_bits(&self) -> i32 { map!( self, (0x0041, 'a'), (0x0042, 'b'), (0x0043, 'c'), (0x0044, 'd'), (0x0045, 'e'), (0x0046, 'f'), (0x0047, 'g'), (0x0048, 'h'), (0x0049, 'i'), (0x004a, 'j'), (0x004b, 'k'), (0x004c, 'l'), (0x004d, 'm'), (0x004e, 'n'), (0x004f, 'o'), (0x0050, 'p'), (0x0051, 'q'), (0x0052, 'r'), (0x0053, 's'), (0x0054, 't'), (0x0055, 'u'), (0x0056, 'v'), (0x0057, 'w'), (0x0058, 'x'), (0x0059, 'y'), (0x005a, 'z'), (0x0041, 'A'), (0x0042, 'B'), (0x0043, 'C'), (0x0044, 'D'), (0x0045, 'E'), (0x0046, 'F'), (0x0047, 'G'), (0x0048, 'H'), (0x0049, 'I'), (0x004a, 'J'), (0x004b, 'K'), (0x004c, 'L'), (0x004d, 'M'), (0x004e, 'N'), (0x004f, 'O'), (0x0050, 'P'), (0x0051, 'Q'), (0x0052, 'R'), (0x0053, 'S'), (0x0054, 'T'), (0x0055, 'U'), (0x0056, 'V'), (0x0057, 'W'), (0x0058, 'X'), (0x0059, 'Y'), (0x005a, 'Z'), (0x0031, '1'), (0x0032, '2'), (0x0032, '3'), (0x0033, '4'), (0x0034, '5'), (0x0035, '6'), (0x0036, '7'), (0x0037, '8'), (0x0039, '9'), (0x0030, '0'), ) } } // Chromium dom key binary representation pub(crate) trait ToDomBits { fn to_dom_bits(&self) -> i32; } impl ToDomBits for winit::keyboard::NamedKey { fn to_dom_bits(&self) -> i32 { use winit::keyboard::NamedKey; map_enum!( self, NamedKey, (0x0000, Hyper), (0x0085, Super), (0x0025, Control), (0x0032, Shift), (0x0040, Alt), (0x0000, Fn), (0x0000, FnLock), (0x0024, Enter), (0x0009, Escape), (0x0016, Backspace), (0x0017, Tab), (0x0041, Space), (0x0042, CapsLock), (0x0043, F1), (0x0044, F2), (0x0045, F3), (0x0046, F4), (0x0047, F5), (0x0048, F6), (0x0049, F7), (0x004a, F8), (0x004b, F9), (0x004c, F10), (0x005f, F11), (0x0060, F12), (0x006b, PrintScreen), (0x004e, ScrollLock), (0x007f, Pause), (0x0076, Insert), (0x006e, Home), (0x0070, PageUp), (0x0077, Delete), (0x0073, End), (0x0075, PageDown), (0x0072, ArrowRight), (0x0071, ArrowLeft), (0x0074, ArrowDown), (0x006f, ArrowUp), (0x004d, NumLock), (0x0087, ContextMenu), (0x007c, Power), (0x00bf, F13), (0x00c0, F14), (0x00c1, F15), (0x00c2, F16), (0x00c3, F17), (0x00c4, F18), (0x00c5, F19), (0x00c6, F20), (0x00c7, F21), (0x00c8, F22), (0x00c9, F23), (0x00ca, F24), (0x008e, Open), (0x0092, Help), (0x008c, Select), (0x0089, Again), (0x008b, Undo), (0x0091, Cut), (0x008d, Copy), (0x008f, Paste), (0x0090, Find), (0x0079, AudioVolumeMute), (0x007b, AudioVolumeUp), (0x007a, AudioVolumeDown), (0x0065, KanaMode), (0x0064, Convert), (0x0066, NonConvert), (0x0000, Props), (0x00e9, BrightnessUp), (0x00e8, BrightnessDown), (0x00d7, MediaPlay), (0x00d1, MediaPause), (0x00af, MediaRecord), (0x00d8, MediaFastForward), (0x00b0, MediaRewind), (0x00ab, MediaTrackNext), (0x00ad, MediaTrackPrevious), (0x00ae, MediaStop), (0x00a9, Eject), (0x00ac, MediaPlayPause), (0x00a3, LaunchMail), (0x024d, LaunchScreenSaver), (0x00e1, BrowserSearch), (0x00b4, BrowserHome), (0x00a6, BrowserBack), (0x00a7, BrowserForward), (0x0088, BrowserStop), (0x00b5, BrowserRefresh), (0x00a4, BrowserFavorites), (0x017c, ZoomToggle), (0x00f0, MailReply), (0x00f1, MailForward), (0x00ef, MailSend), ) } } impl ToDomBits for char { fn to_dom_bits(&self) -> i32 { map!( self, (0x0026, 'a'), (0x0038, 'b'), (0x0036, 'c'), (0x0028, 'd'), (0x001a, 'e'), (0x0029, 'f'), (0x002a, 'g'), (0x002b, 'h'), (0x001f, 'i'), (0x002c, 'j'), (0x002d, 'k'), (0x002e, 'l'), (0x003a, 'm'), (0x0039, 'n'), (0x0020, 'o'), (0x0021, 'p'), (0x0018, 'q'), (0x001b, 'r'), (0x0027, 's'), (0x001c, 't'), (0x001e, 'u'), (0x0037, 'v'), (0x0019, 'w'), (0x0035, 'x'), (0x001d, 'y'), (0x0034, 'z'), (0x0026, 'A'), (0x0038, 'B'), (0x0036, 'C'), (0x0028, 'D'), (0x001a, 'E'), (0x0029, 'F'), (0x002a, 'G'), (0x002b, 'H'), (0x001f, 'I'), (0x002c, 'J'), (0x002d, 'K'), (0x002e, 'L'), (0x003a, 'M'), (0x0039, 'N'), (0x0020, 'O'), (0x0021, 'P'), (0x0018, 'Q'), (0x001b, 'R'), (0x0027, 'S'), (0x001c, 'T'), (0x001e, 'U'), (0x0037, 'V'), (0x0019, 'W'), (0x0035, 'X'), (0x001d, 'Y'), (0x0034, 'Z'), (0x000a, '1'), (0x000b, '2'), (0x000c, '3'), (0x000d, '4'), (0x000e, '5'), (0x000f, '6'), (0x0010, '7'), (0x0011, '8'), (0x0012, '9'), (0x0013, '0'), ) } }