use winapi::um::winuser::GetAsyncKeyState;
use crate::platform::keycodes::KeyCode;
#[must_use]
#[allow(clippy::too_many_lines)]
pub const fn vk_code_to_keycode(vk_code: u32) -> KeyCode {
match vk_code {
0x41 => KeyCode::A,
0x42 => KeyCode::B,
0x43 => KeyCode::C,
0x44 => KeyCode::D,
0x45 => KeyCode::E,
0x46 => KeyCode::F,
0x47 => KeyCode::G,
0x48 => KeyCode::H,
0x49 => KeyCode::I,
0x4A => KeyCode::J,
0x4B => KeyCode::K,
0x4C => KeyCode::L,
0x4D => KeyCode::M,
0x4E => KeyCode::N,
0x4F => KeyCode::O,
0x50 => KeyCode::P,
0x51 => KeyCode::Q,
0x52 => KeyCode::R,
0x53 => KeyCode::S,
0x54 => KeyCode::T,
0x55 => KeyCode::U,
0x56 => KeyCode::V,
0x57 => KeyCode::W,
0x58 => KeyCode::X,
0x59 => KeyCode::Y,
0x5A => KeyCode::Z,
0x30 => KeyCode::Num0,
0x31 => KeyCode::Num1,
0x32 => KeyCode::Num2,
0x33 => KeyCode::Num3,
0x34 => KeyCode::Num4,
0x35 => KeyCode::Num5,
0x36 => KeyCode::Num6,
0x37 => KeyCode::Num7,
0x38 => KeyCode::Num8,
0x39 => KeyCode::Num9,
0x60 => KeyCode::KeyPad0,
0x61 => KeyCode::KeyPad1,
0x62 => KeyCode::KeyPad2,
0x63 => KeyCode::KeyPad3,
0x64 => KeyCode::KeyPad4,
0x65 => KeyCode::KeyPad5,
0x66 => KeyCode::KeyPad6,
0x67 => KeyCode::KeyPad7,
0x68 => KeyCode::KeyPad8,
0x69 => KeyCode::KeyPad9,
0x70 => KeyCode::F1,
0x71 => KeyCode::F2,
0x72 => KeyCode::F3,
0x73 => KeyCode::F4,
0x74 => KeyCode::F5,
0x75 => KeyCode::F6,
0x76 => KeyCode::F7,
0x77 => KeyCode::F8,
0x78 => KeyCode::F9,
0x79 => KeyCode::F10,
0x7A => KeyCode::F11,
0x7B => KeyCode::F12,
0x7C => KeyCode::F13,
0x7D => KeyCode::F14,
0x7E => KeyCode::F15,
0x7F => KeyCode::F16,
0x80 => KeyCode::F17,
0x81 => KeyCode::F18,
0x82 => KeyCode::F19,
0x83 => KeyCode::F20,
0x84 => KeyCode::F21,
0x85 => KeyCode::F22,
0x86 => KeyCode::F23,
0x87 => KeyCode::F24,
0xA0 => KeyCode::LeftShift,
0xA1 => KeyCode::RightShift,
0xA2 => KeyCode::LeftControl,
0xA3 => KeyCode::RightControl,
0xA4 => KeyCode::LeftAlt,
0xA5 => KeyCode::RightAlt,
0x5B => KeyCode::LeftSuper, 0x5C => KeyCode::RightSuper,
0x20 => KeyCode::Space,
0x0D => KeyCode::Enter,
0x1B => KeyCode::Escape,
0x08 => KeyCode::Backspace,
0x09 => KeyCode::Tab,
0xBC => KeyCode::Comma, 0xBE => KeyCode::Period, 0xBD => KeyCode::Minus, 0xBB => KeyCode::Equal, 0xDB => KeyCode::LeftBracket, 0xDD => KeyCode::RightBracket, 0xDC => KeyCode::Backslash, 0xBA => KeyCode::Semicolon, 0xDE => KeyCode::Quote, 0xC0 => KeyCode::Grave, 0xBF => KeyCode::Slash,
0x26 => KeyCode::UpArrow,
0x28 => KeyCode::DownArrow,
0x25 => KeyCode::LeftArrow,
0x27 => KeyCode::RightArrow,
0x2D => KeyCode::Insert,
0x2E => KeyCode::Delete,
0x24 => KeyCode::Home,
0x23 => KeyCode::End,
0x21 => KeyCode::PageUp,
0x22 => KeyCode::PageDown,
0x14 => KeyCode::CapsLock,
0x90 => KeyCode::NumLock,
0x91 => KeyCode::ScrollLock,
0x6F => KeyCode::KeyPadDivide, 0x6A => KeyCode::KeyPadMultiply, 0x6D => KeyCode::KeyPadSubtract, 0x6B => KeyCode::KeyPadAdd, 0x6E => KeyCode::KeyPadDecimal,
0xB3 => KeyCode::MediaPlayPause, 0xB2 => KeyCode::MediaStop, 0xB0 => KeyCode::MediaNext, 0xB1 => KeyCode::MediaPrev, 0xAF => KeyCode::VolumeUp, 0xAE => KeyCode::VolumeDown, 0xAD => KeyCode::Mute,
0xA6 => KeyCode::BrowserBack, 0xA7 => KeyCode::BrowserForward, 0xA8 => KeyCode::BrowserRefresh, 0xAC => KeyCode::BrowserHome,
0xB4 => KeyCode::LaunchMail, 0xB6 => KeyCode::LaunchApp1, 0xB7 => KeyCode::LaunchApp2,
0x5D => KeyCode::Menu, 0x2C => KeyCode::PrintScreen, 0x13 => KeyCode::Pause,
_ => KeyCode::Unknown,
}
}
#[must_use]
#[allow(clippy::too_many_lines)]
pub const fn keycode_to_vk_code(keycode: KeyCode) -> u32 {
match keycode {
KeyCode::A => 0x41,
KeyCode::B => 0x42,
KeyCode::C => 0x43,
KeyCode::D => 0x44,
KeyCode::E => 0x45,
KeyCode::F => 0x46,
KeyCode::G => 0x47,
KeyCode::H => 0x48,
KeyCode::I => 0x49,
KeyCode::J => 0x4A,
KeyCode::K => 0x4B,
KeyCode::L => 0x4C,
KeyCode::M => 0x4D,
KeyCode::N => 0x4E,
KeyCode::O => 0x4F,
KeyCode::P => 0x50,
KeyCode::Q => 0x51,
KeyCode::R => 0x52,
KeyCode::S => 0x53,
KeyCode::T => 0x54,
KeyCode::U => 0x55,
KeyCode::V => 0x56,
KeyCode::W => 0x57,
KeyCode::X => 0x58,
KeyCode::Y => 0x59,
KeyCode::Z => 0x5A,
KeyCode::Num0 => 0x30,
KeyCode::Num1 => 0x31,
KeyCode::Num2 => 0x32,
KeyCode::Num3 => 0x33,
KeyCode::Num4 => 0x34,
KeyCode::Num5 => 0x35,
KeyCode::Num6 => 0x36,
KeyCode::Num7 => 0x37,
KeyCode::Num8 => 0x38,
KeyCode::Num9 => 0x39,
KeyCode::KeyPad0 => 0x60,
KeyCode::KeyPad1 => 0x61,
KeyCode::KeyPad2 => 0x62,
KeyCode::KeyPad3 => 0x63,
KeyCode::KeyPad4 => 0x64,
KeyCode::KeyPad5 => 0x65,
KeyCode::KeyPad6 => 0x66,
KeyCode::KeyPad7 => 0x67,
KeyCode::KeyPad8 => 0x68,
KeyCode::KeyPad9 => 0x69,
KeyCode::F1 => 0x70,
KeyCode::F2 => 0x71,
KeyCode::F3 => 0x72,
KeyCode::F4 => 0x73,
KeyCode::F5 => 0x74,
KeyCode::F6 => 0x75,
KeyCode::F7 => 0x76,
KeyCode::F8 => 0x77,
KeyCode::F9 => 0x78,
KeyCode::F10 => 0x79,
KeyCode::F11 => 0x7A,
KeyCode::F12 => 0x7B,
KeyCode::F13 => 0x7C,
KeyCode::F14 => 0x7D,
KeyCode::F15 => 0x7E,
KeyCode::F16 => 0x7F,
KeyCode::F17 => 0x80,
KeyCode::F18 => 0x81,
KeyCode::F19 => 0x82,
KeyCode::F20 => 0x83,
KeyCode::F21 => 0x84,
KeyCode::F22 => 0x85,
KeyCode::F23 => 0x86,
KeyCode::F24 => 0x87,
KeyCode::LeftShift => 0xA0,
KeyCode::RightShift => 0xA1,
KeyCode::LeftControl => 0xA2,
KeyCode::RightControl => 0xA3,
KeyCode::LeftAlt => 0xA4,
KeyCode::RightAlt => 0xA5,
KeyCode::LeftSuper => 0x5B, KeyCode::RightSuper => 0x5C,
KeyCode::Space => 0x20,
KeyCode::Enter => 0x0D,
KeyCode::Escape => 0x1B,
KeyCode::Backspace => 0x08,
KeyCode::Tab => 0x09,
KeyCode::Comma => 0xBC, KeyCode::Period => 0xBE, KeyCode::Minus => 0xBD, KeyCode::Equal => 0xBB, KeyCode::LeftBracket => 0xDB, KeyCode::RightBracket => 0xDD, KeyCode::Backslash => 0xDC, KeyCode::Semicolon => 0xBA, KeyCode::Quote => 0xDE, KeyCode::Grave => 0xC0, KeyCode::Slash => 0xBF,
KeyCode::UpArrow => 0x26,
KeyCode::DownArrow => 0x28,
KeyCode::LeftArrow => 0x25,
KeyCode::RightArrow => 0x27,
KeyCode::Insert => 0x2D,
KeyCode::Delete => 0x2E,
KeyCode::Home => 0x24,
KeyCode::End => 0x23,
KeyCode::PageUp => 0x21,
KeyCode::PageDown => 0x22,
KeyCode::CapsLock => 0x14,
KeyCode::NumLock => 0x90,
KeyCode::ScrollLock => 0x91,
KeyCode::KeyPadDivide => 0x6F, KeyCode::KeyPadMultiply => 0x6A, KeyCode::KeyPadSubtract => 0x6D, KeyCode::KeyPadAdd => 0x6B, KeyCode::KeyPadDecimal => 0x6E,
KeyCode::MediaPlayPause => 0xB3, KeyCode::MediaStop => 0xB2, KeyCode::MediaNext => 0xB0, KeyCode::MediaPrev => 0xB1, KeyCode::VolumeUp => 0xAF, KeyCode::VolumeDown => 0xAE, KeyCode::Mute => 0xAD,
KeyCode::BrowserBack => 0xA6, KeyCode::BrowserForward => 0xA7, KeyCode::BrowserRefresh => 0xA8, KeyCode::BrowserHome => 0xAC,
KeyCode::LaunchMail => 0xB4, KeyCode::LaunchApp1 => 0xB6, KeyCode::LaunchApp2 => 0xB7,
KeyCode::Menu => 0x5D, KeyCode::PrintScreen => 0x2C, KeyCode::Pause => 0x13,
_ => 0x00,
}
}
#[must_use]
#[allow(clippy::cast_possible_wrap)]
pub fn is_key_down_raw(vk_code: u32) -> bool {
unsafe { (GetAsyncKeyState(vk_code as i32) as u16 & 0x8000) != 0 }
}
#[must_use]
pub fn is_key_down(vk_code: KeyCode) -> bool {
is_key_down_raw(keycode_to_vk_code(vk_code))
}