キーボードハード再マッピングキー?

キーボードハード再マッピングキー?

キーボードキーを強制的に再マップする方法を見つけようとしています。
xmodmapとsetxkbmapを試してみましたが、特定のアプリケーションでは機能しません。これらのコマンドは、Xの他の一般的なウィンドウ/アプリケーションで機能します。

アプリケーションがキーボードの生データを読み取り、X入力を無視できると思いますか?

それでは、xmodmapとsetxkbmapを使用せずにどのようにキーを再マップしますか?一部のソフトウェアを使用して実行できる場合。

xkeycaps、xkbcompも試してみましたが、Xで実行されているため、loadkeysは試していません。

私が見つけたここ私が試すことができますsetkeycodes「カーネルキーコードを割り当てた後、xorgでボタンが機能する必要があるからです。」しかし、私も見つけました。「USBキーボードでは「setkeycodes」を使用できません。」、それが私の状況です。 (アダプターが使えそうでps2で動作させる人に興味があります。)

これは有望に見えます。「スキャンコードをキーコードにマッピングする」しかし、いくつかのテスト後も、次のように何も変更されませんでした。
vt1でキーコード「36」(キー「j」)を見つけ、showkey
vt1でスキャンコード「7e」(キーボード「。」)を見つけました。showkey --scancodes

$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..

観察:以下にも適用されません。KEYBOARD_KEY_7e=j

キーを見つけるためのいくつかの選択肢(@vinc17提供):
evtest /dev/input/by-id/... または(
input-kbd 3ex.event3で見つかったIDをインデックスに入れます)ls -l /dev/input/by-id/*

PS.: *自分でテストしたい場合は、アプリ関連のスレッドは次のとおりです。 http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/私が経験している問題は同じです。一部のキー(KP_Decimal、DownArrow、UpArrow、RightArrow)は無視され、「0x00」で同じ値を持つと見なされます。

答え1

evtestたとえば、ユーティリティを使用して再マッピングする必要があるキーのスキャンコードを見つけることから始めます。MSC_SCAN次の行を出力する必要があります(含む)。

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

次の2番目のエントリは現在のキーコードを提供します。行が出力されない場合、MSC_SCANこれはカーネルドライバのバグによるものですが、input-kbdユーティリティを使用してスキャンコードを見つけることができます。evtest出力で適切な行を簡単に見つけるためにキーコードを提供する必要があります(input-kbd例:次のように)。grep

再マッピングするキーのスキャンコードを決定したら、/etc/udev/hwdb.d/98-custom-keyboard.hwdb再マッピングを含むファイルと同じファイルを作成します。ファイルの先頭には/lib/udev/hwdb.d/60-keyboard.hwdbいくつかの情報があります。私の場合は(動作します):

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

keyboard:usb:v05ACp0221*(udev 220以前は最初の行を使用する必要がありました。)

文字evdev:列は行の先頭になければなりません。ベンダーと製品IDの文字は大文字でなければなりません。各KEYBOARD_KEY_設定の前にはスペースが必要です。 (注:空白のない行にはエラーメッセージが表示され、2つのスペースがある行にはエラーメッセージが表示されます。)何も言わずに以前の udev バージョンは無視されます。その後には16進スキャンコードが続きます(両方とKEYBOARD_KEY_同じように提供されています)。有効な値は、出力、出力、またはファイルからも取得できます。たとえば、上記で使用した値が提供されます(削除して小文字に変換することによって)。evtestinput-kbdevtestinput-kbd/usr/include/linux/input.hKEY_102ND102ndKEY_

ファイルを保存したら、次のように入力します。

udevadm hwdb --update

データベースを(再)構築します/etc/udev/hwdb.bin(タイムスタンプを確認できます)。次に、

udevadm trigger --sysname-match="event*"

新しい設定が考慮されます。で確認できますevtest

2014年のudevリリースには不完全な情報やバグのある情報が含まれていましたが、/lib/udev/hwdb.d/60-keyboard.hwdb確認できます。このファイルの最新開発バージョンそして/または私のバグレポートと議論文書化と間隔の問題について。

それでも機能しない場合は、udevdudevadm(8)のログレベルを一時的に上げると問題が発生する可能性がありますudevadm control(詳細についてはudevadm(8)のマニュアルページを参照)。

udev204 などの以前のバージョンでは、この方法それでも動作するはずです。

関連情報