カーネルモジュールでX11キーボード入力を傍受する

カーネルモジュールでX11キーボード入力を傍受する

読み取りシステム呼び出しをオーバーライドするカーネルモジュールを作成しています。キーボードのキーを交換したいです。スキャンコードをファイル記述子= 0に置き換えて、端末入力に対してこれを正常に実行しました。ただし、GUIアプリケーションはUbuntuでX11を使用し、キーボードを読み取るためにstdin入力を使​​用しません。キーストロークを傍受して置き換える方法今後X11サーバーに到達しましたか? X11は特定のファイル記述子を使用しますか?

答え1

Linux読み取り入力のXorg X11サーバーevdevデバイスが見つかりました/dev/input/event*。各read()呼び出しは少なくとも1つを返します。構造物入力イベント


イベントを置き換えるためにカスタムカーネルモジュールは必要ありません。ユーザースペースツールを使用してイベントを読み取り、必要に応じて変更し、カスタムevdevデバイスを作成できる既存の「uinput」モジュールに渡すことができます。 FUSE や CUSE など)) Xorg に生のデバイスを無視するよう指示します.これブロックツールキットはこれを行うことができます。

また、今日のほとんどのシステムでは、Xorgは以下を使用しています。ライブラリ入力キーボードとマウスのイベントを前処理するためのライブラリです。 (ほとんどのWaylandディスプレイサーバーもlibinputを排他的に使用します。)このライブラリを次のようにパッチすることができます。

最後に、単一のキー(またはスキャンコード)のみを再マッピングするには、次の手順を実行します。evdevサブシステムにはすでにサポートが組み込まれています。 Systemd-udevには、udevルールでキーマッピングのカスタムスキャンコードを定義できるヘルパーがすでに含まれています。このデータベース

実際にカーネルにパッチを適用するには、read() だけを使用せずに evdev 層で変換を実行することをお勧めします。 (結局、ファイル記述子0が必ずしもキーボードであるわけではありません。他のプログラムから転送されるデータを混乱させたくありません。)

関連情報