Spec-Zone.ru › Qt 6.0

Вводные устройства на устройстве с встраиваемой Linux-системой

На вашем устройстве с встраиваемой Linux-системой, при отсутствии оконной системы, ввод с мыши, клавиатуры и сенсорного экрана считывается напрямую через evdev или с помощью вспомогательных библиотек, таких как libinput или tslib. Однако, для этого требуется, чтобы узлы устройств /dev/input/event* были доступны для чтения пользователем. eglfs и linuxfb содержат весь код обработки ввода, скомпилированный в них.

Использование libinput

libinput — это библиотека для обработки вводных устройств, предлагающая альтернативу собственному механизму обработки ввода Qt. Чтобы использовать libinput, при конфигурировании и сборке Qt, убедитесь, что доступны файлы разработки для libudev и libinput. Если вам требуется поддержка клавиатуры, то также необходим xkbcommon. С eglfs и linuxfb, дополнительных действий не требуется, так как эти плагины по умолчанию используют libinput. Если поддержка libinput недоступна или переменная среды QT_QPA_EGLFS_NO_LIBINPUT установлена, то вместо этого используются собственные обработчики ввода Qt.

Ввод на 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) не установлены и основанное на libudev обнаружение устройств Qt сообщает о наличии как минимум одной мыши. При отсутствии поддержки 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, и ввод с клавиатуры терминала остаётся включённым.
  • Альтернативный подход — использовать параметр grab обработчика клавиатуры evdev, передавая grab=1 в QT_QPA_EVDEV_KEYBOARD_PARAMETERS. Это приводит к попытке захвата вводного устройства. Если захват grab удаётся, другие компоненты системы не получают события от него, пока запущено приложение Qt. Этот подход более подходит для приложений, запускаемых удалённо, так как он не требует доступа к устройству tty.
  • Наконец, для многих специализированных образов встраиваемой Linux-системы нет смысла в стандартных сессиях терминала. Подробнее о том, как отключить эти сессии терминала, см. в документации вашей среды сборки. Например, при создании образов с помощью Yocto Project, снятие флага SYSVINIT_ENABLED_GETTYS приводит к отсутствию процесса getty. Это означает, что ввода с виртуальных терминалов нет.

Если стандартная встроенная раскладка клавиатуры недостаточна, вы можете указать другую, либо через параметр keymap, либо через функцию eglfs-специфического loadKeymap(). Последнее позволяет переключать раскладку во время выполнения. Однако это поведение требует использования встроенного обработчика клавиатуры eglfs; оно не поддерживается, когда обработчик клавиатуры загружается через параметр командной строки -plugin.

Примечание: Специальные системные комбинации клавиш, такие как переключение консолей (Ctrl+Alt+Fx) или очистка (Ctrl+Alt+Backspace), в настоящее время не поддерживаются и игнорируются.

Для создания пользовательской раскладки клавиатуры используйте утилиту kmap2qmap, которая находится в модуле qttools. Исходные файлы должны быть в стандартном формате Linux kmap, который понимается командой ядра loadkeys . Файлы qmap могут быть сгенерированы следующими способами:

  • Проект Linux Console Tools (LCT).
  • X.org X11 карты клавиш могут быть преобразованы в формат 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 multi-touch и устройства событий.

Чтобы включить поддержку 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.0/inputs-linux-device.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API