Thanks to visit codestin.com
Credit goes to lib.rs

#usb-hid #keyboard #ps2

no-std keycode

A Rust crate for translating keycodes based on Chrome's mapping of keys

9 releases (1 stable)

1.0.0 Mar 19, 2025
0.4.0 Sep 1, 2022
0.3.0 Jan 2, 2020
0.2.2 Jul 8, 2019
0.1.1 Jan 27, 2019

#101 in Hardware support

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

3,699 downloads per month
Used in 6 crates (5 directly)

MIT license

17KB
198 lines

keycode

A Rust crate for translating keycodes based on Chrome's mapping of keys.

Easily convert, generate, listen for, or map keycodes for Linux, Windows, Mac, USB, and browsers! Includes a struct to manage the state of pressed keys and generate USB HID reports. Can be used for #![no_std] crates.

Source Data

Source of keycodes data:

How to update source file:

curl -sL 'https://chromium.googlesource.com/chromium/src/+/master/ui/events/keycodes/dom/keycode_converter_data.inc?format=TEXT' | base64 --decode > keycode_converter_data.inc

Examples

Get a key mapping

use keycode::{KeyMap, KeyMappingId};

// Check the USB HID value of the "a" key
fn main() {
    let a = KeyMap::from(KeyMappingId::UsA);
    assert_eq!(a.usb, 0x0004);
    assert_eq!(a.evdev, 0x001e);
    assert_eq!(a.xkb, 0x0026);
    assert_eq!(a.win, 0x001e);
    assert_eq!(a.mac, 0x0000);
}

Generate a USB HID report

use keycode::{KeyboardState, KeyMap, KeyMappingId, KeyState};

// Press and release the "A" key
fn main() {
    // Generate a keyboard state with n-key rollover
    let mut keyboard_state = KeyboardState::new(None);

    // Get key mappings
    let a = KeyMap::from(KeyMappingId::UsA);
    let shift = KeyMap::from(KeyMappingId::ShiftLeft);

    // USB HID report for "no keys pressed"
    assert_eq!(keyboard_state.usb_input_report(), &[0; 8]);

    // Press "shift" and "a" keys
    keyboard_state.update_key(a, KeyState::Pressed);
    keyboard_state.update_key(shift, KeyState::Pressed);

    // USB HID report for "'A' is pressed"
    assert_eq!(
        keyboard_state.usb_input_report(),
        &[shift.modifier.unwrap().bits(), 0, a.usb as u8, 0, 0, 0, 0, 0]
    );

    // Release "shift" and "a" keys
    keyboard_state.update_key(a, KeyState::Released);
    keyboard_state.update_key(shift, KeyState::Released);

    // USB HID report for "no keys pressed"
    assert_eq!(keyboard_state.usb_input_report(), &[0; 8]);
}

Supported Rust Versions

Requires Rust 1.34.0 or newer due to use of TryFrom.

Developing

I recommend to use Nix and the flake within this repo:

nix develop

Dependencies

~355–610KB
~12K SLoC