組み込み Linux デバイスでの入力

Embedded Linux デバイスでは、ウィンドウ・システムが存在しない場合、マウス、キーボード、およびタッチ入力は、evdev を介して直接読み込まれるか、libinputtslib などのヘルパー・ライブラリを使用します。ただし、この動作には、デバイス・ノード/dev/input/event* がユーザーによって読み取り可能であることが必要です。eglfslinuxfb には、すべての入力処理コードがコンパイルされています。

libinputの使用

libinputは入力デバイスを扱うためのライブラリで、Qt 自身のevdev 入力サポートに代わるものを提供します。libinput を使用できるようにするには、Qt の設定とビルドの際に、libudevlibinput の開発ファイルが利用可能であることを確認してください。キーボードのサポートが必要な場合は、xkbcommon も必要です。eglfslinuxfb では、これらのプラグインはデフォルトでlibinput を使用するため、これ以上の操作は必要ありません。libinput のサポートが利用できない場合や、QT_QPA_EGLFS_NO_LIBINPUT 環境変数が設定されている場合は、Qt 自身のevdev ハンドラが代わりに使用されます。

libinput を使わない eglfs と linuxfb での入力

デバイス・ノード名のようなパラメータは、QT_QPA_EVDEV_MOUSE_PARAMETERSQT_QPA_EVDEV_KEYBOARD_PARAMETERSQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS 環境変数で設定できます。エントリーはコロンで区切ってください。これらのパラメータは、-plugin のコマンドライン引数で設定を渡す代わりに使用でき、バックエンドによっては必須です。しかし、eglfslinuxfb は組み込みの入力ハンドラを使用するので、-plugin 引数を別に使用することはありません。

さらに、QT_QPA_EGLFS_DISABLE_INPUTeglfs の場合)またはQT_QPA_FB_DISABLE_INPUTlinuxfb の場合)を1 に設定することで、組み込みの入力ハンドラを無効にすることができます。

マウス

QT_QPA_EGLFS_HIDECURSOR (eglfs の場合) またはQT_QPA_FB_HIDECURSOR (linuxfb の場合) が設定されておらず、Qt の libudev ベースのデバイスディスカバリが、少なくとも 1 つのマウスが利用可能であると報告している場合は、マウスカーソルが表示されます。libudev がサポートされていない場合、マウスカーソルは常に表示されます。

Qt がlibudev をサポートするように設定されている場合、アプリケーションの実行中に入力デバイスを接続または切断すること(ホットプラグ)がサポートされます。その場合、libudev の開発ヘッダが configure 時に 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 によって処理されるため、キーを押したときの動作が混乱することがあります。この問題を解決するために、以下のオプションが用意されています:

  • アプリケーションの起動時に、EGLFSLinuxFB は、tty のキーボードモードをK_OFF に設定することで、端末のキーボードを無効にしようとします。 これにより、キー入力が端末に送信されなくなります。標準的な動作が必要な場合は、QT_QPA_ENABLE_TERMINAL_KEYBOARD 環境変数を1 に設定してください。これは、例えばssh 経由でアプリケーションがリモート・コンソールから起動され、端末のキーボード入力が有効なまま の場合にのみ機能することに注意してください。
  • 別の方法として、QT_QPA_EVDEV_KEYBOARD_PARAMETERSgrab=1 を渡して、evdev キーボードハンドラのgrab パラメータを使用する方法があります。この結果、入力デバイスのグラブを取得しようとする。grab が成功した場合、Qt アプリケーションが動作している限り、システム内の他のコンポーネントはそのイベントを受け取りません。この方法は、ttyデバイスにアクセスする必要がないため、リモートで起動するアプリケーションに適しています。
  • 最後に、多くの特殊な Embedded Linux イメージでは、そもそも標準のターミナルセッションを有効にする意味がありません。これらのターミナルセッションを無効にする方法の詳細については、ビルド環境のドキュメントを参照してください。たとえば、Yocto Projectを使ってイメージを生成する場合、SYSVINIT_ENABLED_GETTYS をオフにすると、getty プロセスが実行されなくなります。つまり、どの仮想ターミナルにも入力がありません。

