キーボードレイアウトとxmodmapの関係


12

Xubuntuを使用しています。ログインする前に、キーボードレイアウトを選択できます。xmodmapいくつかのキーの再マッピングに使用しています。

私は2つのことに興味があります。

  1. キーボードマッピングの状態がどのように変化するか(a)ラップトップの電源を入れたとき、(b)ブートプロセス中、(c)システムへのログイン(これらの3つのフェーズで)、およびシステムでの作業中(ログイン)。
  2. 個々のフェーズで画面に表示される(および送信される制御キー)シンボルの原因は何ですか。キーを押すと、キーボードドライバー(?)に信号が送信され、表示されるシンボルを決定する決定プロセス(アプリケーションおよび構成ファイル)が必要になります。この質問に対する答えは、アプリケーションとそれらの構成ファイルへのパスのリストです(特にUbuntu(Debianベースのシステム)に興味がありますが、他のシステムについて説明することもできますが、Ubuntuをお勧めします)。

回答:


24

ここには、KEYCODEからKEYSYMへのマッピングとKEYSYMからテキストへのマッピングの2つのレイヤーがあります。ATキーボードスキャンコードをXTスタイルのKEYCODEにマッピングするか、USBキーボードHIDコードをKEYCODEにマッピングする必要があるカーネルをカウントする場合、より多くのレイヤーがあります。KEYCODEは、オペレーティングシステムのカーネルがX11サーバーに渡す8ビットの符号なし整数です。LinuxやSolarisなどのオペレーティングシステムによって異なる場合があります。Linuxでは、これらのKEYCODEは通常、古いXT PCキーボードで使用されている番号と同じです。AT、PS / 2、またはUSBキーボードを備えた新しいコンピューターでは、通常、これらのキーボードを古いXTコードにマッピングするだけで、キーを簡単に使用できます。

生のキーボードコードは、XT、AT、PS / 2、USBのいずれであっても、キーボード上の物理的な場所を表します。XTキーボードは、キーを押したり放したりするときに、単一の8ビット数のみを送信します。US / British XTキーボードのqキーは数値16を送信します。フランス語キーボードでは、同じ物理キーにaというラベルが付けられますが、16を送信します。オペレーティングシステムの上位層が実際の意味を割り当てます。キーがXTキーボードでリリースされると、同じキーコードに128が加えられて送信されます。この例では、qが押されると16が送信されますが、リリースされると、142(16 + 128)が送信されます。ATキーボードは一連の数字であるスキャンコードを使用し、かなり長くなる可能性があります。キーリリースでは、追加のコードが追加されます。たとえば、一時停止のスキャンコードはE1、1D、45、E1、9D、C5です。DOS、Windows、Linux、FreeBSDなどのほとんどのオペレーティングシステム、BIOSはすべて、スキャンコードをはるかに単純なXTスタイルのスキャンコードにマッピングします。また、HIDコードを送信するUSB​​キーボードなど、さまざまなコードを使用する新しいキーボードのサポートも容易になります。すべてのコードは、X11またはアプリケーションが認識する前に、オペレーティングシステムによって同じ一貫したコードセットにマッピングされます。

X11はプロセスのこの部分を無視します。カーネルからKEYCODEを取得し、独自のマッピングを適用して、そのKEYCODEをKEYSYMに変換します。 Xmodmapは、そのマッピングを制御するための標準ツールです。キーボードマッピングの動作の多くは構成可能ですが、Num Lock、Mode Switch、Caps Lock / Shift Lockなど、X11にハードコーディングされた特殊なケースがいくつかあります。Shiftなどの他の側面は、実際に構成可能です。モードスイッチやNum Lockとは異なり、任意のキーをシフトとして機能するようにマッピングできます。

