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


18

を使用してスキャンコードのキーコードへのマッピングを変更する方法を考え出した後udevこの質問を参照して、これらのキーコード(またはイベント)が適切なアクションにどのようにマッピングされるのか疑問に思いました。

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

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

編集:私が言及するキーコードxevは、キーコードの戻り値と混同されるべきではありませんが、私もそれらに興味があります;)


3
私は同意しません。たとえば、通知はUbuntuに非常に固有のものなので、通知がどのように送信されたを知りたいです。私の推測では、どこかでスクリプトを呼び出す必要があるので、それらのスクリプトがどこにあるかを知りたいと思います。
ゲルハルトバーガー

2
これは、Ubuntuがこれを処理する方法がIIRCの年に変わったため、有効なUbuntu固有の質問です。適切なアクションをトリガーするホットキーを押すイベントで、Ubuntuでのイベントのシーケンスを知ることは非常に興味深いです。考えられる目的:カスタムの明るさコントロール、ホットキーの問題のデバッグなど
gertvdijk

2
@Sethは時代遅れのようです。HALは10.04以降、かなり前に廃止されました。また、デスクトップ通知がトリガーされる方法に関する情報も不足しています。
gertvdijk

1
今日私はwiki.ubuntu.com/Hotkeys/Troubleshootingに出会いました。これはいくつかの素晴らしいポインターを提供します(wiki.ubuntu.com/Hotkeys/Architectureへのリンクは非常に有益です)。スティーブンオステルミラーの答えは正しい方向にあると思いますが、それらのスクリプトを見つけて変更できるようにしたいです。)
ゲルハルトバーガー

1
^^この情報は、こちらのgnome-設定デーモンの下にはキーバインド、古くなっているように見えるん... Compizのセクションの下の明るさのためのヒット曲の多く(私は団結のために推測している?)のに誰がどのように知っているnotify-osd作品?私は、明るさの通知が...送信をしていることだと思う
ゲルハルト・バーガー

回答:


6

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でこの問題が発生し、カスタムスクリプトを使用して音量を変更していました


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

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

特にこれ: ここに画像の説明を入力してください

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


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

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


これはどこかに来ているように見えます!最初からCWとしてマークされているので、まだ改善されていると思いますか?:)
gertvdijk

うん、もう少し調べる必要があります、図にはたくさんの疑問符があります。
マテオ

ちなみに、誤ってコミュニティWikiの回答にしたのですか?D:...まあ、少なくとも我々はどこかに取得している多分それを元に戻すMODを頼む...ああとHALが長い時間で廃止されましたので、これらのグラフは、少し古くなって可能性が最も高い
ゲルハルト・バーガー


@gertvdijk私は知っていますが、彼が見逃すことになるすべての賛成票にとっては残念です;)
ゲルハルトバーガー

1

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

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


次に、デスクトップ通知はどのようにトリガーされますか?
ゲルハルトバーガー

gnome設定デーモンは、たとえばボリュームと明るさの場合にそれらをトリガーする責任があると思います。
スティーブンオステルミラー

2
スクリプトを実行しましたが、システム設定>キーボード>ショートカットでアクセスできるショートカットを取得するだけで、たとえば明るさの参照は見つかりませんでした。
ゲルハルトバーガー

ショートカットキーを取得するためのクールなスクリプト。
マテオ

0

答えは、ドライバーに関するものです。

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

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

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

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

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

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

リンク:


3
ええと… 実際に、ドライバーがキーボードで押すキーの意味についての概念を持っているとは思いません。ノートブックの一部の特別なホットキーデバイスには、このためのドライバーが必要な場合がありますが、「ボリュームアップ」などの通常のマルチメディアホットキーは対象外です。これは、kernel / X / DEのより一般的な領域でカバーする必要があります。また、Linux kernerデバイスドライバーのプログラミングに関するリファレンスは非常に幅広いと思います。
gertvdijk

最近のほとんどのキーボードではUbuntuがevdevドライバーを使用していると思いますが、ここでそれがどのように役立つかわかりません...
Gerhard Burger
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.