如何构建位于键盘和应用程序之间的组件来捕获所有按键并发出自己的按键信号。发出的信号不一定与捕获的信号一一对应。最终,我尝试创建一种类似于 ibus 的输入方法(我也希望了解有关 ibus 在技术上如何工作的信息)。
看完之后这个问题,我认为适当的捕获位置是在生成键码或键符号之后。我还了解 X 允许客户端获取所有听起来与我想做的事情相关的键盘事件。
答案1
基本上有两种方法:
1) 在内核级别,找到产生按键的 /dev/input 设备,打开它并执行“grab”-ioctl(与evtest --grab
操作相同)。这将导致该输入设备将按键事件专门发送到您的应用程序。然后用于/dev/uinput
从应用程序创建您自己的输入设备,您可以在其中发送按键事件。 X 应自动连接到该设备。
2)在X级别,像窗口管理器一样拦截按键事件,并发送您自己的事件XSendEvent
。我不确定抢夺是否是最好的方法;抓取适用于某些应用程序暂时想要在特定交互期间拦截所有事件的情况。
我不知道 ibus 是做什么的(甚至可能是第三种方法),我还没有详细研究过它。
编辑
必须查一下这个,因为它太长了,我无法阅读所有 X 细节。
有两个基本的抓取函数:XGrabKeyboard
,它生成 FocusIn 和 FocusOut 事件,并完全控制键盘(主动抓取)。这就是我在上面谈论 X 抓取时所指的功能,并且该功能只应暂时激活。
还有XGrabKey
,它注册对特定键码的被动抓取。快速查看窗口管理器的源代码fvwm
,这似乎就是窗口管理器所使用的。
这个细节非常复杂,您可能想要挖掘一些有关如何对窗口管理器进行编程的文档(或阅读源代码,甚至可能是ibus
源代码)。