KEYCODEは、オペレーティングシステムのカーネルによって送信される物理キーを表します。すべてのKEYCODEは、8つの可能なKEYSYMにマップできます。使用されるのは4つだけで、レベル1〜4と呼ばれることもあります。レベル1は、アクティブな修飾子がないときに印刷されるKEYSYMを指定します。多くの場合、これらは小文字と数字です。モディファイヤは、モディファイヤがアクティブである(押されているか、オンに切り替えられている)ときに、他のKEYCODEによって生成されたKEYSYMを変更するKEYCODEです。モディファイヤキーコードもXmodmapによって制御されます。レベル2は、シフト修飾子が押されたときに送信されるKEYSYMを指定します。モードスイッチKEYSYMを押すと、レベル3がアクティブになります。レベル4は、シフトキーとモードスイッチの両方がアクティブなときにアクティブになります。

KEYSYMが生成されると、これは直接解釈されますが、ほとんどの場合、テキストに変換されます。すべてのKEYSYMがテキストに変わるわけではなく、将来のKEYSYMにのみ影響を与える可能性があります。1つの例は、もちろんShift_Lです。これにはテキスト表現がありませんが、別の文字を作成するために使用されるKEYSYMもいくつかあります。私のシステム上のそれらのリストは以下にあり/usr/share/X11/locale/en_US.UTF-8/Composeます。そのような例の1つにdead_acute KEYSYMがあります。これを押すと、次のKEYSYMが鋭角アクセント付き文字に変換されます。KEYSYMをUnicodeに変換するための標準マッピングがあります。

これがすべて言われたので、Xmodmapは廃止され、はるかに洗練されたXKBに置き換えられていることに注意してください。これは、KEYCODEがKEYSYMにマップされる方法に影響しますが、カーネルがKEYCODEを生成する方法や、KEYSYMがテキストに変換される方法や、同じままの構成方法には影響しません。Xmodmapの動作を復元してXKBを無効にすることができます。Xmodmapをサポートするための互換性レイヤーもありますが、完全には互換性がないため問題が発生する可能性があります。XKBの規則は下に/usr/share/X11/xkb/あり、はるかに洗練されています。KEYCODEをKEYSYMにマッピングするためのキーボードレイアウトの生成方法については、他にもいくつかの優れたドキュメントがあります。

Linuxコンソールに関しては/usr/share/keymapsloadkeysコマンドに格納されて読み込まれる独自のキーボードレイアウトがあります。BIOSおよびGRUB2を含む初期のブートローダーステージでは、キーボードマッピングは、BIOSがキーをマップすることを決定した番号になります。


素晴らしい説明と新しい情報をありがとう。キーボードを決定するブートプロセス(upstartまたはinitscript)で起動されるアプリケーションと、レイアウトを選択できる段階でログイン時に何が起こるかを知っていますか。どのプログラムがそれと対話し、ファイルシステムのどこに保存されますか?ログイン後、xmodmapまたはxkbはログインプロセスで選択されたデフォルトレイアウトを上書きしますか?
xralf

カーネルキーマップは、前述のとおり、loadkeysinitスクリプトの1つによって読み込まれます。grep loadkeys /etc/init.d/*ファイルを公開しますkeymap.sh。X11には独自のキーマッピングがあり、これは従来、Xsession起動スクリプトの1つから実行されるXmodmapによってロードされていました。現在、Xmodmapの代わりにXKBが使用されているため、デフォルトのキーマッピングはXorg.confでさまざまなXkbオプションまたはHALを介して設定されます。GnomeまたはKDE Displayマネージャーのいずれかが読み込まれると、setxkbmapコマンドを使用して独自のレイアウトを読み込むことができます。ユーザーのデスクトップ環境は、ログイン時に異なるレイアウトを設定する場合もあります。
ペンギン359

私は、コマンドを試してみましたgrep loadkeys /etc/init.d/*し、locate keymap.shそして何も見つかりませんでした。ファイルXorg.confも見つかりませんでした。Ubuntuのバージョン10.04に依存していますか?
xralf

ウィンドウはどのようなイベントを受け取りますか?KEYSYMを使用してイベントを実行し、次にアプリケーションがKEYSYMをテキストに変換する方法は何ですか?Xorgは、KEYSYMをテキストに変換するアプリ用のIPC / RPCインターフェイスを提供しますか?または、アプリはそれ自体を純粋に行う必要がありますか?
炸鱼薯条德里克18
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.