在Linux下拖放/重写/生成键盘事件
我想在Linux下将它们传递给任何应用程序之前,在Linux下挂钩,拦截并生成键盘(make / break)事件。 更确切地说,我想要检测关键事件流中的模式,并能够根据检测到的模式将事件放入/插入流中。
我已经看到了一些相关的问题,但是:
一个小DSL
我在下面解释这个问题,但为了使它更加紧凑和易于理解,首先是一个小的DSL定义。
A_
:制作(按)键A A^
:中断(释放)键A A^->[C_,C^,U_,U^]
:在A^
为C发送一个make / break组合,然后U在处理链(最后到应用程序)下面进一步发送。 如果没有->
则没有任何发送(但内部状态可能会被修改以检测后续事件)。 $X
:执行一个任意的动作。 这可以发送一些可配置的按键事件序列(可能类似Emacs的Cx Cs
),或执行一个函数。 如果我只能发送关键事件,那就足够了,因为我可以在窗口管理器中进一步处理这些事件,具体取决于哪个应用程序处于活动状态。 问题描述
好吧,用这个表示法,下面是我想要检测的模式以及我想要在处理链中传递哪些事件。
A_, A^->[A_,A^]
:expl。 请参阅上文,请注意发送发生在A^
。 A_, B_, A^->[A_,A^], B^->[B_,B^]
:基本上与1相同,但重叠事件不会改变处理流程。 A_, B_, B^->[$X], A^
:如果在保存另一个键(A)时执行了键(B)的完整制造/中断,则执行X(见上文) A被丢弃。 (原则上,这是一个简单的状态机,通过关键事件实现,可以生成(多个)关键事件作为输出)。
补充笔记
可能的解决方案和问题
所以基本的问题是如何实现这一点。
我使用被动抓取( XGrabKey
)和XSendEvent
在窗口管理器中实现了一个解决方案。 不幸的是,被动抓斗在这种情况下不起作用,因为它们不能在上面的第二种模式中正确捕捉到B^
。 原因是转换后的抓取在A^
上结束,并且不会继续到B^
。 如果仍然保持,则只有在约1秒后才会将新抓斗转换为抓拍B. 否则,一个普通的B^
被发送到应用程序。 这可以用xev
验证。
我可以将我的实现转换为使用主动抓取( XGrabKeyboard
),但如果窗口管理器始终在键盘上有活动抓取,我不确定对其他应用程序的影响。 X文件指的是积极争夺是侵入性的,并被设计为短期使用。 如果有人有这方面的经验,并且长期积极争夺没有重大缺陷,那么我会认为这是一个解决方案。
除了窗口管理器(作为X客户端运行)之外,我愿意查看其他关键事件处理层。 只要我能解决上述问题,键盘驱动程序或映射就是可能的。 这也意味着解决方案不必是一个单独的应用程序。 我非常好地拥有一个驱动程序或内核模块为我做这件事。 请注意,虽然我从来没有做过任何内核或驱动程序编程,所以我会很感激一些好的资源。
感谢任何指针!
使用XInput2使设备(键盘)浮动,然后监视设备上的KeyPress和KeyRelease事件,使用XTest重新生成KeyPress&KeyRelease事件。
链接地址: http://www.djcxy.com/p/3035.html