Xubuntuのキーボード設定をお勉強

個人的備忘録です。

Scancode

USB接続やBluetooth接続によるキーボードからの入力はHID(Human Interface Devices)の定義に則って送信されてくるケースがほとんどだと思われます。
Bluetoothの中でもBLE(Bluetooth Low Energy)接続の場合はHoGPプロファイルなどと呼ばれますが(HID over GATT Profile)ですので結局中身はHIDです。
例えば「sudo evtest /dev/input/event4」コマンド(4はテストする機器によって異なります)などと打って[A]キーを押すとスキャンコード「70004」と出てきますが、これは「HID Usage Table」の「Keyboard/Keypad Page」(これが先頭の0x07)の「UsageID」0x0004であることを示していて、「Usage Name」は「Keyboard a and A」つまり[A]キーと定義付けられたキーを押したよという情報がキーボードから送信されて来ているわけです。
クリックボタンなんかは「Button Page」0x09で左クリックいわゆる「Button1 (primary/trigger)」のUsageIDは0x0001ですので、左クリックのスキャンコードは「90001」と出て来ると思います。

Keycode(InputEventCode)

ScancodeからKeycodeへの変換がどこの情報を元にして行っているのか筆者はまだ分かっていませんが、定義は上記のようにはっきりしていますのでこれをLinuxで扱うKeycodeへと変換します。
[A]キーの場合はキーコード「30」(10進数)となります。
これは上記の「sudo evtest /dev/input/event4」コマンドを打ったときにもその機器で対応しているKeycodeの一覧が表示されるのですが、全体的な定義を見るのであれば「/usr/include/linux/input-event-codes.h」辺りを見ると良いかもしれません。
このinput-event-codes.hの定義を見ると「KEY_」で始まるKeycode以外にも「BTN_」で始まるクリックボタン等のコードも定義されていたりします。
ですので、キーボードからの入力をクリックボタンとして処理するように定義変更することもLinuxでは可能でして、それをしているのが前回の記事『キーコンフィグで入力環境のレベル底上げを目論む』なわけです。

xmodmapでのKeycode

筆者は理由が分からないのですが、キー入力に関する部分のKeycodeはそのまま処理されるのではなくて、なぜか+8オフセットされます。
「input-event-codes.h」で定義されているものと「xmodmap -pke」で出力される定義はほとんど似た並びになるのですが、一様にコードが8ずれています。
ですので、[A]キーのKeycodeも+8されて「38」(10進数)として処理されるようになります。

「xmodmap」での[A]キーの定義は「keycode 38 = a A a A」のようになっていて、複数の定義がスペース区切りで書かれています。
これは単独で打てば小文字の「a」として扱うが[Shift]キーを押しながらの場合は次の大文字の「A」として扱われるということを示しています。

キーボードのレイアウト変更

じゃあ、3つ目4つ目はなんだよ、という話なのですが、キーボードのレイアウトを変更できる場合に変更したときの定義が3番目、同じく[Shift]同時押しが4番目、ということになります。

例えば、日本語、英語という順番で2つのレイアウトを選択できるようにしているとき、「xmodmap -pke」がどうなるか一部抜粋しますと、

keycode  10 = 1 exclam 1 exclam
keycode  11 = 2 quotedbl 2 at
keycode  12 = 3 numbersign 3 numbersign
keycode  13 = 4 dollar 4 dollar
keycode  14 = 5 percent 5 percent
keycode  15 = 6 ampersand 6 asciicircum
keycode  16 = 7 apostrophe 7 ampersand
keycode  17 = 8 parenleft 8 asterisk
keycode  18 = 9 parenright 9 parenleft
keycode  19 = 0 asciitilde 0 parenright

