1use a7n_proto::v1::{Button, input_event::Event};
6
7use crate::hotkey::{key_name, key_usage};
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
10pub enum LocalInput {
11 Key(u32),
12 Button(i32),
13}
14
15impl LocalInput {
16 pub fn parse(name: &str) -> Result<Self, &'static str> {
19 match name {
20 "left" | "right" => Err("left/right mouse buttons cannot stay local"),
21 "middle" => Ok(Self::Button(Button::Middle.into())),
22 "back" => Ok(Self::Button(Button::Back.into())),
23 "forward" => Ok(Self::Button(Button::Forward.into())),
24 _ => key_usage(name)
25 .map(Self::Key)
26 .ok_or("unknown key or button name"),
27 }
28 }
29
30 #[must_use]
31 pub fn from_event(event: &Event) -> Option<(Self, bool)> {
32 match event {
33 Event::Key(key) => Some((Self::Key(key.usage), key.down)),
34 Event::Button(button) => Some((Self::Button(button.button), button.down)),
35 _ => None,
36 }
37 }
38
39 #[must_use]
40 pub fn name(self) -> Option<String> {
41 match self {
42 Self::Key(usage) => key_name(usage).filter(|name| Self::parse(name) == Ok(self)),
43 Self::Button(button) => match Button::try_from(button).ok()? {
44 Button::Middle => Some("middle".into()),
45 Button::Back => Some("back".into()),
46 Button::Forward => Some("forward".into()),
47 _ => None,
48 },
49 }
50 }
51}