Skip to main content

a7n_core/
local_input.rs

1// SPDX-License-Identifier: GPL-3.0-or-later
2
3//! Physical inputs reserved for the local machine.
4
5use 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    /// # Errors
17    /// Rejects unknown names and primary mouse buttons.
18    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}