2023-11-26 キーボードリマップ調査
#2023 #202311
#Linuxでのキー入力のカスタマイズ
今から考えるならwaylandを考慮してコンポジットより先に入力が渡るもので処理したほうが良さそう
https://wiki.archlinux.jp/index.php/入力リマップユーティリティ
その前にキー入力について把握しておくほうが良さそう
https://wiki.archlinux.jp/index.php/キーボード入力
キーボードがスキャンコードを送信し、カーネルがキーコードに変換し、XやWaylandによって修飾キーを把握し記号かキーシムに変換される
/10cho/ユーザーの入力がソフトウェアに渡されるまで
介入するデバイスはこのあたりが参考になりそう
https://en.m.wikipedia.org/wiki/Wayland_(protocol)#libinput
code: text
カーネル: 入力 → (デバイスId(イベントID), スキャンコード)
コンソール、X: (スキャンコード, モディファイ状態) → キーシム | 記号
カーネル部分を置き換えることで擬似的に物理的な配列を置き換えてるように見せかけられる。
ttyの変更は変わらなかったのでスキャンコードを見ている。印字されているキーで操作させることができる。
モディファイアの設定は?
スキャンコードの時点で置き換えておくと楽そう。
上記の入力に対して、変換可能なツールを整理できると良さそう
ディスプレイマネージャーに渡る前のキーボード配列の図を出力できるとなおよい
変換キーをctrlに
ctrlキーをバックスペースにしてみる
https://wiki.archlinux.jp/index.php/スキャンコードをキーコードにマップ
スキャンコードと変換したいキーコードを確認する
| | スキャンコード | キーコード |
| 変換 | 0x79 0xf9 | 92|
| ctrl | 0x1d 0x9d| 29 |
| backspace | 0x0e 0x8e |14 |
| capslock | 0x3a 0xba | 58 |
スキャンコードの確認にはevtestが使える
キーコードの確認には、xevが使えそう
変換をctrlに sudo setkeycodes 0x79 29
capslockをbackspaceに sudo setkeycodes 0x3a 14
ctrlをcapslockに sudo setkeycodes 0x1d 58
release時のスキャンコードは割り当てなくても動く。自動的に変換されている。リリース時のスキャンコードは算出可能だからだと思われる
期待した動作をさせることができた。再起動するたびに実行する必要がある。
initスクリプトにかいてもよいけど、もっと良い手段はないか。
udevを使うのが良さそう。
操作しやすくなったので乗り換えてみよ
https://kbd-project.org/
setkeycodeはkbd プロジェクトの一員のようだ
setkeycodeはioctlを使ってカーネルのキーボードテーブルを書き換えできるようだ。
引数はkbkeycode構造体
https://github.com/legionus/kbd/blob/fdb6fad5525e083b0b559c359968d4b044a31c73/src/setkeycodes.c#L162C21-L162C21