組み込み Linux デバイスでの入力
Embedded 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
ハンドラが代わりに使用されます。
libinput を使わない eglfs と linuxfb での入力
デバイス・ノード名のようなパラメータは、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 ベースのデバイスディスカバリが、少なくとも 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 によって処理されるため、キーを押したときの動作が混乱することがあります。この問題を解決するために、以下のオプションが用意されています:
- アプリケーションの起動時に、
EGLFS
とLinuxFB
は、tty のキーボードモードをK_OFF
に設定することで、端末のキーボードを無効にしようとします。 これにより、キー入力が端末に送信されなくなります。標準的な動作が必要な場合は、QT_QPA_ENABLE_TERMINAL_KEYBOARD
環境変数を1
に設定してください。これは、例えばssh
経由でアプリケーションがリモート・コンソールから起動され、端末のキーボード入力が有効なまま の場合にのみ機能することに注意してください。 - 別の方法として、
QT_QPA_EVDEV_KEYBOARD_PARAMETERS
にgrab=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_Registers
やHex_A
などに関する警告が表示されます。これらのメッセージは無視してかまいません。
タッチ
最近のタッチスクリーンでは必要ありませんが、シングルタッチしかサポートしていない古い抵抗タッチスクリーンでは、Linuxマルチタッチ・プロトコルとイベント・デバイスに依存する代わりに、tslib
を使用する必要がある場合があります。
tslib
サポートを有効にするには、QT_QPA_EGLFS_TSLIB
(eglfs
の場合)またはQT_QPA_FB_TSLIB
(linuxfb
の場合)環境変数を 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.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。