#usb-hid #usb #hid #key #keyboard #ps2 #key-pressed

无std keycode

基于Chrome键映射的Rust crate,用于转换键码

8个版本

0.4.0 2022年9月1日
0.3.0 2020年1月2日
0.2.2 2019年7月8日
0.1.2 2019年6月18日
0.1.1 2019年1月27日

#677操作系统

Download history 740/week @ 2024-03-13 890/week @ 2024-03-20 302/week @ 2024-03-27 527/week @ 2024-04-03 488/week @ 2024-04-10 450/week @ 2024-04-17 1117/week @ 2024-04-24 789/week @ 2024-05-01 1131/week @ 2024-05-08 922/week @ 2024-05-15 987/week @ 2024-05-22 1363/week @ 2024-05-29 953/week @ 2024-06-05 489/week @ 2024-06-12 613/week @ 2024-06-19 581/week @ 2024-06-26

3,109 每月下载量
用于 3 crates

MIT 许可证

17KB
191

keycode

基于Chrome键映射的Rust crate,用于转换键码。

轻松转换、生成、监听或映射Linux、Windows、Mac、USB和浏览器的键码!包括一个 struct 来管理按下的键的状态并生成USB HID报告。可用于 #![no_std] crates。

源数据

键码数据源

如何更新源文件

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

示例

获取键映射

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);
}

生成USB HID报告

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]);
}

支持的Rust版本

由于使用了 TryFrom,需要Rust 1.34.0或更高版本。

依赖

~0.9–1.2MB
~21K SLoC