デフォルトの組み込みキーマップでは不十分な場合は、keymap パラメーターで別のキーマップを指定できます。

注意: コンソール・スイッチング(Ctrl+Alt+Fx )やザップ(Ctrl+Alt+Backspace )などの特殊なシステム・キーの組み合わせは現在サポートされておらず、無視されます。

カスタム・キーマップを生成するには、qttools モジュールにあるkmap2qmap ユーティリティを使用します。ソースファイルは、カーネルのloadkeys コマンドが理解できる標準 Linuxkmap フォーマットでなければなりません。qmap ファイルは、以下のいずれかの方法で生成できます:

  • Linux Console Tools (LCT)プロジェクト。
  • X.orgX11キーマップはckbcomp ユーティリティでkmap フォーマットに変換できます。
  • kmap ファイルはプレーンテキストファイルなので、手作業で作成することもできます。

kmap2qmap はコマンドライン・プログラムで、少なくとも2つのファイルをパラメータとして必要とします。最後のパラメータは生成された ファイルで、それ以外は入力 ファイルとして解析されます。例えば.qmap .kmap

kmap2qmap i386/qwertz/de-latin1-nodeadkeys.kmap include/compose.latin1.inc de-latin1-nodeadkeys.qmap

注: kmap2qmap は、Linuxカーネルがサポートするすべての(擬似)シンボルをサポートしているわけではない。その結果、標準キーマップを変換するときに、Show_RegistersHex_A などに関する警告が表示されます。これらのメッセージは無視してかまいません。

タッチ

最近のタッチスクリーンでは必要ありませんが、シングルタッチしかサポートしていない古い抵抗タッチスクリーンでは、Linuxマルチタッチ・プロトコルとイベント・デバイスに依存する代わりに、tslib を使用する必要がある場合があります。

tslib サポートを有効にするには、QT_QPA_EGLFS_TSLIBeglfs の場合)またはQT_QPA_FB_TSLIBlinuxfb の場合)環境変数を 1 に設定します。デバイスを変更するには、TSLIB_TSDEVICE 環境変数を設定するか、コマンドラインでデバイス名を渡します。真のマルチタッチQTouchEvent イベントも生成するevdevtouch とは対照的に、tslib 入力ハンドラーはマウスイベントを生成し、シングルタッチのみをサポートすることに注意してください。

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 の自動デバイス検出(libudev または/dev/input/event* のトラバースに基づく)が機能していないか、誤動作している場合、QT_QPA_GENERIC_PLUGINS=evdevtablet:/dev/event1 のようなデバイス・ノード・パラメータを受け取ることができます。

入力デバイスのデバッグ

QT_LOGGING_RULES 環境変数をqt.qpa.input=true に設定するなどして、qt.qpa.input のロギングルールを有効にすることで、デバッグ出力にいくつかの情報を表示することができます。これは、どのデバイスが使用されているかを検出したり、デバイス検出の問題をトラブルシューティングしたりするのに便利です。

カスタム・マウス・カーソル画像の使用

eglfs には32x32サイズのマウスカーソル画像セットが付属しています。これらが不十分な場合、 環境変数にJSONファイル名を設定することで、カスタムカーソルアトラスを提供することができます。このファイルはQT_QPA_EGLFS_CURSOR Qt Resource Systemを介してアプリケーションに埋め込むこともできます。

例えば、行ごとに8つのカーソル画像を持つ埋め込みカーソルアトラスは、以下のように指定することができます:

{
  "image": ":/cursor-atlas.png",
  "cursorsPerRow": 8,
  "hotSpots": [
      [7, 2],
      [12, 3],
      [12, 12],
      ...
  ]
}

カーソルの幅と高さは、画像の合計サイズとcursorsPerRow の設定に基づいて決定されます。また、アトラスはサポートされる全てのカーソルに対して画像を提供しなければなりません。

©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。