在Linux下拖放/重写/生成键盘事件

我想在Linux下将它们传递给任何应用程序之前,在Linux下挂钩,拦截并生成键盘(make / break)事件。 更确切地说,我想要检测关键事件流中的模式,并能够根据检测到的模式将事件放入/插入流中。

我已经看到了一些相关的问题,但是:

  • 他们只处理如何处理关键事件(关键记录器等),而不处理如何操作它们的传播(他们只听,但不拦截/生成)。
  • 或者他们在X中使用被动/主动抓斗(更多关于下面的内容)。
  • 一个小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被丢弃。
  • (原则上,这是一个简单的状态机,通过关键事件实现,可以生成(多个)关键事件作为输出)。

    补充笔记

  • 解决方案必须以打字速度工作。
  • 修改后的关键事件流的消费者在Linux上运行X(控制台,浏览器,编辑器等)。
  • 只有键盘事件影响处理(无鼠标等)
  • 匹配可以发生在关键字(更容易一些)或者关键码(更难一点)上。 对于后者,我只需要在映射中读取以从代码转换为keysym。
  • 如果可能的话,我更喜欢可以同时使用USB键盘和虚拟机的解决方案(如果在驱动程序层工作,可能会出现问题,其他层应该可以)。
  • 我对实现语言非常开放。
  • 可能的解决方案和问题

    所以基本的问题是如何实现这一点。

    我使用被动抓取( 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

    上一篇: drop/rewrite/generate keyboard events under Linux

    下一篇: Bada development in Linux