首页 > 解决方案 > 重置虚拟核心 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 的一个不错的替代品来做到这一点,我将不胜感激。

提前致谢。

标签: x11resetvirtual-keyboard

解决方案


我至少使用代码而不是给定的实用程序找到并回答。在我的对象析构函数(我正在使用 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);

以上假设您有一个开放的连接,我起初不愿意这样做以避免混乱,但因为它都是关键版本,它不会引起任何问题。确保使用设置最小和最大代码,否则您将生成错误值错误。


推荐阅读