Вводные данные на встроенном устройстве Linux
На вашем встроенном устройстве Linux, когда нет системного окна, ввод мыши, клавиатуры и сенсорного экрана считывается непосредственно через evdev или с помощью вспомогательных библиотек, таких как libinput или tslib. Однако это поведение требует, чтобы узлы устройств /dev/input/event* были доступны для чтения пользователем. eglfs и linuxfb содержат весь код обработки ввода, скомпилированный в ядро.
Использование libinput
libinput — это библиотека для обработки устройств ввода, предлагающая альтернативу собственному механизму обработки ввода Qt evdev. Чтобы использовать libinput, при конфигурировании и сборке Qt убедитесь, что доступны файлы разработки для libudev и libinput. Если требуется поддержка клавиатуры, также необходим xkbcommon. С eglfs и linuxfb, дальнейших действий не требуется, так как эти плагины по умолчанию используют libinput. Если поддержка libinput недоступна или переменная окружения QT_QPA_EGLFS_NO_LIBINPUT установлена, вместо этого используются собственные обработчики ввода Qt evdev.
Ввод на eglfs и linuxfb без libinput
Параметры, такие как имя узла устройства, могут быть заданы в переменных среды QT_QPA_EVDEV_MOUSE_PARAMETERS, QT_QPA_EVDEV_KEYBOARD_PARAMETERS и QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS; разделяйте записи двоеточием. Эти параметры являются альтернативой передаче настроек в аргументе командной строки -plugin, и в некоторых бэкэндах они являются обязательными. Но eglfs и linuxfb используют встроенные обработчики ввода, поэтому отдельный аргумент -plugin не используется.
Кроме того, встроенные обработчики ввода можно отключить, установив QT_QPA_EGLFS_DISABLE_INPUT (для eglfs) или QT_QPA_FB_DISABLE_INPUT (для linuxfb) в значение 1.
Мышь
Курсор мыши отображается, когда QT_QPA_EGLFS_HIDECURSOR (для eglfs) или QT_QPA_FB_HIDECURSOR (для linuxfb) не установлены и Qt-базированное на libudev обнаружение устройств сообщает, что доступна по крайней мере одна мышь. Когда поддержка libudev отсутствует, курсор мыши всегда отображается; если его явно не отключить через переменную среды.
Если Qt был сконфигурирован с поддержкой libudev, подключение или отключение устройства ввода во время работы приложения (горячая подключаемость) поддерживается. Тогда заголовки разработки libudev присутствуют в sysroot на этапе конфигурирования.
Обработчик мыши evdev поддерживает следующие дополнительные параметры:
| Параметр | Описание |
|---|---|
/dev/input/... |
Указывает имя устройства ввода. Если не указано, Qt ищет подходящее устройство либо через libudev, либо, перебирая доступные узлы. |
nocompress |
По умолчанию события ввода, которые не приводят к изменению позиции по сравнению с последним событием мыши Qt, сжимаются. Новое событие мыши Qt отправляется только после изменения положения или состояния кнопки. Чтобы отключить это поведение, установите параметр nocompress |
dejitter |
Указывает предел джиттера; по умолчанию отключено. |
grab |
При установке в 1, Qt захватывает устройство для эксклюзивного использования. |
abs |
Некоторые сенсорные экраны сообщают абсолютные координаты и не могут быть дифференцированы от тачпадов. В этом случае укажите abs, чтобы указать, что устройство использует абсолютные события. |
Клавиатура
Обработчик клавиатуры evdev поддерживает следующие дополнительные параметры:
| Параметр | Описание |
|---|---|
/dev/input/... |
Указывает имя устройства ввода. Если не указано, Qt ищет подходящее устройство либо через libudev, либо, перебирая доступные узлы. |
grab |
Включает захват устройства ввода. |
keymap |
Указывает имя файла пользовательской карты клавиатуры. |
enable-compose |
Включает композитинг. |
repeat-delay |
Устанавливает пользовательскую задержку повторения клавиш. |
repeat-rate |
Устанавливает пользовательскую скорость повторения клавиш. |
На встроенных системах Linux, где сеансы терминала не отключены, поведение при нажатии клавиши может быть запутанным, так как событие ввода обрабатывается приложением Qt и tty. Чтобы преодолеть это, доступны следующие варианты:
- При запуске приложения
EGLFSиLinuxFBпытаются отключить клавиатуру терминала, установив режим клавиатуры tty вK_OFF. Это предотвращает отправку нажатий клавиш на терминал. Если требуется стандартное поведение, установите переменную средыQT_QPA_ENABLE_TERMINAL_KEYBOARDв значение1. Обратите внимание, что это работает только при запуске приложения из удаленной консоли, например, черезssh, и ввод с клавиатуры терминала остается включенным. - Альтернативный подход — использовать параметр
evdevобработчика клавиатурыgrab, передавgrab=1вQT_QPA_EVDEV_KEYBOARD_PARAMETERS. Это приводит к попытке захвата устройства ввода. Если захватgrabуспешен, никакие другие компоненты системы не получают события от него, пока приложение Qt работает. Этот подход более подходит для приложений, запускаемых удаленно, так как он не требует доступа к устройству tty. - Наконец, для многих специализированных образов Embedded Linux нет смысла вообще включать стандартные сеансы терминала. Для получения подробной информации о том, как отключить эти сеансы терминала, обратитесь к документации вашей среды разработки. Например, при создании образов с помощью Yocto Project, сброс переменной
SYSVINIT_ENABLED_GETTYSприводит к отсутствию процессаgetty. Это означает, что нет ввода с клавиатуры ни в одном из виртуальных терминалов.
Если стандартная встроенная карта клавиш недостаточна, вы можете указать другую через параметр keymap.
Примечание: Специальные системные комбинации клавиш, такие как переключение консолей (Ctrl+Alt+Fx) или сброс (Ctrl+Alt+Backspace), в настоящее время не поддерживаются и игнорируются.
Для создания пользовательской карты клавиш используйте утилиту kmap2qmap, которая находится в модуле qttools. Исходные файлы должны быть в стандартном формате Linux kmap, который понимает команда ядра loadkeys. Файлы qmap могут быть сгенерированы следующими способами:
- Проект Linux Console Tools (LCT).
-
Карты клавиш X11 X.org можно преобразовать в формат
kmapс помощью утилитыckbcomp. - Поскольку файлы
kmap— это обычные текстовые файлы, их также можно создавать вручную.
kmap2qmap — это программа командной строки, которой требуется как минимум 2 файла в качестве параметров. Последний параметр — сгенерированный файл .qmap, а все остальные обрабатываются как входные файлы .kmap. Например:
kmap2qmap i386/qwertz/de-latin1-nodeadkeys.kmap include/compose.latin1.inc de-latin1-nodeadkeys.qmap
Примечание: kmap2qmap не поддерживает все (псевдо)символы, которые поддерживает ядро Linux. Поэтому при преобразовании стандартной карты клавиш будет множество предупреждений о Show_Registers, Hex_A и т. д.; эти сообщения можно игнорировать.
Касание
Хотя это не обязательно для современных сенсорных экранов, некоторые резистивные сенсорные экраны с одноточечным касанием могут потребовать возврата к использованию tslib вместо использования протокола многоточечного касания Linux и устройств событий.
Для включения поддержки tslib, установите переменную среды QT_QPA_EGLFS_TSLIB (для eglfs) или QT_QPA_FB_TSLIB (для linuxfb) в 1. Для изменения устройства, установите переменную среды TSLIB_TSDEVICE или передайте имя устройства в командной строке. Обратите внимание, что обработчик ввода tslib генерирует события мыши и поддерживает только одно касание в отличие от evdevtouch, который также генерирует истинные многоточечные события QTouchEvent.
Обработчик касания evdev поддерживает следующие дополнительные параметры:
| Параметр | Описание |
|---|---|
/dev/input/... |
Указывает имя устройства ввода. Если не указано, Qt ищет подходящее устройство либо через libudev, либо, перебирая доступные узлы. |
rotate |
На некоторых сенсорных экранах координаты необходимо повернуть, установив rotate в 90, 180 или 270. |
invertx и inverty
|
Указывает параметры для инвертирования координат X или Y в событиях ввода. |
Например, если вы передадите следующие значения в QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS перед запуском приложений, у вас будет явно указанное устройство касания с инвертированными координатами. Это полезно, когда ориентация фактического экрана и сенсорного экрана не совпадает.
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event5:rotate=180
Планшеты с ручкой
Плагин evdevtablet обеспечивает базовую поддержку планшетов с ручкой Wacom и аналогичных устройств. Он генерирует только события QTabletEvent. Чтобы включить его, передайте QT_QPA_GENERIC_PLUGINS=evdevtablet в переменную среды или, как альтернативу, передайте аргумент -plugin evdevtablet в командной строке.
Плагин может принять параметр узла устройства, например QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1, если автоматическое обнаружение устройства Qt (основанное либо на libudev, либо на переборе /dev/input/event*) не работает или работает неправильно.
Отладка устройств ввода
Можно вывести некоторую информацию в вывод отладки, включив правило регистрации qt.qpa.input, например, установив переменную среды QT_LOGGING_RULES в значение qt.qpa.input=true. Это полезно для определения используемого устройства или для устранения неполадок при обнаружении устройств.
Использование пользовательских изображений курсора мыши
eglfs поставляется со своим набором изображений курсора мыши размером 32x32. Если их недостаточно, вы можете предоставить собственный атлас курсоров, установив переменную среды QT_QPA_EGLFS_CURSOR в имя файла JSON. Этот файл также может быть встроен в приложение через Систему ресурсов Qt.
Например, встроенный атлас курсоров с 8 изображениями курсоров в строке может быть задан следующим образом:
{
"image": ":/cursor-atlas.png",
"cursorsPerRow": 8,
"hotSpots": [
[7, 2],
[12, 3],
[12, 12],
...
]
} Обратите внимание, что изображения должны быть плотно упакованы в атласе; ширина и высота курсоров определяются на основе общего размера изображения и значения cursorsPerRow. Атласы также должны предоставлять изображение для всех поддерживаемых курсоров.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/inputs-linux-device.html