#keyboard #input-event #qmk #evdev #events #quantum #soft

bin+lib quantum-soft-keyboard

受 QMK 启发的软件键盘重映射器

1 个不稳定版本

0.1.0 2022年3月5日

#541 in 操作系统

MIT/Apache

69KB
2K SLoC

量子软键盘

你从未意识到需要但一定会想要的键盘重映射软件。

受开源键盘固件项目 QMK 的启发,qsk 的目标是使任意连接到宿主系统的键盘能够实现类似的功能。例如,笔记本电脑上的内置键盘或1990年代商场电脑中的那款糟糕的通用键盘。

功能

  • 标准键盘重映射,例如将 F 重映射为 U
  • 通过特别分配的键激活的可组合按键映射层
  • "轻触切换",当在给定时间内轻触时发送常规按键,当保持时激活指定的层

相对于 QMK 非常丰富的功能集,这个功能集仍然相对较小。功能将根据需要实现 -- 欢迎贡献!

使用方法

构建

git clone https://github.com/waynr/qsk
cd qsk
cargo build

运行

./target/debug/quantum-soft-keyboard -v /dev/input/by-path/<target-keyboard>

与 QMK 的区别

假设你已经熟悉 QMK,你可能会对它与 QMK 的区别感兴趣。

如果你不熟悉 QMK,那么简单地说,这是一款软件,你可以用它来定制受支持的键盘的行为,以动态改变按键的行为。如果你想了解更多,请查看 QMK 文档网站,但请注意,它可能是一个相当深奥的洞。

目标运行时

QMK 编译为必须加载到它支持的特定目标键盘上的固件。因此,它不对宿主系统施加资源消耗负担,并最小化了由于微控制器的专用性质而产生的延迟。

qsk,另一方面,编译为必须在接收原始硬件输入事件的宿主系统上运行的二进制文件。

它需要宿主系统上的权限来

  • 抓取现有输入设备的输入以接收其输入事件。
  • 创建一个新的虚拟输入设备,并将它生成的或从源输入设备传递的按键发送到该设备。

此外,你必须告诉 qsk 在执行二进制文件时抓取哪个源输入设备。

额外的延迟

正如你所想象的,像 qsk 这样的工具在它接收键盘事件和发送相应可能更改的键盘事件之间注入非平凡延迟的可能性是存在的。

选择Rust作为这个工具的编程语言,除了个人喜好之外,还旨在在提供扩展其功能机会的同时,安全地最小化延迟。尽管如此,目前还没有对涉及的延迟进行特性描述,但本人(waynr)可以证实,在日常使用中似乎并不明显。

重映射输入事件,而非实际按键

qsk中,我们不是将所需的键盘事件/行为映射到特定的硬件按键,而是映射到其他键盘或输入事件。因此,您需要了解您希望物理设备映射到的输入事件以及目标主机操作系统,以便有效地进行重映射。

未来,我们可能能够做一些有趣的事情,例如检查给定输入设备的详细信息,并允许用户通过GUI进行配置,输入事件接口向我们展示的默认布局。欢迎在此领域做出贡献!

支持的操作系统

由于qsk的特性,支持很可能需要针对特定的内核/操作系统,因为这是最自然的API边界,其中可能为这类事情提供接口。

Linux

对于Linux,我们通过evdev实现设备支持,这是内核提供的一个通用输入事件接口。以下是一个简化的关系链示例

brain -> fingers -> keyboard -> CPU interrupts -> interrupt handlers (kernel) ->
evdev subsystem (kernel/userspace) -> qsk -> X11 input drivers OR libinput for
Wayland -> your program

请注意,当qsk连接到某个输入源时,它会“捕获”该输入,从而拥有独家读取其事件的权力。

[待办] Mac

我没有苹果电脑,因此为它们实现支持对我来说并不实用。我对此有些怀疑,认为这不如Linux容易,但愿意被有苹果电脑的人证明我是错的。请鼓励为它们实现支持,我会很高兴提供任何你需要的指导!

[待办] Windows

我没有Windows电脑,因此为它们实现支持对我来说并不实用。我对此有些怀疑,认为这不如Linux容易,但我愿意被有Windows的人证明我是错的。请鼓励为它们实现支持,我会很高兴提供任何你需要的指导!

[待办] ??

有我不知道的操作系统或计算范式吗?请告诉我!

维护者

Wayne Warren是一个普通的软件开发者,喜欢用Rust编写软件,并因他的高度定制的机械键盘固件与各种笔记本电脑上不可定制的内置键盘之间缺乏肌肉记忆兼容性而促使他编写了qsk

依赖项

~15–27MB
~415K SLoC