web-dev-qa-db-ja.com

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

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

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

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

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

XT、AT、PS/2、またはUSBのいずれであっても、生のキーボードコードは、キーボード上の物理的な場所を表します。 XTキーボードは、キーを押したり離したりしたときに1つの8ビット番号のみを送信します。米国/英国の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 は、そのマッピングを制御するための標準ツールです。キーボードマッピングの動作の多くは構成可能ですが、X11にハードコードされているNum Lock、Mode Switch、Caps Lock/ShiftLockなどの特殊なケースがいくつかあります。 Shiftのような他の側面は実際に構成可能です。 ModeSwitchやNumLockとは異なり、どのキーもシフトとして機能するようにマッピングできます。

KEYCODEは、オペレーティングシステムのカーネルによって送信される物理キーを表します。すべてのKEYCODEは、8つの可能なKEYSYMにマップできます。 4つだけが使用され、レベル1〜4と呼ばれることもあります。レベル1は、アクティブな修飾子がない場合に出力されるKEYSYMを指定します。これらは多くの場合、小文字と数字です。モディファイアは、モディファイアがアクティブ(押されているかオンになっている)のときに他のKEYCODEによって生成されるKEYSYMを変更するKEYCODEです。モディファイアのキーコードもXmodmapを介して制御されます。レベル2は、シフト修飾子が押されたときに送信されるKEYSYMを指定します。レベル3は、モードスイッチKEYSYMが押され​​るたびにアクティブになります。レベル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がテキストに変換される方法や同じである構成方法には影響しません。 XKBを無効にして、Xmodmapの動作を復元できます。 Xmodmapをサポートする互換性レイヤーもありますが、完全に互換性がないため、問題が発生する可能性があります。 XKBルールは/usr/share/X11/xkb/の下にあり、はるかに洗練されています。 KEYCODEをKEYSYMにマッピングするためのキーボードレイアウトを生成する方法については、他にもいくつかの優れたドキュメントがあります。

Linuxコンソールに関しては、/usr/share/keymapsに格納され、loadkeysコマンドでロードされる独自のキーボードレイアウトがあります。 BIOSおよびGRUB2を含む初期のブートローダー段階では、キーボードマッピングは、BIOSがキーをマッピングすることを決定した番号に関係ありません。

25
penguin359