#[repr(u8)]
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Vk {
MouseLeft = 0x01,
MouseRight = 0x02,
Cancel = 0x03,
MouseMiddle = 0x04,
MouseX1 = 0x05,
MouseX2 = 0x06,
Backspace = 0x08,
Tab = 0x09,
Clear = 0x0c,
Enter = 0x0d,
Shift = 0x10,
Control = 0x11,
Alt = 0x12,
Pause = 0x13,
CapsLock = 0x14,
Kana = 0x15,
ImeOn = 0x16,
Junja = 0x17,
Final = 0x18,
Kanji = 0x19,
ImeOff = 0x1a,
Escape = 0x1b,
Convert = 0x1c,
NonConvert = 0x1d,
Accept = 0x1e,
ModeChange = 0x1f,
Space = 0x20,
PageUp = 0x21,
PageDown = 0x22,
End = 0x23,
Home = 0x24,
LeftArrow = 0x25,
UpArrow = 0x26,
RightArrow = 0x27,
DownArrow = 0x28,
Select = 0x29,
Print = 0x2a,
Execute = 0x2b,
PrintScreen = 0x2c,
Insert = 0x2d,
Delete = 0x2e,
Help = 0x2f,
_0 = b'0',
_1 = b'1',
_2 = b'2',
_3 = b'3',
_4 = b'4',
_5 = b'5',
_6 = b'6',
_7 = b'7',
_8 = b'8',
_9 = b'9',
A = b'A',
B = b'B',
C = b'C',
D = b'D',
E = b'E',
F = b'F',
G = b'G',
H = b'H',
I = b'I',
J = b'J',
K = b'K',
L = b'L',
M = b'M',
N = b'N',
O = b'O',
P = b'P',
Q = b'Q',
R = b'R',
S = b'S',
T = b'T',
U = b'U',
V = b'V',
W = b'W',
X = b'X',
Y = b'Y',
Z = b'Z',
LeftWin = 0x5b,
RightWin = 0x5c,
Apps = 0x5d,
Sleep = 0x5f,
Numpad0 = 0x60,
Numpad1 = 0x61,
Numpad2 = 0x62,
Numpad3 = 0x63,
Numpad4 = 0x64,
Numpad5 = 0x65,
Numpad6 = 0x66,
Numpad7 = 0x67,
Numpad8 = 0x68,
Numpad9 = 0x69,
Multiply = 0x6a,
Add = 0x6b,
Separator = 0x6c,
Subtract = 0x6d,
Decimal = 0x6e,
Divide = 0x6f,
F1 = 0x70,
F2 = 0x71,
F3 = 0x72,
F4 = 0x73,
F5 = 0x74,
F6 = 0x75,
F7 = 0x76,
F8 = 0x77,
F9 = 0x78,
F10 = 0x79,
F11 = 0x7a,
F12 = 0x7b,
F13 = 0x7c,
F14 = 0x7d,
F15 = 0x7e,
F16 = 0x7f,
F17 = 0x80,
F18 = 0x81,
F19 = 0x82,
F20 = 0x83,
F21 = 0x84,
F22 = 0x85,
F23 = 0x86,
F24 = 0x87,
Numlock = 0x90,
Scroll = 0x91,
LeftShift = 0xa0,
RightShift = 0xa1,
LeftControl = 0xa2,
RightControl = 0xa3,
LeftMenu = 0xa4,
RightMenu = 0xa5,
BrowserBack = 0xa6,
BrowserForward = 0xa7,
BrowserRefresh = 0xa8,
BrowserStop = 0xa9,
BrowserSearch = 0xaa,
BrowserFavorites = 0xab,
BrowserHome = 0xac,
VolumeMute = 0xad,
VolumeDown = 0xae,
VolumeUp = 0xaf,
NextTrack = 0xb0,
PrevTrack = 0xb1,
MediaStop = 0xb2,
MediaPlayPause = 0xb3,
StartMail = 0xb4,
SelectMedia = 0xb5,
StartApp1 = 0xb6,
StartApp2 = 0xb7,
Oem1 = 0xba,
Plus = 0xbb,
Comma = 0xbc,
Minus = 0xbd,
Period = 0xbe,
Oem2 = 0xbf,
Oem3 = 0xc0,
Oem4 = 0xdb,
Oem5 = 0xdc,
Oem6 = 0xdd,
Oem7 = 0xde,
Oem8 = 0xdf,
Oem102 = 0xe2,
ImeProcess = 0xe5,
Attn = 0xf6,
CrSel = 0xf7,
ExSel = 0xf8,
EraseEof = 0xf9,
Play = 0xfa,
Zoom = 0xfb,
Pa1 = 0xfd,
OemClear = 0xfe,
}
macro_rules! from_vk_for_num {
($($t:ty)+) => {
$(
impl From<Vk> for $t {
#[inline(always)]
fn from(vk: Vk) -> Self {
vk as Self
}
}
)+
};
}
from_vk_for_num!(u8 u16 u32 u64 u128 i8 i16 i32 i64 i128);
impl Vk {
#[inline(always)]
pub unsafe fn from_u8(n: u8) -> Self {
std::mem::transmute(n)
}
#[inline(always)]
pub fn into_u8(self) -> u8 {
self.into()
}
pub fn is_down(self) -> bool {
use winapi::um::winuser::GetAsyncKeyState;
const MASK: u16 = 0x8000;
let state = unsafe { GetAsyncKeyState(self.into()) } as u16;
state & MASK == MASK
}
pub fn is_toggled(self) -> bool {
use winapi::um::winuser::GetKeyState;
const MASK: u16 = 0x0001;
let state = unsafe { GetKeyState(self.into()) } as u16;
state & MASK == MASK
}
}