use gdk::{
keys::{constants::*, Key},
EventKey, ModifierType,
};
use crate::event::{ModifiersState, VirtualKeyCode};
const MODIFIER_MAP: &[(ModifierType, ModifiersState)] = &[
(ModifierType::SHIFT_MASK, ModifiersState::SHIFT),
(ModifierType::MOD1_MASK, ModifiersState::ALT),
(ModifierType::CONTROL_MASK, ModifiersState::CTRL),
(ModifierType::SUPER_MASK, ModifiersState::LOGO),
];
pub(crate) fn get_modifiers(key: &EventKey) -> ModifiersState {
let state = key.state();
let mut result = ModifiersState::empty();
for (gdk_mod, modifier) in MODIFIER_MAP {
if state == *gdk_mod {
result |= *modifier;
}
}
result
}
#[allow(clippy::just_underscores_and_digits, non_upper_case_globals)]
pub(crate) fn gdk_key_to_virtual_key(gdk_key: Key) -> Option<VirtualKeyCode> {
match gdk_key {
Escape => Some(VirtualKeyCode::Escape),
BackSpace => Some(VirtualKeyCode::Backslash),
Tab | ISO_Left_Tab => Some(VirtualKeyCode::Tab),
Return => Some(VirtualKeyCode::Return),
Control_L => Some(VirtualKeyCode::LControl),
Control_R => Some(VirtualKeyCode::RControl),
Alt_L => Some(VirtualKeyCode::LAlt),
Alt_R => Some(VirtualKeyCode::RAlt),
Shift_L => Some(VirtualKeyCode::LShift),
Shift_R => Some(VirtualKeyCode::RShift),
Super_L => Some(VirtualKeyCode::LWin),
Super_R => Some(VirtualKeyCode::RWin),
Caps_Lock => Some(VirtualKeyCode::Capital),
F1 => Some(VirtualKeyCode::F1),
F2 => Some(VirtualKeyCode::F2),
F3 => Some(VirtualKeyCode::F3),
F4 => Some(VirtualKeyCode::F4),
F5 => Some(VirtualKeyCode::F5),
F6 => Some(VirtualKeyCode::F6),
F7 => Some(VirtualKeyCode::F7),
F8 => Some(VirtualKeyCode::F8),
F9 => Some(VirtualKeyCode::F9),
F10 => Some(VirtualKeyCode::F10),
F11 => Some(VirtualKeyCode::F11),
F12 => Some(VirtualKeyCode::F12),
Print => Some(VirtualKeyCode::Snapshot),
Scroll_Lock => Some(VirtualKeyCode::Scroll),
Pause => Some(VirtualKeyCode::Pause),
Insert => Some(VirtualKeyCode::Insert),
Delete => Some(VirtualKeyCode::Delete),
Home => Some(VirtualKeyCode::Home),
End => Some(VirtualKeyCode::End),
Page_Up => Some(VirtualKeyCode::PageUp),
Page_Down => Some(VirtualKeyCode::PageDown),
Num_Lock => Some(VirtualKeyCode::Numlock),
Up => Some(VirtualKeyCode::Up),
Down => Some(VirtualKeyCode::Down),
Left => Some(VirtualKeyCode::Left),
Right => Some(VirtualKeyCode::Right),
_ => None,
}
}