gpt4 book ai didi

c - X11/Xlib : virtual keyboard input and keyboard mapping synchronization issue

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:44 54 4
gpt4 key购买 nike

对于自动化测试应用程序,我必须模拟大量 unicode 键盘输入到旧的 X11 应用程序(我没有任何源代码访问权限)。我的程序通过标准输入从 UCS-2 LE 编码的输入流中获取输入,基本操作如下:

  1. 保存当前键盘布局和锁定修饰符(XDisplayKeycodesXGetKeyboardMappingXkbGetState)
  2. 解锁事件修饰符(XkbLockModifiers)
  3. 通过 Xinput2 扩展禁用所有 X11 从属键盘设备
  4. 将输入读入按键队列,直到遇到 n 个唯一符号,其中 nXDisplayKeycodes 返回的可能键码的数量.
  5. 通过 XChangeKeyboardMappingn 可用的 KeyCodes 上映射这些 n 个唯一的 X11 KeySyms
  6. 通过 XTestFakeKeyEvent 为所有排队的 KeySyms 键入正确的 KeyCodes
  7. 清空队列并在 4.) 继续,直到没有输入可用
  8. 重新激活键盘并恢复初始修饰符和映射

基本上,这个系统比我目前看到的任何虚拟 X11 键输入工具都运行得更好,性能也更高。

但是,有一个问题我目前只能使用丑陋的延迟来解决:

与任何其他 X11 应用程序一样,在我的应用程序成功更改键盘映射表后,目标应用程序从 X 服务器接收到一个 MappingNotify (request==Keyboard) 事件。X11 客户端的通常响应是调用 XRefreshKeyboardMapping 来更新 Xlib 对新键盘布局的了解。

现在,如果客户端在处理其 X11 事件队列时有一些滞后,则 XRefreshKeyboardMapping 调用可能会返回一个太新的映射,该映射已经是 future 几代之后的映射了。例如。当目标应用程序刚到达处理其 XEvent 队列处理程序中的第二个 MappingNotify 事件时,我的输入生成器已经完成了第四个 XChangeKeyboardMapping。实际上它应该得到第二代 map ,那时 X 服务器上已经不可用了。

不幸的是,在键盘 MappingNotify 事件中没有 map ID 或任何类型的版本,因此 XRefreshKeyboardMapping 可以引用特定的 map ......而 X 服务器确实如此似乎也没有保留历史。

结果是 X11 应用程序的 KeyCodeKeySym 的转换在无效布局下运行并生成错误的 KeySyms。

所以基本上我必须等到所有客户端(或者至少是具有输入焦点的客户端)都请求并收到我的最后一个 XChangeKeyboardMapping 映射,然后我才能执行下一个 XChangeKeyboardMapping

我可以使用 XChangeKeyboardMapping 之前的延迟修复 99.9% 的错误,并且该延迟是由一些丑陋的巫术(击键数量等)计算得出的,如果 100% 的准确度达到实现。

所以我的问题是,是否有任何方法可以通过编程方式获得通知或检查 X11 客户端是否已完成 XRefreshKeyboardMapping 或其映射是否与服务器映射同步?

如果不是,是否有办法通过 xlib 获取另一个 X11 客户端的当前映射(以检查映射是否是当前的)?

感谢任何提示!

最佳答案

我过去在 Windows 上做过类似的事情。我有幸能够使用 SendInput 函数,该函数接受带有 KEYEVENTF_UNICODE 标志的 KEYBDINPUT 结构。不幸的是,X11 不支持直接击键合成 Unicode 字符。

因为我还不能发表评论,所以我不得不给出一个建议作为答案:

您是否考虑过使用剪贴板来将您的“unicode 输入”传输到此 X11 应用程序的输入字段中?

如果该应用程序使用支持此功能的工具包,您还可以考虑使用直接 Unicode 输入:

例如基于 GTK+ 的程序(包括所有 GNOME 应用程序)支持 Unicode 输入。
按住 Ctrl + Shift 并键入 u 后跟 Unicode 十六进制数字,然后松开 CtrlShift 再次。

我想使用 Xtest 扩展来合成这些序列应该很容易。

关于c - X11/Xlib : virtual keyboard input and keyboard mapping synchronization issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55226590/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com