web-dev-qa-db-ja.com

Linuxでマウスイベントはどのように機能しますか?

これはたいてい好奇心が足りないので、イベント処理が低レベルでどのように機能するかを理解しようとしているので、それを実行するソフトウェアを紹介しないでください。

たとえば、マウスのクリックに反応するプログラムをC/C++で記述したい場合は、システムコールを使用して一部の関数をカーネルにフックする必要があるか、または常にマウスのステータスを常に確認する必要があると仮定します。知りません。

C/C++ではほとんどすべてのことが可能であるため、それが可能であると思います。低レベルであるため、おそらく自分で実装する必要はないかもしれませんが、それがどのように機能するかに関心があります。

問題は、それがLinuxでどのように機能するか、特定のシステムコール、Cライブラリなどがあるかどうかです。

25
fiftyeight

Linuxでマウスを使用する実際のプログラムを作成している場合は、Xアプリケーションを作成している可能性が高く、その場合はXサーバーにマウスイベントを要求する必要があります。 Qt[〜#〜] gtk [〜#〜] 、および libsdl は、マウス、キーボードにアクセスするための関数を提供する一般的なCライブラリです、グラフィックス、タイマー、およびGUIプログラムの作成に必要なその他の機能。 Ncurses は、ターミナルアプリケーション用の同様のライブラリです。

しかし、システムを探索している場合、または何らかの理由でXを使用できない場合は、カーネルインターフェイスでの動作を次に示します。

UNIXの哲学の中核となる考え方は、「すべてがファイルである」ということです。より具体的には、ファイルの操作に使用するのと同じシステムコールを介して、できるだけ多くのものにアクセスできる必要があります。したがって、マウスへのカーネルインターフェイスはデバイスファイルです。あなたはそれをopen()し、オプションでpoll()またはselect()を呼び出して着信データがあるかどうかを確認し、read()を呼び出してデータを読み取ります。

USB以前の時代には、特定のデバイスファイルは多くの場合、シリアルポートでした。 /dev/ttyS0、またはPS/2ポート、/dev/psaux。マウスに組み込まれているハードウェアプロトコルを使用して、マウスと話しました。最近、/dev/input/*サブシステムは、多くの異なる入力デバイスを処理する、デバイスに依存しない統一された方法を提供するため、推奨されます。特に、 /dev/input/miceは、システムに接続されている任意のマウスからのイベントを提供し、/dev/input/mouseNは、特定のマウスからのイベントを提供します。最近のほとんどのLinuxディストリビューションでは、これらのファイルはマウスを接続すると動的に作成されます。

マウスデバイスファイルの読み取りまたは書き込みの詳細については、カーネルのドキュメントで input/input.txt から始めることができます。特にセクション3.2.2(mousedev)と3.2.4(evdev)、およびセクション4と5をご覧ください。

28
Jander

一般に、ハードウェアデバイスからの情報は デバイスファイル を介してアプリケーションに公開されます。マウスの場合、最新のLinuxシステムでは、デバイスは/dev/mice(このデバイスは、接続されているすべてのマウスからイベントを収集します。個々のマウスに対応するデバイスもあります)。

マウスを動かしたりクリックしたりすると、マウスがコンピューターに電気信号を送信し、 割り込み を発生させます。 割り込みハンドラ と呼ばれるLinuxカーネルのコードが、イベントデータ(たとえば、どのボタンが押されたか)を読み取り、カーネル内の一連の通知をトリガーします。

このデバイスに対応するデバイスファイルから読み取るアプリケーションがある場合、そのアプリケーションは入力が待機中であることを通知されます。たとえば、アプリケーションが readシステムコール でブロックされている場合、システムコールが返されます。

典型的なシステムでは、マウスイベントを読み取るプロセスが1つあります。それは X Windowサーバー です。このプログラムは、グラフィック表示と入力周辺機器を管理します。個々のグラフィカルアプリケーションには、一般的なXイベントプロトコルを介してマウスイベントが通知されます。このプロトコルには、キーの押下、ウィンドウフォーカスの変更、ウィンドウの可視性の変更など、他のイベントタイプが含まれます。