キーボードとアプリケーションの間に位置し、すべてのキープッシュをキャプチャし、独自のキープッシュ信号をエクスポートするコンポーネントを構築する方法です。放射された信号がキャプチャされた信号と必ずしも一致する必要はありません。最終的に私はibusに似た入力方法を作成しようとしています(ibusが技術的にどのように機能するかについての情報も得たいと思います)。
読んだ後この問題、キャプチャするのに適した位置は、キーコードやキーシンボルを生成した後だと思います。私はまた、Xがクライアントが私が望むものに関連するすべてのキーボードイベントを取得できるようにすることを理解しています。
答え1
基本的には2つの方法があります。
1) カーネルレベルでキー押下を生成した /dev/input デバイスを見つけて開き、 "grab" -ioctl (evtest --grab
タスクと同じ) を実行します。これにより、対応する入力デバイスは主要なイベントをアプリケーションにのみ送信します。その後、/dev/uinput
キーイベントを送信できるアプリケーションで独自の入力デバイスを作成するために使用されます。 Xは自動的にデバイスに接続されます。
2)Xレベルでは、ウィンドウマネージャのようにキーイベントを傍受し、独自のイベントを送信しますXSendEvent
。キャッチするのが最善のアプローチであるかどうかはわかりません。キャッチは、一部のアプリケーションが特定の対話中に一時的にすべてのイベントを傍受したい状況についてです。
私はibusが何をしているのかわかりません(3番目の方法かもしれません)、まだ詳しく見ていません。
編集する
長すぎるため、すべてのX詳細を読み取ることができないため、このアイテムを参照する必要があります。
2つの基本的なキャッチ機能があります。XGrabKeyboard
、FocusIn、およびFocusOutイベントを生成し、キーボードのフルコントロール(アクティブキャッチ)を提供します。上記のXクロールについて話したときに言及した機能であり、この機能は一時的にのみ有効にする必要があります。
また、XGrabKey
特定のキーコードのパッシブインポートを登録します。ウィンドウマネージャのソースコードを少し見てみるとfvwm
、ウィンドウマネージャが使用する方法のようです。
ibus
これについての詳細は複雑なので、ウィンドウマネージャをプログラムする方法(またはソースコードまたはソースコードを読む方法)に関するドキュメントを詳しく見たい場合があります。