use kanata_interception::*;
use kanata_parser::keys::OsCode;
pub struct OsCodeWrapper(pub OsCode);
impl TryFrom<Stroke> for OsCodeWrapper {
type Error = ();
fn try_from(item: Stroke) -> Result<Self, Self::Error> {
Ok(match item {
Stroke::Keyboard { code, state, .. } => {
let code = match (state.contains(KeyState::E0), state.contains(KeyState::E1)) {
(false, false) => crate::oskbd::u16_to_osc(code as u16).ok_or(())?,
(true, _) => crate::oskbd::u16_to_osc((code as u16) | 0xE000).ok_or(())?,
_ => return Err(()),
};
OsCodeWrapper(code)
}
_ => return Err(()),
})
}
}
impl TryFrom<OsCodeWrapper> for Stroke {
type Error = ();
fn try_from(item: OsCodeWrapper) -> Result<Self, Self::Error> {
let (code, state) = match item.0 {
OsCode::KEY_ESC => (ScanCode::Esc, KeyState::empty()),
OsCode::KEY_1 => (ScanCode::Num1, KeyState::empty()),
OsCode::KEY_2 => (ScanCode::Num2, KeyState::empty()),
OsCode::KEY_3 => (ScanCode::Num3, KeyState::empty()),
OsCode::KEY_4 => (ScanCode::Num4, KeyState::empty()),
OsCode::KEY_5 => (ScanCode::Num5, KeyState::empty()),
OsCode::KEY_6 => (ScanCode::Num6, KeyState::empty()),
OsCode::KEY_7 => (ScanCode::Num7, KeyState::empty()),
OsCode::KEY_8 => (ScanCode::Num8, KeyState::empty()),
OsCode::KEY_9 => (ScanCode::Num9, KeyState::empty()),
OsCode::KEY_0 => (ScanCode::Num0, KeyState::empty()),
OsCode::KEY_MINUS => (ScanCode::Minus, KeyState::empty()),
OsCode::KEY_EQUAL => (ScanCode::Equals, KeyState::empty()),
OsCode::KEY_BACKSPACE => (ScanCode::Backspace, KeyState::empty()),
OsCode::KEY_TAB => (ScanCode::Tab, KeyState::empty()),
OsCode::KEY_Q => (ScanCode::Q, KeyState::empty()),
OsCode::KEY_W => (ScanCode::W, KeyState::empty()),
OsCode::KEY_E => (ScanCode::E, KeyState::empty()),
OsCode::KEY_R => (ScanCode::R, KeyState::empty()),
OsCode::KEY_T => (ScanCode::T, KeyState::empty()),
OsCode::KEY_Y => (ScanCode::Y, KeyState::empty()),
OsCode::KEY_U => (ScanCode::U, KeyState::empty()),
OsCode::KEY_I => (ScanCode::I, KeyState::empty()),
OsCode::KEY_O => (ScanCode::O, KeyState::empty()),
OsCode::KEY_P => (ScanCode::P, KeyState::empty()),
OsCode::KEY_LEFTBRACE => (ScanCode::LeftBracket, KeyState::empty()),
OsCode::KEY_RIGHTBRACE => (ScanCode::RightBracket, KeyState::empty()),
OsCode::KEY_ENTER => (ScanCode::Enter, KeyState::empty()),
OsCode::KEY_LEFTCTRL => (ScanCode::LeftControl, KeyState::empty()),
OsCode::KEY_A => (ScanCode::A, KeyState::empty()),
OsCode::KEY_S => (ScanCode::S, KeyState::empty()),
OsCode::KEY_D => (ScanCode::D, KeyState::empty()),
OsCode::KEY_F => (ScanCode::F, KeyState::empty()),
OsCode::KEY_G => (ScanCode::G, KeyState::empty()),
OsCode::KEY_H => (ScanCode::H, KeyState::empty()),
OsCode::KEY_J => (ScanCode::J, KeyState::empty()),
OsCode::KEY_K => (ScanCode::K, KeyState::empty()),
OsCode::KEY_L => (ScanCode::L, KeyState::empty()),
OsCode::KEY_SEMICOLON => (ScanCode::SemiColon, KeyState::empty()),
OsCode::KEY_APOSTROPHE => (ScanCode::Apostrophe, KeyState::empty()),
OsCode::KEY_GRAVE => (ScanCode::Grave, KeyState::empty()),
OsCode::KEY_LEFTSHIFT => (ScanCode::LeftShift, KeyState::empty()),
OsCode::KEY_BACKSLASH => (ScanCode::BackSlash, KeyState::empty()),
OsCode::KEY_Z => (ScanCode::Z, KeyState::empty()),
OsCode::KEY_X => (ScanCode::X, KeyState::empty()),
OsCode::KEY_C => (ScanCode::C, KeyState::empty()),
OsCode::KEY_V => (ScanCode::V, KeyState::empty()),
OsCode::KEY_B => (ScanCode::B, KeyState::empty()),
OsCode::KEY_N => (ScanCode::N, KeyState::empty()),
OsCode::KEY_M => (ScanCode::M, KeyState::empty()),
OsCode::KEY_COMMA => (ScanCode::Comma, KeyState::empty()),
OsCode::KEY_DOT => (ScanCode::Period, KeyState::empty()),
OsCode::KEY_SLASH => (ScanCode::Slash, KeyState::empty()),
OsCode::KEY_RIGHTSHIFT => (ScanCode::RightShift, KeyState::empty()),
OsCode::KEY_KPASTERISK => (ScanCode::NumpadMultiply, KeyState::empty()),
OsCode::KEY_LEFTALT => (ScanCode::LeftAlt, KeyState::empty()),
OsCode::KEY_SPACE => (ScanCode::Space, KeyState::empty()),
OsCode::KEY_CAPSLOCK => (ScanCode::CapsLock, KeyState::empty()),
OsCode::KEY_F1 => (ScanCode::F1, KeyState::empty()),
OsCode::KEY_F2 => (ScanCode::F2, KeyState::empty()),
OsCode::KEY_F3 => (ScanCode::F3, KeyState::empty()),
OsCode::KEY_F4 => (ScanCode::F4, KeyState::empty()),
OsCode::KEY_F5 => (ScanCode::F5, KeyState::empty()),
OsCode::KEY_F6 => (ScanCode::F6, KeyState::empty()),
OsCode::KEY_F7 => (ScanCode::F7, KeyState::empty()),
OsCode::KEY_F8 => (ScanCode::F8, KeyState::empty()),
OsCode::KEY_F9 => (ScanCode::F9, KeyState::empty()),
OsCode::KEY_F10 => (ScanCode::F10, KeyState::empty()),
OsCode::KEY_NUMLOCK => (ScanCode::NumLock, KeyState::empty()),
OsCode::KEY_SCROLLLOCK => (ScanCode::ScrollLock, KeyState::empty()),
OsCode::KEY_KP7 => (ScanCode::Numpad7, KeyState::empty()),
OsCode::KEY_KP8 => (ScanCode::Numpad8, KeyState::empty()),
OsCode::KEY_KP9 => (ScanCode::Numpad9, KeyState::empty()),
OsCode::KEY_KPMINUS => (ScanCode::NumpadMinus, KeyState::empty()),
OsCode::KEY_KP4 => (ScanCode::Numpad4, KeyState::empty()),
OsCode::KEY_KP5 => (ScanCode::Numpad5, KeyState::empty()),
OsCode::KEY_KP6 => (ScanCode::Numpad6, KeyState::empty()),
OsCode::KEY_KPPLUS => (ScanCode::NumpadPlus, KeyState::empty()),
OsCode::KEY_KP1 => (ScanCode::Numpad1, KeyState::empty()),
OsCode::KEY_KP2 => (ScanCode::Numpad2, KeyState::empty()),
OsCode::KEY_KP3 => (ScanCode::Numpad3, KeyState::empty()),
OsCode::KEY_KP0 => (ScanCode::Numpad0, KeyState::empty()),
OsCode::KEY_KPDOT => (ScanCode::NumpadPeriod, KeyState::empty()),
OsCode::KEY_102ND => (ScanCode::Int1, KeyState::empty()),
OsCode::KEY_F11 => (ScanCode::F11, KeyState::empty()),
OsCode::KEY_F12 => (ScanCode::F12, KeyState::empty()),
OsCode::KEY_F13 => (ScanCode::F13, KeyState::empty()),
OsCode::KEY_F14 => (ScanCode::F14, KeyState::empty()),
OsCode::KEY_F15 => (ScanCode::F15, KeyState::empty()),
OsCode::KEY_F16 => (ScanCode::F16, KeyState::empty()),
OsCode::KEY_F17 => (ScanCode::F17, KeyState::empty()),
OsCode::KEY_F18 => (ScanCode::F18, KeyState::empty()),
OsCode::KEY_F19 => (ScanCode::F19, KeyState::empty()),
OsCode::KEY_F20 => (ScanCode::F20, KeyState::empty()),
OsCode::KEY_F21 => (ScanCode::F21, KeyState::empty()),
OsCode::KEY_F22 => (ScanCode::F22, KeyState::empty()),
OsCode::KEY_F23 => (ScanCode::F23, KeyState::empty()),
OsCode::KEY_F24 => (ScanCode::F24, KeyState::empty()),
OsCode::KEY_HANGEUL => (ScanCode::Katakana, KeyState::empty()),
OsCode::KEY_HENKAN => (ScanCode::Convert, KeyState::empty()),
OsCode::KEY_MUHENKAN => (ScanCode::NonConvert, KeyState::empty()),
OsCode::KEY_PREVIOUSSONG => (ScanCode::Q, KeyState::E0),
OsCode::KEY_NEXTSONG => (ScanCode::P, KeyState::E0), OsCode::KEY_KPENTER => (ScanCode::Enter, KeyState::E0), OsCode::KEY_RIGHTCTRL => (ScanCode::LeftControl, KeyState::E0), OsCode::KEY_MUTE => (ScanCode::D, KeyState::E0), OsCode::KEY_PLAYPAUSE => (ScanCode::G, KeyState::E0), OsCode::KEY_VOLUMEDOWN => (ScanCode::C, KeyState::E0), OsCode::KEY_VOLUMEUP => (ScanCode::B, KeyState::E0), OsCode::KEY_KPSLASH => (ScanCode::Slash, KeyState::E0), OsCode::KEY_PRINT => (ScanCode::NumpadMultiply, KeyState::E0), OsCode::KEY_RIGHTALT => (ScanCode::LeftAlt, KeyState::E0), OsCode::KEY_HOME => (ScanCode::Numpad7, KeyState::E0), OsCode::KEY_UP => (ScanCode::Numpad8, KeyState::E0), OsCode::KEY_PAGEUP => (ScanCode::Numpad9, KeyState::E0), OsCode::KEY_LEFT => (ScanCode::Numpad4, KeyState::E0), OsCode::KEY_RIGHT => (ScanCode::Numpad6, KeyState::E0), OsCode::KEY_END => (ScanCode::Numpad1, KeyState::E0), OsCode::KEY_DOWN => (ScanCode::Numpad2, KeyState::E0), OsCode::KEY_PAGEDOWN => (ScanCode::Numpad3, KeyState::E0), OsCode::KEY_INSERT => (ScanCode::Numpad0, KeyState::E0), OsCode::KEY_DELETE => (ScanCode::NumpadPeriod, KeyState::E0), OsCode::KEY_LEFTMETA => (ScanCode::Oem2, KeyState::E0), OsCode::KEY_RIGHTMETA => (ScanCode::Oem3, KeyState::E0), OsCode::KEY_FORWARD => (ScanCode::F18, KeyState::E0), OsCode::KEY_BACK => (ScanCode::F19, KeyState::E0), OsCode::KEY_COMPOSE => (ScanCode::EraseEOF, KeyState::E0),
_ => return Err(()),
};
Ok(Stroke::Keyboard {
code,
state,
information: 0,
})
}
}