Keycode
A Rust crate for translating keycodes based on Chrome's mapping of keys.
Install / Use
/learn @dfrankland/KeycodeREADME
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:
- Repo: https://chromium.googlesource.com/chromium/src.git
- File: https://chromium.googlesource.com/chromium/src.git/+/master/ui/events/keycodes/dom/keycode_converter_data.inc
- Git commit:
2b6022954b9fb600f15e08002a148187f4f986da
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
Related Skills
node-connect
352.5kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
111.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
352.5kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
352.5kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
