387 lines
7.2 KiB
Rust
387 lines
7.2 KiB
Rust
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'),
|
|
)
|
|
}
|
|
}
|