use winit::keyboard::{NamedKey, PhysicalKey};
use winit::platform::scancode::PhysicalKeyExtScancode;
pub const ALT_STR: &str = "Alt";
pub const LOGO_STR: &str = "Win";
pub const MODIFIERS_ORDER: &str = "csam";
pub fn os_specific_key_name(key: NamedKey) -> Option<&'static str> {
match key {
NamedKey::AltGraph => Some("AltGr"),
NamedKey::ArrowDown => Some("Down"),
NamedKey::ArrowLeft => Some("Left"),
NamedKey::ArrowRight => Some("Right"),
NamedKey::ArrowUp => Some("Up"),
NamedKey::Super => Some("Windows"),
_ => None,
}
}
pub fn try_physical_key_name(physical_key: PhysicalKey) -> Option<String> {
physical_key
.to_scancode()
.map(|sc| scancode_name(sc as u16))
}
fn scancode_name(sc: u16) -> String {
let mut l_param = sc as cty::c_long;
l_param <<= 16;
if (sc & 0x0000FF00) == 0xE000 {
l_param |= 1 << 24;
}
const BUFFER_SIZE: usize = 32;
let mut utf16_key_name = vec![0_u16; BUFFER_SIZE];
let name_len = unsafe {
winapi::um::winuser::GetKeyNameTextW(
l_param,
utf16_key_name.as_mut_ptr(),
BUFFER_SIZE as cty::c_int,
)
};
if name_len == 0 {
return format!("SC{}", sc);
}
utf16_key_name.truncate(name_len as usize);
String::from_utf16_lossy(&utf16_key_name)
}