win_hotkey/keys/
modifiers.rsuse super::VirtualKey;
use crate::error::HotkeyError;
use std::fmt::Display;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ModifiersKey {
Alt,
Ctrl,
Shift,
Win,
NoRepeat,
Non,
}
impl TryFrom<&str> for ModifiersKey {
type Error = HotkeyError;
fn try_from(val: &str) -> Result<Self, Self::Error> {
Self::from_keyname(val)
}
}
impl ModifiersKey {
pub fn from_keyname(val: &str) -> Result<Self, HotkeyError> {
Ok(match val.to_ascii_uppercase().as_ref() {
"ALT" => ModifiersKey::Alt,
"CTRL" | "CONTROL" => ModifiersKey::Ctrl,
"SHIFT" => ModifiersKey::Shift,
"WIN" | "WINDOWS" | "SUPER" => ModifiersKey::Win,
"NOREPEAT" | "NO_REPEAT" => ModifiersKey::NoRepeat,
"NON" => ModifiersKey::Non,
val => return Err(HotkeyError::InvalidKey(val.to_string())),
})
}
pub const fn to_mod_code(&self) -> u32 {
use windows_sys::Win32::UI::Input::KeyboardAndMouse::*;
match self {
ModifiersKey::Alt => MOD_ALT,
ModifiersKey::Ctrl => MOD_CONTROL,
ModifiersKey::Shift => MOD_SHIFT,
ModifiersKey::Win => MOD_WIN,
ModifiersKey::NoRepeat => MOD_NOREPEAT,
ModifiersKey::Non => 0,
}
}
pub(crate) fn combine(keys: Option<&[ModifiersKey]>) -> u32 {
if let Some(keys) = keys {
keys.iter().fold(0, |a, b| a | b.to_mod_code())
} else {
ModifiersKey::Non.to_mod_code()
}
}
}
impl Display for ModifiersKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let key = match self {
ModifiersKey::Alt => "ALT",
ModifiersKey::Ctrl => "CONTROL",
ModifiersKey::Shift => "SHIFT",
ModifiersKey::Win => "WIN",
ModifiersKey::NoRepeat => "NO_REPEAT",
ModifiersKey::Non => "NON",
};
write!(f, "{}", key)
}
}
impl From<ModifiersKey> for VirtualKey {
fn from(mk: ModifiersKey) -> VirtualKey {
match mk {
ModifiersKey::Alt => VirtualKey::Menu,
ModifiersKey::Ctrl => VirtualKey::Control,
ModifiersKey::Shift => VirtualKey::Shift,
ModifiersKey::Win => VirtualKey::LWin,
ModifiersKey::NoRepeat | ModifiersKey::Non => VirtualKey::CustomKeyCode(0),
}
}
}