monio 0.1.0

Pure Rust cross-platform input monitoring library with proper drag detection
Documentation
//! macOS CGKeyCode to Key mappings.

use crate::keycode::Key;

/// Convert a macOS CGKeyCode to our Key enum.
pub fn keycode_to_key(code: u16) -> Key {
    match code {
        // Letters (QWERTY layout)
        0x00 => Key::KeyA,
        0x01 => Key::KeyS,
        0x02 => Key::KeyD,
        0x03 => Key::KeyF,
        0x04 => Key::KeyH,
        0x05 => Key::KeyG,
        0x06 => Key::KeyZ,
        0x07 => Key::KeyX,
        0x08 => Key::KeyC,
        0x09 => Key::KeyV,
        0x0B => Key::KeyB,
        0x0C => Key::KeyQ,
        0x0D => Key::KeyW,
        0x0E => Key::KeyE,
        0x0F => Key::KeyR,
        0x10 => Key::KeyY,
        0x11 => Key::KeyT,
        0x12 => Key::Num1,
        0x13 => Key::Num2,
        0x14 => Key::Num3,
        0x15 => Key::Num4,
        0x16 => Key::Num6,
        0x17 => Key::Num5,
        0x18 => Key::Equal,
        0x19 => Key::Num9,
        0x1A => Key::Num7,
        0x1B => Key::Minus,
        0x1C => Key::Num8,
        0x1D => Key::Num0,
        0x1E => Key::BracketRight,
        0x1F => Key::KeyO,
        0x20 => Key::KeyU,
        0x21 => Key::BracketLeft,
        0x22 => Key::KeyI,
        0x23 => Key::KeyP,
        0x25 => Key::KeyL,
        0x26 => Key::KeyJ,
        0x27 => Key::Quote,
        0x28 => Key::KeyK,
        0x29 => Key::Semicolon,
        0x2A => Key::Backslash,
        0x2B => Key::Comma,
        0x2C => Key::Slash,
        0x2D => Key::KeyN,
        0x2E => Key::KeyM,
        0x2F => Key::Period,

        // Special keys
        0x24 => Key::Enter,
        0x30 => Key::Tab,
        0x31 => Key::Space,
        0x32 => Key::Grave,
        0x33 => Key::Backspace,
        0x35 => Key::Escape,
        0x36 => Key::MetaRight,
        0x37 => Key::MetaLeft,
        0x38 => Key::ShiftLeft,
        0x39 => Key::CapsLock,
        0x3A => Key::AltLeft,
        0x3B => Key::ControlLeft,
        0x3C => Key::ShiftRight,
        0x3D => Key::AltRight,
        0x3E => Key::ControlRight,

        // Function keys
        0x7A => Key::F1,
        0x78 => Key::F2,
        0x63 => Key::F3,
        0x76 => Key::F4,
        0x60 => Key::F5,
        0x61 => Key::F6,
        0x62 => Key::F7,
        0x64 => Key::F8,
        0x65 => Key::F9,
        0x6D => Key::F10,
        0x67 => Key::F11,
        0x6F => Key::F12,
        0x69 => Key::F13,
        0x6B => Key::F14,
        0x71 => Key::F15,
        0x6A => Key::F16,
        0x40 => Key::F17,
        0x4F => Key::F18,
        0x50 => Key::F19,
        0x5A => Key::F20,

        // Navigation
        0x73 => Key::Home,
        0x77 => Key::End,
        0x74 => Key::PageUp,
        0x79 => Key::PageDown,
        0x7B => Key::ArrowLeft,
        0x7C => Key::ArrowRight,
        0x7D => Key::ArrowDown,
        0x7E => Key::ArrowUp,

        // Insert/Delete
        0x72 => Key::Insert, // Help key on Mac, often used as Insert
        0x75 => Key::Delete, // Forward delete

        // Numpad
        0x52 => Key::Numpad0,
        0x53 => Key::Numpad1,
        0x54 => Key::Numpad2,
        0x55 => Key::Numpad3,
        0x56 => Key::Numpad4,
        0x57 => Key::Numpad5,
        0x58 => Key::Numpad6,
        0x59 => Key::Numpad7,
        0x5B => Key::Numpad8,
        0x5C => Key::Numpad9,
        0x41 => Key::NumpadDecimal,
        0x43 => Key::NumpadMultiply,
        0x45 => Key::NumpadAdd,
        0x47 => Key::NumLock, // Clear key on Mac
        0x4B => Key::NumpadDivide,
        0x4C => Key::NumpadEnter,
        0x4E => Key::NumpadSubtract,
        0x51 => Key::NumpadEqual,

        // Media keys (some require special handling)
        0x48 => Key::VolumeUp,
        0x49 => Key::VolumeDown,
        0x4A => Key::VolumeMute,

        // Unknown
        _ => Key::Unknown(code as u32),
    }
}

