我正在编写几个应用程序来改变键盘的工作方式。 (一个允许按键和弦,另一个允许您大声说出音节来键入单个字符。)这些应用程序的“布局”的处理方式与哪种键盘或哪种类型无关。人们在运行程序时拥有的键盘布局,它应该打印您告诉它打印的字符。我必须克服很多困难才能让这个工作正常进行,我想我了解键盘输入现在在典型的 Linux 计算机上通常是如何工作的:
- 在计算机启动时,XKB 会记住一张
evdev
扫描码对应于 XF86 键码的表。 - 在加载布局时,XKB 会记住另一个表,其中包含 XF86 键符号对应于要输入的 Unicode 字符,主要通过读取来完成
/usr/include/X11/keysymdef.h
。然后它会记住另一个 XF86 键码对应于键符号的表(这就是“布局”)。这可能只是折叠成键码到字符的映射。 - 现在,每当
evdev
听到键盘按下按键时,就会向 XKB 发送扫描码...... - ...XKB 告诉 X 键入特定的 Unicode 字符。
由于我的应用程序的后端是evdev
,而我真正想做的是 X 所做的事情,这非常令人沮丧,因为我必须模拟两者之间的所有内容。我可以直接告诉X做什么吗?我不介意需要管理员访问权限;这显然是随着领土而来的。只是,我的意思是,如果 XKB 可以模拟具有任意几何形状的键盘,为什么我不能假装是每个 Unicode 字符都有一个按键的键盘呢?
我的应用程序是用 Python 编写的,但我也可以用其他语言编写的任何东西。
编辑:看来大坝位于按键中的进程读取调用按键生成的XLookupString()
报告的位置。XKeyEvent
该过程会将按键解释为与返回KeySym
的内容相对应XLookupString()
。这是个坏消息,因为XLookupString()
从 XKB 的布局中获取有关 keycode-keysym 对应关系的信息。因此,要伪造任意键符号的输入,我们需要让 XKB 对布局撒谎,或者XLookupString()
对键符号撒谎。