x11 - 重置虚拟核心 XTEST 键盘状态
问题描述
我正在开发一个使用 xtest 扩展来重放 x11 记录扩展所采取的按键的 linux 应用程序。在测试输入的重放时,如果我提前退出,它有时会使 Virtual Core XTEST 键盘的按键仍然被按下。请查看以下输出:
# DISPLAY=:0 xinput --list
â¡ Virtual core pointer id=2 [master pointer (3)]
â â³ Virtual core XTEST pointer id=4 [slave pointer (2)]
â â³ Mouse0 id=6 [slave pointer (2)]
â â³ elographics id=8 [slave pointer (2)]
⣠Virtual core keyboard id=3 [master keyboard (2)]
â³ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
â³ Keyboard0 id=7 [slave keyboard (3)]
# DISPLAY=:0 xinput --query-state 5 | grep down
key[55]=down
key[103]=down
我需要一个命令来重置这些密钥,不幸的是 xdotool 在我工作的平台(Centos 6.10)上不是一个选项,它严格只能使用存储库中的工具。
我试过使用
setxkbmap
但是,这不会重置键状态。如果有人知道 xdotool 的一个不错的替代品来做到这一点,我将不胜感激。
提前致谢。
解决方案
我至少使用代码而不是给定的实用程序找到并回答。在我的对象析构函数(我正在使用 c++)中,我创建了一个循环,将按键释放信号传递给测试键盘,如下所示:
xcb_setup_t const *xcbSetup = xcb_get_setup(this->xcbConnection);
for(size_t keyCode = xcbSetup->min_keycode;
keyCode <= xcbSetup->max_keycode;
keyCode++) {
xcb_test_fake_input(this->xcbConnection,
XCB_KEY_RELEASE, keyCode,
XCB_CURRENT_TIME, XCB_NONE,
0, 0, 0);
}
xcb_flush(this->xcbConnection);
以上假设您有一个开放的连接,我起初不愿意这样做以避免混乱,但因为它都是关键版本,它不会引起任何问题。确保使用设置最小和最大代码,否则您将生成错误值错误。
推荐阅读
- rust - 有没有办法制作结构,包含内部引用?
- makefile - 带有模式和通配符的 Makefile:没有规则来制作目标
- python - 如何读取 JSON 格式的日语词典列表而不插入新字符?
- java - 如何同时更新和删除数据 Realtime Firebase
- c# - C# 正确使用带有 SafeSocketHandle 的 Dispose
- java - 过滤firebase中的子数据
- exchange-basicauth - 为 IMAP 添加 Oauth2 支持的时间表
- python - 从 docx 中提取文本作为键值对给出属性错误
- python - 忽略python单元测试用例中的记录器功能
- c - 如何在 C 中的数组中保存和显示元素