Linuxに3つのUSBキーボードが接続されています。通常、いずれか1つに書き込む場合、文字は現在アクティブなアプリケーションに「移動」します。ターミナルまたは他のアプリに。
しかし、私はいくつかの Perlモジュール を使用して特定の/dev/input/eventX
デバイスを読み取ることにより、2つのキーボードからキーボードイベントを直接読み取っています。スクリプトがすべてのイベントを正しく読み取ってデコードしている間、入力されたキーもアクティブなアプリケーションに入ります。
質問は次のとおりです:特定のキーボードからアクティブなアプリケーションへのキーボードイベントのルーティングを停止することは可能ですか?例:特定のキーボードからの入力を通常のキーボード入力と見なすべきではないことをカーネルにいくらか伝えます。
[〜#〜]編集[〜#〜]
X11
は、/dev/input/event*
にデバイスノードがあるすべてのデバイスから読み取るため、次の2つの解決策が考えられます。
eventN
ではなく別の名前に変更します(例:/dev/input/myinput0
)。残念ながら、udev
ルールではデバイスの名前を変更できません。 (rules.d
のNAME
ディレクティブは、ネットワークデバイスに対してのみ機能します。他のデバイスは、シンボリックリンクのみを作成できます)X11
の/usr/share/X11/xorg.conf.d/10-evdev.conf
構成を多少変更して、特定の「キーボードのような」デバイスを無視します。すべてのeventN
デバイスを読み取らないでください。現在私のシステムには次のものが含まれています。Section "InputClass"
Identifier "evdev keyboard catchall"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
ANY IDEA上記のいずれかを行う方法は?
本当の背景:2つのUSB-RFIDリーダーを接続しました。それらはキーボードとして機能します。 RFIDタグでリーダーに触れると、キーボードで入力したとおりにRFID番号が送信されます。たとえば、リーダーは通常のキーボードとして機能します。私のアプリケーションは(バックグラウンドで)RFIDイベントを読み取ることができ、(もちろん)RFIDからアクティブウィンドウに文字を取得したくありません。
とにかく/dev/input/eventX
から読んでいる場合は、EVIOCGRAB
ioctlを実行してください。 Perl でioctlを簡単に発行できます。プログラムが終了したら、グラブを解放することを忘れないでください。
グラブは、Xを含む他のすべてのデバイスがこのデバイスからイベントを読み取るのを防ぎます。
これはxinput
よりもクリーンです。これは、デバイスから直接読み取りたい可能性のある他のアプリケーションも除外し、除外の期間を制御できるためです(アプリケーションが実行されている限り)。
xinput
コマンドを使用して、Xの下の入力デバイスを無効にすることができます。実行xinput list
使用可能なデバイスを一覧表示してから、xinput disable …
名前または番号でデバイスを無効にします。
Udevはおそらく進むべき道ですが、X11は私が頭の中で知っている方法です。