Packages

Write native GUI directly from Elixir using declarative API.

Current section

Files

Jump to
emerge native emerge_skia src keys.rs
Raw

native/emerge_skia/src/keys.rs

#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum CanonicalKey {
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
Digit0,
Digit1,
Digit2,
Digit3,
Digit4,
Digit5,
Digit6,
Digit7,
Digit8,
Digit9,
Minus,
Equal,
Plus,
Asterisk,
LeftBracket,
RightBracket,
Backslash,
Semicolon,
Apostrophe,
Grave,
Comma,
Period,
Slash,
Space,
Enter,
Tab,
Escape,
Backspace,
Insert,
Delete,
Home,
End,
PageUp,
PageDown,
ArrowLeft,
ArrowRight,
ArrowUp,
ArrowDown,
Shift,
Control,
Alt,
AltGraph,
Super,
CapsLock,
NumLock,
ScrollLock,
PrintScreen,
Pause,
ContextMenu,
F1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
F10,
F11,
F12,
F13,
F14,
F15,
F16,
F17,
F18,
F19,
F20,
F21,
F22,
F23,
F24,
Unknown,
}
impl CanonicalKey {
pub fn atom_name(self) -> &'static str {
match self {
CanonicalKey::A => "a",
CanonicalKey::B => "b",
CanonicalKey::C => "c",
CanonicalKey::D => "d",
CanonicalKey::E => "e",
CanonicalKey::F => "f",
CanonicalKey::G => "g",
CanonicalKey::H => "h",
CanonicalKey::I => "i",
CanonicalKey::J => "j",
CanonicalKey::K => "k",
CanonicalKey::L => "l",
CanonicalKey::M => "m",
CanonicalKey::N => "n",
CanonicalKey::O => "o",
CanonicalKey::P => "p",
CanonicalKey::Q => "q",
CanonicalKey::R => "r",
CanonicalKey::S => "s",
CanonicalKey::T => "t",
CanonicalKey::U => "u",
CanonicalKey::V => "v",
CanonicalKey::W => "w",
CanonicalKey::X => "x",
CanonicalKey::Y => "y",
CanonicalKey::Z => "z",
CanonicalKey::Digit0 => "digit_0",
CanonicalKey::Digit1 => "digit_1",
CanonicalKey::Digit2 => "digit_2",
CanonicalKey::Digit3 => "digit_3",
CanonicalKey::Digit4 => "digit_4",
CanonicalKey::Digit5 => "digit_5",
CanonicalKey::Digit6 => "digit_6",
CanonicalKey::Digit7 => "digit_7",
CanonicalKey::Digit8 => "digit_8",
CanonicalKey::Digit9 => "digit_9",
CanonicalKey::Minus => "minus",
CanonicalKey::Equal => "equal",
CanonicalKey::Plus => "plus",
CanonicalKey::Asterisk => "asterisk",
CanonicalKey::LeftBracket => "left_bracket",
CanonicalKey::RightBracket => "right_bracket",
CanonicalKey::Backslash => "backslash",
CanonicalKey::Semicolon => "semicolon",
CanonicalKey::Apostrophe => "apostrophe",
CanonicalKey::Grave => "grave",
CanonicalKey::Comma => "comma",
CanonicalKey::Period => "period",
CanonicalKey::Slash => "slash",
CanonicalKey::Space => "space",
CanonicalKey::Enter => "enter",
CanonicalKey::Tab => "tab",
CanonicalKey::Escape => "escape",
CanonicalKey::Backspace => "backspace",
CanonicalKey::Insert => "insert",
CanonicalKey::Delete => "delete",
CanonicalKey::Home => "home",
CanonicalKey::End => "end",
CanonicalKey::PageUp => "page_up",
CanonicalKey::PageDown => "page_down",
CanonicalKey::ArrowLeft => "arrow_left",
CanonicalKey::ArrowRight => "arrow_right",
CanonicalKey::ArrowUp => "arrow_up",
CanonicalKey::ArrowDown => "arrow_down",
CanonicalKey::Shift => "shift",
CanonicalKey::Control => "control",
CanonicalKey::Alt => "alt",
CanonicalKey::AltGraph => "alt_graph",
CanonicalKey::Super => "super",
CanonicalKey::CapsLock => "caps_lock",
CanonicalKey::NumLock => "num_lock",
CanonicalKey::ScrollLock => "scroll_lock",
CanonicalKey::PrintScreen => "print_screen",
CanonicalKey::Pause => "pause",
CanonicalKey::ContextMenu => "context_menu",
CanonicalKey::F1 => "f1",
CanonicalKey::F2 => "f2",
CanonicalKey::F3 => "f3",
CanonicalKey::F4 => "f4",
CanonicalKey::F5 => "f5",
CanonicalKey::F6 => "f6",
CanonicalKey::F7 => "f7",
CanonicalKey::F8 => "f8",
CanonicalKey::F9 => "f9",
CanonicalKey::F10 => "f10",
CanonicalKey::F11 => "f11",
CanonicalKey::F12 => "f12",
CanonicalKey::F13 => "f13",
CanonicalKey::F14 => "f14",
CanonicalKey::F15 => "f15",
CanonicalKey::F16 => "f16",
CanonicalKey::F17 => "f17",
CanonicalKey::F18 => "f18",
CanonicalKey::F19 => "f19",
CanonicalKey::F20 => "f20",
CanonicalKey::F21 => "f21",
CanonicalKey::F22 => "f22",
CanonicalKey::F23 => "f23",
CanonicalKey::F24 => "f24",
CanonicalKey::Unknown => "unknown",
}
}
pub fn from_atom_name(name: &str) -> Option<Self> {
Some(match name {
"a" => CanonicalKey::A,
"b" => CanonicalKey::B,
"c" => CanonicalKey::C,
"d" => CanonicalKey::D,
"e" => CanonicalKey::E,
"f" => CanonicalKey::F,
"g" => CanonicalKey::G,
"h" => CanonicalKey::H,
"i" => CanonicalKey::I,
"j" => CanonicalKey::J,
"k" => CanonicalKey::K,
"l" => CanonicalKey::L,
"m" => CanonicalKey::M,
"n" => CanonicalKey::N,
"o" => CanonicalKey::O,
"p" => CanonicalKey::P,
"q" => CanonicalKey::Q,
"r" => CanonicalKey::R,
"s" => CanonicalKey::S,
"t" => CanonicalKey::T,
"u" => CanonicalKey::U,
"v" => CanonicalKey::V,
"w" => CanonicalKey::W,
"x" => CanonicalKey::X,
"y" => CanonicalKey::Y,
"z" => CanonicalKey::Z,
"digit_0" => CanonicalKey::Digit0,
"digit_1" => CanonicalKey::Digit1,
"digit_2" => CanonicalKey::Digit2,
"digit_3" => CanonicalKey::Digit3,
"digit_4" => CanonicalKey::Digit4,
"digit_5" => CanonicalKey::Digit5,
"digit_6" => CanonicalKey::Digit6,
"digit_7" => CanonicalKey::Digit7,
"digit_8" => CanonicalKey::Digit8,
"digit_9" => CanonicalKey::Digit9,
"minus" => CanonicalKey::Minus,
"equal" => CanonicalKey::Equal,
"plus" => CanonicalKey::Plus,
"asterisk" => CanonicalKey::Asterisk,
"left_bracket" => CanonicalKey::LeftBracket,
"right_bracket" => CanonicalKey::RightBracket,
"backslash" => CanonicalKey::Backslash,
"semicolon" => CanonicalKey::Semicolon,
"apostrophe" => CanonicalKey::Apostrophe,
"grave" => CanonicalKey::Grave,
"comma" => CanonicalKey::Comma,
"period" => CanonicalKey::Period,
"slash" => CanonicalKey::Slash,
"space" => CanonicalKey::Space,
"enter" => CanonicalKey::Enter,
"tab" => CanonicalKey::Tab,
"escape" => CanonicalKey::Escape,
"backspace" => CanonicalKey::Backspace,
"insert" => CanonicalKey::Insert,
"delete" => CanonicalKey::Delete,
"home" => CanonicalKey::Home,
"end" => CanonicalKey::End,
"page_up" => CanonicalKey::PageUp,
"page_down" => CanonicalKey::PageDown,
"arrow_left" => CanonicalKey::ArrowLeft,
"arrow_right" => CanonicalKey::ArrowRight,
"arrow_up" => CanonicalKey::ArrowUp,
"arrow_down" => CanonicalKey::ArrowDown,
"shift" => CanonicalKey::Shift,
"control" => CanonicalKey::Control,
"alt" => CanonicalKey::Alt,
"alt_graph" => CanonicalKey::AltGraph,
"super" => CanonicalKey::Super,
"caps_lock" => CanonicalKey::CapsLock,
"num_lock" => CanonicalKey::NumLock,
"scroll_lock" => CanonicalKey::ScrollLock,
"print_screen" => CanonicalKey::PrintScreen,
"pause" => CanonicalKey::Pause,
"context_menu" => CanonicalKey::ContextMenu,
"f1" => CanonicalKey::F1,
"f2" => CanonicalKey::F2,
"f3" => CanonicalKey::F3,
"f4" => CanonicalKey::F4,
"f5" => CanonicalKey::F5,
"f6" => CanonicalKey::F6,
"f7" => CanonicalKey::F7,
"f8" => CanonicalKey::F8,
"f9" => CanonicalKey::F9,
"f10" => CanonicalKey::F10,
"f11" => CanonicalKey::F11,
"f12" => CanonicalKey::F12,
"f13" => CanonicalKey::F13,
"f14" => CanonicalKey::F14,
"f15" => CanonicalKey::F15,
"f16" => CanonicalKey::F16,
"f17" => CanonicalKey::F17,
"f18" => CanonicalKey::F18,
"f19" => CanonicalKey::F19,
"f20" => CanonicalKey::F20,
"f21" => CanonicalKey::F21,
"f22" => CanonicalKey::F22,
"f23" => CanonicalKey::F23,
"f24" => CanonicalKey::F24,
"unknown" => CanonicalKey::Unknown,
_ => return None,
})
}
#[cfg_attr(
not(any(all(feature = "wayland", target_os = "linux"), feature = "macos")),
allow(dead_code)
)]
pub fn from_printable_char(ch: char) -> Option<Self> {
match ch.to_ascii_lowercase() {
'a' => Some(CanonicalKey::A),
'b' => Some(CanonicalKey::B),
'c' => Some(CanonicalKey::C),
'd' => Some(CanonicalKey::D),
'e' => Some(CanonicalKey::E),
'f' => Some(CanonicalKey::F),
'g' => Some(CanonicalKey::G),
'h' => Some(CanonicalKey::H),
'i' => Some(CanonicalKey::I),
'j' => Some(CanonicalKey::J),
'k' => Some(CanonicalKey::K),
'l' => Some(CanonicalKey::L),
'm' => Some(CanonicalKey::M),
'n' => Some(CanonicalKey::N),
'o' => Some(CanonicalKey::O),
'p' => Some(CanonicalKey::P),
'q' => Some(CanonicalKey::Q),
'r' => Some(CanonicalKey::R),
's' => Some(CanonicalKey::S),
't' => Some(CanonicalKey::T),
'u' => Some(CanonicalKey::U),
'v' => Some(CanonicalKey::V),
'w' => Some(CanonicalKey::W),
'x' => Some(CanonicalKey::X),
'y' => Some(CanonicalKey::Y),
'z' => Some(CanonicalKey::Z),
'0' => Some(CanonicalKey::Digit0),
'1' => Some(CanonicalKey::Digit1),
'2' => Some(CanonicalKey::Digit2),
'3' => Some(CanonicalKey::Digit3),
'4' => Some(CanonicalKey::Digit4),
'5' => Some(CanonicalKey::Digit5),
'6' => Some(CanonicalKey::Digit6),
'7' => Some(CanonicalKey::Digit7),
'8' => Some(CanonicalKey::Digit8),
'9' => Some(CanonicalKey::Digit9),
'-' => Some(CanonicalKey::Minus),
'=' => Some(CanonicalKey::Equal),
'[' => Some(CanonicalKey::LeftBracket),
']' => Some(CanonicalKey::RightBracket),
'\\' => Some(CanonicalKey::Backslash),
';' => Some(CanonicalKey::Semicolon),
'\'' => Some(CanonicalKey::Apostrophe),
'`' => Some(CanonicalKey::Grave),
',' => Some(CanonicalKey::Comma),
'.' => Some(CanonicalKey::Period),
'/' => Some(CanonicalKey::Slash),
' ' => Some(CanonicalKey::Space),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::CanonicalKey;
#[test]
fn atom_names_are_descriptive() {
assert_eq!(CanonicalKey::Digit1.atom_name(), "digit_1");
assert_eq!(CanonicalKey::ArrowLeft.atom_name(), "arrow_left");
assert_eq!(CanonicalKey::AltGraph.atom_name(), "alt_graph");
assert_eq!(CanonicalKey::Plus.atom_name(), "plus");
assert_eq!(CanonicalKey::Asterisk.atom_name(), "asterisk");
}
#[test]
fn printable_chars_map_to_canonical_keys() {
assert_eq!(
CanonicalKey::from_printable_char('A'),
Some(CanonicalKey::A)
);
assert_eq!(
CanonicalKey::from_printable_char('1'),
Some(CanonicalKey::Digit1)
);
assert_eq!(
CanonicalKey::from_printable_char('.'),
Some(CanonicalKey::Period)
);
assert_eq!(CanonicalKey::from_printable_char('+'), None);
assert_eq!(CanonicalKey::from_printable_char('*'), None);
assert_eq!(CanonicalKey::from_printable_char('é'), None);
}
#[test]
fn atom_names_round_trip() {
assert_eq!(
CanonicalKey::from_atom_name(CanonicalKey::ContextMenu.atom_name()),
Some(CanonicalKey::ContextMenu)
);
assert_eq!(
CanonicalKey::from_atom_name(CanonicalKey::Plus.atom_name()),
Some(CanonicalKey::Plus)
);
assert_eq!(CanonicalKey::from_atom_name("bogus"), None);
}
}