キーマップを正しく変更するには?

キーマップを正しく変更するには?

問題を詳しく説明しようとします。私はしばしばネットブックで外部キーボードを使用します。キーボードは「TK Stealth」です。


拡大するにはクリックしてください。

ご覧のとおり、数字キーパッドは従来の数字キーパッドと非常によく似ていますが、矢印キーは実際にはワイドキーボードの追加の矢印キーと同じようにマッピングされます。

数字キーパッドのようにマッピングしたいです(例: "8" == "up"、 "2" == "down"、 "4" == "left"、 "6" == "right"、そしてまもなく)。

この設定は、対応するキーボードが接続されている場合にのみ有効です。

私はxmodmap /home/johnfound/TKStelth次のマップファイル「TKStelth」を使ってこれを達成しようとしています。

keycode  79 = KP_Home KP_Home KP_Home KP_Home
keycode  80 = KP_Up KP_Up KP_Up KP_Up
keycode  81 = KP_Prior KP_Prior KP_Prior KP_Prior
keycode  83 = KP_Left KP_Left KP_Left KP_Left
keycode  84 = KP_Begin KP_Begin KP_Begin KP_Begin
keycode  85 = KP_Right KP_Right KP_Right KP_Right
keycode  87 = KP_End KP_End KP_End KP_End
keycode  88 = KP_Down KP_Down KP_Down KP_Down
keycode  89 = KP_Next KP_Next KP_Next KP_Next
keycode  90 = KP_Insert KP_Insert KP_Insert KP_Insert
keycode  91 = KP_Delete KP_Delete KP_Delete KP_Delete

効果がありますが、醜い副作用もあります。たとえば、レイアウトはデフォルト値に戻り、上記のスクリプトを手動で実行する必要があります。このスクリプトをinitスクリプトに含めると、中断状態で再起動し、画面の解像度を変更した後にOSが数分間中断されるいくつかのクラッシュ/ロックが発生します。これにより、initスクリプトからスクリプトを削除する必要があります。

xmodmapが実際にキーボードレイアウトを処理する古い方法であることをどこかで読みました。

したがって、質問は次のようになります。このキーボードとこのキーボードのみを正しく処理するようにLinuxを設定する方法は?

追加情報:XFCEを含むManjaro Linux。キーボード構成には、米国式とブルガリア語の2つのレイアウトがあり、上記の構成変更後も維持する必要があります。

答え1

正しい解決策を見つけたら、すぐに私の質問に答えます。

というプログラムがあります。キブラー入力デバイスに基づいてカーネルが使用するキーマップを変更します。つまり、コンピュータに接続されている各キーボードに対して個別に変更します。

このプログラムには、文書で正しく説明されていない 2 つの問題があります。

  1. USBキーボードは、PS / 2ポートに接続されているキーボードのスキャンコードではなくスキャンコードを生成します。したがって、USBキーボードを再マップする必要がある場合は、キーのスキャンコードを知る方法が必要です。 「showkey」ツールは、スキャンコードとキーコードのテストに推奨されることがよくあります。いいえ/dev/consoleこれは、キーボードに関係なく「標準」スキャンコードをエクスポートするフォームを読み取るために行われます。

アドレスのキーボードのスキャンコードをテストするには、次の/dev/input/KEYBOARDプログラムを使用する必要があります。スキャンコードを取得。上記のリンクからダウンロードしたファイルは正しく圧縮されていませんのでご注意ください。名前getscancodes.tar.gzはですが、ZIPアルゴリズムを使用して圧縮されます。パッケージにはソースコードとプリコンパイルされたバイナリが含まれています。

私の場合、keyfuzz設定ファイルは次のようになります。

### evdev 1.0.0., driver 'TK Stealth keyboard'
### Proper old-style numpad handling

0x70059    107
0x7005A    108
0x7005B    109
0x7005C    105
0x7005D    108
0x7005E    106
0x7005F    102
0x70060    103
0x70061    104

0x70062    110
0x70063    111
  1. "keyfuzz"プログラムは、できるだけ早くテーブルにパッチを適用するために起動中にサービスとして起動します。残念ながら、USBキーボードは後でデバイスに追加されたため、keyfuzzが起動したときに起動中にUSBキーボードが接続されていてもパッチするキーボードはありませんでした。

udev解決策は、必要なキーボードを追加するときにルールファイルを使用してkeyfuzzを起動することです。

これを行うには、以下を/etc/udev/rules.d/mykeyboard.rules含むファイルを追加する必要があります(私の場合):

ACTION=="add", ATTRS{idVendor}=="2516", RUN+="/usr/lib/systemd/scripts/keyfuzz start"

キーボードが接続されると、keyfuzz起動スクリプトが起動し、キーボードデコードテーブルにパッチが適用されます。

関連情報