変更方法scancode->keycodeマッピング

変更方法scancode->keycodeマッピング

Caps Lock を Backspace に再マッピングしました。

/etc/default/キーボード

XKBLAYOUT="us"
XKBVARIANT="altgr-intl"
BACKSPACE="guess"
XKBOPTIONS="caps:backspace"

これは非常にうまく機能しますが、一部の特定のツールでは機能しません。xev何が起こっているのか調べるのに使用しました。

バックスペースが押されました

KeyPress event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 1028211, (335,635), root:(452,749),
    state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
    XLookupString gives 1 bytes: (08) "
    XmbLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 1028272, (335,635), root:(452,749),
    state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
    XLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

CapsLockが押されました

KeyPress event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 859789, (391,558), root:(508,672),
    state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
    XKeysymToKeycode returns keycode: 22
    XLookupString gives 1 bytes: (08) "
    XmbLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 859875, (391,558), root:(508,672),
    state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
    XKeysymToKeycode returns keycode: 22
    XLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

ブラウザでも試してみました

addEventListener('keyup', event => {
  console.log(event.keyCode, event.key, event.code)
})

バックスペースとキャップスロックを押すと、次のログが記録されます。

8 "Backspace" "Backspace"
8 "Backspace" "CapsLock"

つまり、基本的に Caps Lock は Backspace に再マップされますが、これはツールと Web サイトが適切なチェックを使用している場合にのみ機能します。これを誤って実装している、使用するすべてのツールまたは Web サイトに対してバグ レポートを提出したくはありません。

再マップされた Caps Lock のように動作するのではなく、バックスペースを完全にエミュレートするように Caps Lock をマップすることは可能ですか?

答え1

まず、キーの押下がどのように処理されるかを見てみましょう(この答え):

/キーボード/ → scancode→ /入力ドライバ/ → keycode→ /XサーバーXKB/ →keysym

scancode、特定のキーにバインドされたデバイス固有のコードであり、ベンダー/製品によって異なる場合があります。keycodeと はkeysymアプリケーションに伝播されます。keycodeは、デバイスやロケールに依存しないため、抽象化レイヤーとして機能します。 は、ロケールと修飾キーの状態に応じて、keycode異なる を生成する可能性があります。これが、一部のアプリケーションが、特にキーボード ショートカットを扱うときにkeysymのみを検索する理由です。keycode

scancodeしたがって、私たちの目標は、CapsLock キーの をkeycodeBackSpace キーの にマッピングすることです。アプリケーションは、BackSpace キーと CapsLock キーのどちらを押してもkeycode、同じものを認識するようになります。keysym

このマッピングはユーデブ使用してhアードdアタb/lib/udev/hwdb.d/ase ファイル (hwdb.bin) は、との両方で .hwdb ファイルからコンパイルされます/etc/udev/hwdb.d/


変更方法scancode->keycodeマッピング

必要な情報を収集する

まず、入力デバイス (キーボード) の、 、をbustype決定する必要があります。また、再マッピングするキーの と、マッピング先の を決定する必要があります。vendorproductversionscancodekey code identifier

を実行しevtest(最初にインストールする必要がある場合があります)、デバイスの一覧でキーボードを特定します。再生/一時停止、WWW などの追加キーがあるキーボードでは、これらのキーは別の入力デバイスとして公開されることがよくあります。キーを押しても出力が得られない場合は、Control+を押してC別のデバイスを試してください。キーボードを特定したら、最初の列 ( ) を覚えておき/dev/input/eventX、再マップするキーを押します。その後の値(MSC_SCAN)が ですscancode。私のキーボードでは:

$ evtest
Available devices:
/dev/input/event0:  Power Button
/dev/input/event1:  Power Button
/dev/input/event2:  G19 Gaming Keyboard
/dev/input/event3:  G19 Gaming Keyboard
...
Select the device event number [0-18]:2
...
Event: time 1522111203.117945, -------------- SYN_REPORT ------------
Event: time 1522111220.778787, type 4 (EV_MSC), code 4 (MSC_SCAN),value 70039
Event: time 1522111220.778787, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 1

...scancode70039

次に、次のコマンドを実行します。ここでは、eventX前に選択したものになります。

$ grep "" /sys/class/input/eventX/device/id/*

私のキーボードの出力は

/sys/class/input/event2/device/id/bustype:0003
/sys/class/input/event2/device/id/product:c228
/sys/class/input/event2/device/id/vendor:046d
/sys/class/input/event2/device/id/version:0110

を取得するにはkey code identifier、の出力を使用するかevtestキーとボタン完全なリストについては、のセクションを参照してください。識別子は小文字に変換された/usr/include/linux/input-event-codes.h部分です。たとえば、KEY_KEY_BACKSPACEバックスペース

udevを設定する

を見てください/lib/udev/hwdb.d/。テキストファイルを作成します。/etc/udev/hwdb.d/ファイル名は、デバイスの種類に対応するファイルより大きい数字で始まります。キーボードの場合、これは 60 より大きい任意の数字にすることができますが、ポインティングスティックの場合は 70 より大きい必要があります65-keyboard-custom.hwdb。たとえば、 です。お気に入りのテキストエディタを使用してください。ただし、 として開始する必要があることに注意してくださいroot。例:

$ sudo gedit /etc/udev/hwdb.d/65-keyboard-custom.hwdb

次のコンテンツを追加します

evdev:input:b[bustype]v[vendor]p[product]e[version]*
 KEYBOARD_KEY_[scancode]=[key code identifier]

...どこ

  • [バスタイプ]、[ベンダー]、[製品]、[バージョン]は4文字(必要な場合はゼロで埋める)で、文字は大文字
  • [スキャンコード]はパディングを必要としませんが、文字は小文字
  • このevdev:...ラインは前にスペースなし
  • このKEYBOARD_KEY...ラインは直前のスペースは1つだけ

私の例では、ファイルは次のようになります。

evdev:input:b0003v046DpC228e0110*
 KEYBOARD_KEY_70039=backspace   # map CapsLock to BackSpace

最初の行はデバイスに一致します。追加のevdev:行を指定したり、ワイルドカード ( ) を複数使用して*追加のデバイスに一致させたりできますが、スキャンコードはデバイス固有であることに留意してください。また、複数のスキャンコードマッピングを追加することもできます。 を参照してください。/lib/udev/hwdb.d/60-keyboard.hwdbこのファイルのより詳細で最新のバージョンは、オンラインリポジトリ

新しい設定を適用する

新しい構成をハードウェア データベースにコンパイルします。

$ sudo systemd-hwdb update

変更をすぐに適用したい場合は、udev に通知します。

$ sudo udevadm trigger

設定値は、システムの実行中にのみ追加または変更できることに注意してください。設定 (スキャンコード マッピングなど) を削除した場合、変更を有効にするには再起動する必要があります。

以前行った再マッピングも ( を使用/etc/default/keyboard) 元に戻すことを忘れないでください。これは、すべてのキーボードに引き続き適用されるためです。

関連情報