これはキーボード最上段の数字キー[1234567890]の部分の定義ですが、2番目と4番目の値が違っていることにお気付きでしょうか?
例えば[2]キーは[Shift]キーを押していると["]quotedbl(クオート・ダブル)いわゆるダブルクォーテーションマークになるわけですが、4番目は英語配列で[Shift]キーを押したときに出る[@]atつまりアットマークになるわけです。

変更できるレイアウトを追加して増やすと、この定義の数は2個ずつどんどん増えていくことになります。
同じこの設定画面上の「レイアウトオプションの変更」というところで選択したキーがレイアウト変更用のキーになるように設定されます。
上の画像のような設定にしているときは[右Alt]キーを一回押すたびにレイアウトが切り替わります。(試してないけどこれ3種類以上レイアウトがあるときはサイクリックにレイアウトが切り替わっていくのかもしれません。)

レイアウト変更キー

当然のことながら、レイアウト変更キーの設定を変えるとxmodmapの定義も変わります。
例えば上の画像で選択している[右Alt]キーは元々xmodmapでは以下のように定義されていました。

keycode 108 = Alt_R Meta_R Alt_R Meta_R
mod1        Alt_L (0x40),  Alt_R (0x6c),  Alt_L (0xcc),  Meta_L (0xcd)

上の行は「xmodmap -pke」コマンドで出力された[右Alt]キー部分。下の行は「xmodmap -pm」コマンドで出力された[右Alt]キーが含まれている部分です。
本来[右Alt]キーはLinux上でのModifierキーに該当しますので、mod1という[左Alt]キーと同じ括りに定義されています。

これを「レイアウトオプションの変更」で[右Alt]キーを選択しますと、

keycode 108 = ISO_Next_Group Meta_R ISO_Next_Group
mod1        Alt_L (0x40),  ISO_Next_Group (0x6c),  Alt_L (0xcc),  Meta_L (0xcd)

という具合に変化します。
[右Alt]キーが定義されていた部分がまるごと[ISO_Next_Group]というものに変換されてしまいました。
どうやら[ISO_Next_Group]キーというものがLinux上でキーボードレイアウトを切り替えるキーに該当するようです。

一方で、「レイアウトオプションの変更」では[右Alt(押している間)]という選択肢もあります。

先ほどの[右Alt]が1回押すごとに切替だったのに対して、こちらは押している間だけ切替という違いがあります。(なので、3種類以上のレイアウトがあっても2番目への切替しか出来ないもの思われますが筆者はそこまで試してはいません)
xmodmapがどのように変化したか見てみますと、

keycode 108 = Mode_switch Multi_key Mode_switch Multi_key
mod1        Alt_L (0x40),  Alt_L (0xcc),  Meta_L (0xcd)

今度は[Mode_switch]というものに置き換わりました。
どうやら[Mode_switch]キーというものがLinux上で押している間だけキーボードレイアウトを切り替えるキーに該当するようです。
そして、Modifierキーからは削除されたようです。

「レイアウトオプションの変更」の選択肢に現れないキーをレイアウトの変更に使用したい場合はこの辺りを真似してxmodmapをコンフィグしてあげると良さそうです。
同様にxmodmapの3つ目4つ目を独自にコンフィグすれば独自のレイアウトを構築することも可能になります。
そのように独自でレイアウト変更キーとxmodmapを用意するのであれば、キーボード設定画面でレイアウトを複数登録しておく必要も無くなります。
要するに、自分専用レイアウト切替機能付きキー配列を構築することが出来るってわけですね。多分、きっと。

最近は高級キーボードなんかでキーコンフィグを自在に設定出来て、[Fn]キーを押したときに全く異なるレイアウト定義も出来るなんていう製品が増えて来ましたが、Linux上の設定で似たようなことが実現できるわけです。おお!大金叩かなくても似たような機能が実現できるし、安いキーボードでも似たようなことが出来るのでキーボード選択の幅が広がりまくりんぐですね。勉強して良かった!
ただし、これらのキーコンフィグは慎重にやる必要があります。
例えばとても重要なキーをどうやっても入力できないような形に誤ってコンフィグしてしまうと……復旧困難に陥りますよね。
最悪、USBで起動できるLinux作ってそこから定義を戻すみたいな手順を踏む必要が生じるかもしれません。
お気をつけて!

コンポーズキー

おまけです。
[Mode_switch]が出てきたときに同時に[Shift]押しで[Multi_key]というものが出てきていたのですが、これはコンポーズキーを意味します。
キーボードの設定でも「コンポーズキーの位置」という設定項目があり、例えばこんなふうに、

「コンポーズキーの位置」で[右Alt]キーを選択しますとxmodmapの様子が以下のように変わります。

keycode 108 = Multi_key Multi_key Multi_key Multi_key
mod1        Alt_L (0x40),  Alt_L (0xcc),  Meta_L (0xcd)

[Multi_key]に置き換えられてModifierからは削除されています。
ですので、上記の「レイアウトオプションの変更」で選択したときは[Shift]押しでコンポーズキーにもしてあげるという感じなのかと思います。

ちなみに、コンポーズキーとはなんぞや? という話ですが、アルファベットが複数くっついているような文字とかウムラウトとかを含めた文字を出したいときに使えるキーでして、コンポーズ状態にして[a][e]と打つと「æ」とか出来ます。
が、筆者は使う機会が無さそうな気がする……

2024-02-08

この記事のタグ

PC

Linux/BSD

トライ