Сброс состояния клавиатуры Virtual Core XTEST - PullRequest
0 голосов
/ 09 марта 2020

Я занимаюсь разработкой приложения linux, которое использует расширение xtest для воспроизведения нажатий клавиш, полученных расширением записи x11. При тестировании воспроизведения входов, если я ухожу рано, иногда остается клавиатура 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 для этого.

Заранее спасибо.

1 Ответ

0 голосов
/ 10 марта 2020

Я нашел и отвечаю, используя как минимум код, а не заданную утилиту. В моем объектном деструкторе (я работаю с c ++) я сделал al oop, который передает сигнал отпускания клавиши на тестовую клавиатуру, например так:

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);

Выше предполагается, что у вас открытое соединение, Сначала я не хотел этого делать, чтобы избежать хаоса, но, поскольку это все ключевые релизы, это не вызывает никаких проблем. Убедитесь, что вы используете минимальные и максимальные коды настройки, иначе вы получите ошибку неправильного значения.

...