web-dev-qa-db-ja.com

キーコードは適切なアクションにどのようにマッピングされますか?

udevを使用してスキャンコードのキーコードへのマッピングを変更する方法を考え出した後、 この質問 を参照してください。適切な行動。

したがって、たとえば、 volume up キーボードにスキャンコードが送信され、volumeupキーコードに変換されます。しかし、このキーコードはどのようにインターセプトされ、音量が上がり、適切な通知が表示されますか?

私の推測では、どこかでスクリプトを呼び出さなければならないので、それらのスクリプトがどこにあるかを知りたいと思います。

編集:私が言及するキーコードは、キーコードxevリターンと混同しないでくださいが、私もそれらに興味があります;)

18
Gerhard Burger

OK、これは https://help.ubuntu.com/community/MultimediaKeys で見つかりました

キーボードのキーを押すと、Linuxカーネルはそのキーのrawスキャンコードを生成します(割り当てられている場合)。各スキャンコードはキーコードにマッピングできます。これはカーネルレベルです。 Xには(準)完全に独立したキーマッピング方法があります。Xは起動時にカーネルキーコードテーブルを読み取り、キーコードをその独立したキーコードテーブルにマップします(カーネルキーコードと同じですが、:))。次に、各キーコードをキーシム、つまりキーを表すまたはアクションを提案する文字列にマッピングできます。したがって、キーを完全に機能させるには、カーネルスキャンコード/キーコードとXキーコード/キーシンボルが必要です。奇妙に思えるかもしれませんが、X開発者には、カーネルとは別個のキーボードマッピングを保持する理由があります。それはまったく難しいことではなく、非常に退屈な手順です。

それで、キーコードはキーシムにマッピングされます。キーシムはどこにありますか?私はこの質問から見つけて答えます: 最近、すべてのXキーシムのリストはどこにありますか? ボリュームキーについて話しているので、ソースのXF86keysym.hにあります-回答に記載されているコード。

コンピューター上のそのファイルで、ボリュームについて次のことがわかりました。

#define XF86XK_AudioLowerVolume 0x1008FF11   /* Volume control down        */
#define XF86XK_AudioMute    0x1008FF12   /* Mute sound from the system */
#define XF86XK_AudioRaiseVolume 0x1008FF13   /* Volume control up          */

奇妙な...他のものとは異なる値、おそらくキーを処理するための複数のシステムがありますか? http://crunchbang.org/forums/viewtopic.php?id=16656


Xubuntuを使用しています。キーを制御するには、アクションを手動でマッピングする必要があります(このように xubuntuでキーボードショートカットを変更するにはどうすればよいですか? )。ただし、通知はキーを押してそれに応じて動作するかのように独立しているように見えます。これは、Ubuntuの他のプログラムがこのように設定されているため、スクリプトをキーにマップする必要がないことを意味します。

だから、私はプログラムがキーを拾い上げていると確信している(だからスクリップが見つからない)。

Xubuntuでは、Pulse Audioでこの問題が発生し、ボリュームを変更するカスタムスクリプトを使用して、Pulseがミュートキーをインターセプトしているようでした ミュートキーはAlsaとPulseAudioをミュートしますが、Alsaのみミュートを解除します 興味深い回避策。


NotifyOSDについてこれを確認してください https://wiki.ubuntu.com/NotifyOSD#Volume_changes

これらの図を見れば: https://wiki.ubuntu.com/NotifyOSD#Architecture

特にこれは: enter image description here

DBusまたはHALからフォームを受け取る「ハードウェアキーリスナー」があることを示しています。次に、サウンドと輝度のアイコンがNotify-OSDのソースにある「システムから視覚要素を取得」し、そこからバブルを作成します。


これはすべて非常に紛らわしいですが、私が理解している限り(これまで):

生のスキャンコード(例:e016)>キーコード(例:160)> keysym(例:XF86AudioMute)> gnome-settings-daemon(例:ボリュームアップ)> DBusシグナル> notify-osdのハードウェアキーリスナー(またはその他)プログラムリスニング)

6
Mateo

ほとんどの場合、実行されるスクリプトはありません。これらにより、イベントがウィンドウマネージャまたは設定デーモンに送信されます。プロセスでスクリプトを作成しているのは、カスタムキーバインドを構成するときだけです。カスタムキーバインドの場合、コマンドライン(実行可能ファイルまたはスクリプト)を追加して、キーにバインドさせることができます。

Ubuntuでキーバインドをバックアップすることについての質問に書いたこの回答を参照してください: GNOMEキーボードショートカットはどこに保存されますか? カスタムキーバインドを含むすべてのキーバインドをバックアップまたは復元するスクリプトがあります。スクリプトを実行すると、dconfのキーバインディングが保存されている場所と、キーイベントについて通知されるアプリケーションを確認できます。

1

答えはDriversに関連しています。

オペレーティングシステムと対話するには、すべてのハードウェアにドライバーが必要です。

引用 http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/

ドライバーは、そのコマンドの下でエンティティの管理、制御、指示、監視を駆動します。バスドライバーがバスで行うこと、デバイスドライバーはマウス、キーボード、モニター、ハードディスク、Webカメラ、時計などのコンピューターデバイス(コンピューターに接続されたハードウェア)で行います。

さらに、「パイロット」は、人または人によって監視される自動システム(たとえば、旅客機の自動操縦システム)でさえあります。同様に、特定のハードウェアはソフトウェア(デバイスドライバー)によって制御されるか、別のハードウェアデバイスによって制御され、ソフトウェアデバイスドライバーによって管理されます。後者の場合、このような制御デバイスは一般にデバイスコントローラーと呼ばれます。これはデバイス自体であるため、多くの場合、バスドライバーと呼ばれるドライバーも必要です。

デバイスには、コントロール/ステータスビットとデータビットを格納するデバイスレジスタがあります。一部のデータを転送する必要がある場合は、通常、データビットを設定して送信します。

したがって、キーボードのキーを押すたびに、レジスタにデータが書き込まれます。これらのビットはデバイスドライバーによって読み取られ、適切なアクションが実行されます。これは簡単な説明です。

リンク:

0
green