espanso/espanso-inject/src/linux/raw_keys.rs

146 lines
4.0 KiB
Rust
Raw Normal View History

2021-02-14 20:02:50 +00:00
/*
* This file is part of espanso.
*
* Copyright (C) 2019-2021 Federico Terzi
*
* espanso is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* espanso is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with espanso. If not, see <https://www.gnu.org/licenses/>.
*/
use crate::keys::Key;
2021-02-14 20:02:50 +00:00
use anyhow::Result;
use thiserror::Error;
pub fn convert_key_to_sym(key: &Key) -> Option<u32> {
match key {
Key::Alt => Some(0xFFE9),
Key::CapsLock => Some(0xFFE5),
Key::Control => Some(0xFFE3),
Key::Meta => Some(0xFFEB),
Key::NumLock => Some(0xFF7F),
Key::Shift => Some(0xFFE1),
// Whitespace
Key::Enter => Some(0xFF0D),
Key::Tab => Some(0xFF09),
Key::Space => Some(0x20),
// Navigation
Key::ArrowDown => Some(0xFF54),
Key::ArrowLeft => Some(0xFF51),
Key::ArrowRight => Some(0xFF53),
Key::ArrowUp => Some(0xFF52),
Key::End => Some(0xFF57),
Key::Home => Some(0xFF50),
Key::PageDown => Some(0xFF56),
Key::PageUp => Some(0xFF55),
// UI keys
Key::Escape => Some(0xFF1B),
// Editing keys
Key::Backspace => Some(0xFF08),
Key::Insert => Some(0xff63),
Key::Delete => Some(0xffff),
// Function keys
Key::F1 => Some(0xFFBE),
Key::F2 => Some(0xFFBF),
Key::F3 => Some(0xFFC0),
Key::F4 => Some(0xFFC1),
Key::F5 => Some(0xFFC2),
Key::F6 => Some(0xFFC3),
Key::F7 => Some(0xFFC4),
Key::F8 => Some(0xFFC5),
Key::F9 => Some(0xFFC6),
Key::F10 => Some(0xFFC7),
Key::F11 => Some(0xFFC8),
Key::F12 => Some(0xFFC9),
Key::F13 => Some(0xFFCA),
Key::F14 => Some(0xFFCB),
Key::F15 => Some(0xFFCC),
Key::F16 => Some(0xFFCD),
Key::F17 => Some(0xFFCE),
Key::F18 => Some(0xFFCF),
Key::F19 => Some(0xFFD0),
Key::F20 => Some(0xFFD1),
Key::A => Some(0x0061),
Key::B => Some(0x0062),
Key::C => Some(0x0063),
Key::D => Some(0x0064),
Key::E => Some(0x0065),
Key::F => Some(0x0066),
Key::G => Some(0x0067),
Key::H => Some(0x0068),
Key::I => Some(0x0069),
Key::J => Some(0x006a),
Key::K => Some(0x006b),
Key::L => Some(0x006c),
Key::M => Some(0x006d),
Key::N => Some(0x006e),
Key::O => Some(0x006f),
Key::P => Some(0x0070),
Key::Q => Some(0x0071),
Key::R => Some(0x0072),
Key::S => Some(0x0073),
Key::T => Some(0x0074),
Key::U => Some(0x0075),
Key::V => Some(0x0076),
Key::W => Some(0x0077),
Key::X => Some(0x0078),
Key::Y => Some(0x0079),
Key::Z => Some(0x007a),
Key::N0 => Some(0x0030),
Key::N1 => Some(0x0031),
Key::N2 => Some(0x0032),
Key::N3 => Some(0x0033),
Key::N4 => Some(0x0034),
Key::N5 => Some(0x0035),
Key::N6 => Some(0x0036),
Key::N7 => Some(0x0037),
Key::N8 => Some(0x0038),
Key::N9 => Some(0x0039),
Key::Numpad0 => Some(0xffb0),
Key::Numpad1 => Some(0xffb1),
Key::Numpad2 => Some(0xffb2),
Key::Numpad3 => Some(0xffb3),
Key::Numpad4 => Some(0xffb4),
Key::Numpad5 => Some(0xffb5),
Key::Numpad6 => Some(0xffb6),
Key::Numpad7 => Some(0xffb7),
Key::Numpad8 => Some(0xffb8),
Key::Numpad9 => Some(0xffb9),
Key::Raw(code) => Some(*code as u32),
}
}
2021-02-14 20:02:50 +00:00
pub fn convert_to_sym_array(keys: &[Key]) -> Result<Vec<u64>> {
let mut virtual_keys: Vec<u64> = Vec::new();
for key in keys.iter() {
let vk = convert_key_to_sym(key);
if let Some(vk) = vk {
virtual_keys.push(vk as u64)
} else {
return Err(LinuxRawKeyError::MappingFailure(key.clone()).into());
}
}
Ok(virtual_keys)
}
#[derive(Error, Debug)]
pub enum LinuxRawKeyError {
#[error("missing mapping for key `{0}`")]
MappingFailure(Key),
}