/// Convert our Key enum to a macOS CGKeyCode.
pub fn key_to_keycode(key: Key) -> Option<u16> {
    Some(match key {
        // Letters
        Key::KeyA => 0x00,
        Key::KeyS => 0x01,
        Key::KeyD => 0x02,
        Key::KeyF => 0x03,
        Key::KeyH => 0x04,
        Key::KeyG => 0x05,
        Key::KeyZ => 0x06,
        Key::KeyX => 0x07,
        Key::KeyC => 0x08,
        Key::KeyV => 0x09,
        Key::KeyB => 0x0B,
        Key::KeyQ => 0x0C,
        Key::KeyW => 0x0D,
        Key::KeyE => 0x0E,
        Key::KeyR => 0x0F,
        Key::KeyY => 0x10,
        Key::KeyT => 0x11,
        Key::KeyU => 0x20,
        Key::KeyI => 0x22,
        Key::KeyO => 0x1F,
        Key::KeyP => 0x23,
        Key::KeyL => 0x25,
        Key::KeyJ => 0x26,
        Key::KeyK => 0x28,
        Key::KeyN => 0x2D,
        Key::KeyM => 0x2E,

        // Numbers
        Key::Num1 => 0x12,
        Key::Num2 => 0x13,
        Key::Num3 => 0x14,
        Key::Num4 => 0x15,
        Key::Num5 => 0x17,
        Key::Num6 => 0x16,
        Key::Num7 => 0x1A,
        Key::Num8 => 0x1C,
        Key::Num9 => 0x19,
        Key::Num0 => 0x1D,

        // Special keys
        Key::Enter => 0x24,
        Key::Tab => 0x30,
        Key::Space => 0x31,
        Key::Grave => 0x32,
        Key::Backspace => 0x33,
        Key::Escape => 0x35,
        Key::MetaLeft => 0x37,
        Key::MetaRight => 0x36,
        Key::ShiftLeft => 0x38,
        Key::CapsLock => 0x39,
        Key::AltLeft => 0x3A,
        Key::ControlLeft => 0x3B,
        Key::ShiftRight => 0x3C,
        Key::AltRight => 0x3D,
        Key::ControlRight => 0x3E,

        // Punctuation
        Key::Equal => 0x18,
        Key::Minus => 0x1B,
        Key::BracketLeft => 0x21,
        Key::BracketRight => 0x1E,
        Key::Quote => 0x27,
        Key::Semicolon => 0x29,
        Key::Backslash => 0x2A,
        Key::Comma => 0x2B,
        Key::Slash => 0x2C,
        Key::Period => 0x2F,

        // Function keys
        Key::F1 => 0x7A,
        Key::F2 => 0x78,
        Key::F3 => 0x63,
        Key::F4 => 0x76,
        Key::F5 => 0x60,
        Key::F6 => 0x61,
        Key::F7 => 0x62,
        Key::F8 => 0x64,
        Key::F9 => 0x65,
        Key::F10 => 0x6D,
        Key::F11 => 0x67,
        Key::F12 => 0x6F,
        Key::F13 => 0x69,
        Key::F14 => 0x6B,
        Key::F15 => 0x71,
        Key::F16 => 0x6A,
        Key::F17 => 0x40,
        Key::F18 => 0x4F,
        Key::F19 => 0x50,
        Key::F20 => 0x5A,

        // Navigation
        Key::Home => 0x73,
        Key::End => 0x77,
        Key::PageUp => 0x74,
        Key::PageDown => 0x79,
        Key::ArrowLeft => 0x7B,
        Key::ArrowRight => 0x7C,
        Key::ArrowDown => 0x7D,
        Key::ArrowUp => 0x7E,

        // Insert/Delete
        Key::Insert => 0x72,
        Key::Delete => 0x75,

        // Numpad
        Key::Numpad0 => 0x52,
        Key::Numpad1 => 0x53,
        Key::Numpad2 => 0x54,
        Key::Numpad3 => 0x55,
        Key::Numpad4 => 0x56,
        Key::Numpad5 => 0x57,
        Key::Numpad6 => 0x58,
        Key::Numpad7 => 0x59,
        Key::Numpad8 => 0x5B,
        Key::Numpad9 => 0x5C,
        Key::NumpadDecimal => 0x41,
        Key::NumpadMultiply => 0x43,
        Key::NumpadAdd => 0x45,
        Key::NumLock => 0x47,
        Key::NumpadDivide => 0x4B,
        Key::NumpadEnter => 0x4C,
        Key::NumpadSubtract => 0x4E,
        Key::NumpadEqual => 0x51,

        // Media
        Key::VolumeUp => 0x48,
        Key::VolumeDown => 0x49,
        Key::VolumeMute => 0x4A,

        _ => return None,
    })
}