Вводные данные на встроенном устройстве 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 |
Устанавливает пользовательскую скорость повторения клавиши. |
На системах Embedded Linux, где сеансы терминала не отключены, поведение при нажатии клавиши может быть запутанным, так как событие ввода обрабатывается приложением Qt и tty. Чтобы преодолеть это, доступны следующие варианты:
- При запуске приложения
EGLFSиLinuxFBпытаются отключить клавиатуру терминала, установив режим клавиатуры tty вK_OFF. Это предотвращает отправку нажатий клавиш в терминал. Если требуется стандартное поведение, установите переменную средыQT_QPA_ENABLE_TERMINAL_KEYBOARDв значение1. Обратите внимание, что это работает только при запуске приложения из удалённой консоли, например, черезssh, и ввод клавиатуры терминала остаётся включённым. - Альтернативный подход заключается в использовании параметра
grabобработчика клавиатурыevdevпутём передачи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.1/inputs-linux-device.html