#keyboard-layout #layout #keyboard #hid

bin+lib keyboard-layouts

带有生成HID数据包API的键盘布局键图

4 个版本 (2 个破坏性更新)

0.3.0 2020年8月3日
0.2.1 2020年6月9日
0.2.0 2019年8月30日
0.1.0 2019年2月28日

#1321硬件支持

MIT/Apache

76KB
1.5K SLoC

键盘布局

获取输入ASCII字符串所需的键码和修饰键,适用于多种不同的键盘布局。

Teensyduino项目中汲取灵感并使用其初始布局映射

它通过预处理一个描述每个布局键映射的C头文件来工作,包括使用#define定义的任何死键。然后使用bindgen将这些转换为Rust常量,然后使用syn提取相关的键码和掩码。最后使用quote!lazystatic!生成布局映射,使您能够在不重新编译的情况下动态切换键盘布局。

示例用法


let test_string = "This is a test string.\n";

// Get the sequence of HID packets that would be produced by a keyboard with the specified layout
let hid_packets = keyboard_layouts::string_to_hid_packets("LAYOUT_UNITED_KINGDOM", test_string).unwrap();

// Write those HID packets to your virtual keyboard device. In this case a OTG HID gadget device file (linux).
std::fs::write("/dev/hidg0", hid_packets);

虚拟键盘设备

这取决于您的操作系统和底层硬件。到目前为止,这仅在Linux上尝试过,但HID数据包应该对Windows和Mac有效。

在Linux上,您可以选择

对于Windows和Mac,我毫无头绪。

kbsim CLI工具

包含了一个有用的CLI工具kbsim

USAGE:
    kbsim [FLAGS] [OPTIONS] [STRING]

FLAGS:
    -h, --help       Prints help information
    -n, --newline    Hit the 'Enter' key after writing the string
    -V, --version    Prints version information

OPTIONS:
    -c, --cooldown <cooldown>    Specify the number of milliseconds to wait between sending each HID packet to the
                                 device file [default: 0]
    -d, --delay <delay>          Specify the number of seconds to wait before writing [default: 0]
    -f, --hid-file <hid_file>    The HID file to write to. Defaults to /dev/hidg0
    -l, --layout <layout>        The keyboard layout to use. Specify 'list' to show all available layouts [default:
                                 LAYOUT_US_ENGLISH]

ARGS:
    <STRING>  

支持的布局

西班牙语

加拿大法语

德国Mac

德国瑞士

冰岛语

英国

意大利语

法语瑞士

芬兰语

丹麦语

法语

德语

土耳其语

法语比利时

葡萄牙语

加拿大多语言

西班牙语拉丁美洲

美国英语

美国国际

瑞典语

葡萄牙语巴西

爱尔兰语

挪威语

测试

测试所有布局是否正确是很困难的。因此,测试是 hacks。

每个布局的测试分为字母数字和符号。每个测试

  1. 设置用户会话的键盘布局(仅在纯虚拟控制台,无X)
  2. 使用 /dev/uhid 在机器上创建虚拟 HID 设备(用户需要权限)
  3. 将所有指定的字符写入虚拟 HID 设备(光标需要位于测试终端并保持在那里)
  4. 从 stdin 读取字符串类型并与原始字符串进行比较。

依赖项

约 4MB
约 69K SLoC