キーボードのハードリマップキー?


19

キーボードキーを強制的に再マップする方法を探しています。
xmodmapとsetxkbmapを使用してみましたが、特定のアプリケーションでは機能しません。このようなコマンドは、X thoの他の通常のウィンドウ/アプリケーションに対して機能します。

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

だから、xmodmapとsetxkbmapを使用せずにキーを再マッピングする方法は?何らかのソフトウェアを使用して実行できる場合。

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

私が見つかりました。ここで私は試みることができることをsetkeycodes「カーネルのキーコードを割り当てた後、ボタンでXorgで動作するはずですので、」が、私はまたことがわかった「あなたはUSBキーボードの『setkeycodes』を使用することはできません」私の場合(私はケースに興味がありますこと、誰かが私がアダプタを使用できると思うので、ps2で動作させます)。

これは「スキャンコードをキーコードにマップ」するように思えましたが、いくつかのテストを行っても何も変わりませんでした:
vt1でキーコード「36」(「j」キー)showkey
を見つけ、スキャンコード「7e」(キーパッド「。」)を見つけましたvt1と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..

Obs .:は以下とも機能しませんでした: KEYBOARD_KEY_7e=j

キーを見つけるためのいくつかの代替方法(@ vinc17による):
evtest /dev/input/by-id/... または
input-kbd 3ls -l /dev/input/by-id/*ex。event3 で見つかったidインデックスを置く)

:あなた自身をテストに興味があるならPS:*は、アプリケーションのための関連スレッドはこれです http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/問題I haveは同じです。一部のキー(KP_Decimal、DownArrow、UpArrow、RightArrow)は無視され、すべて同じ値の「0x00」と見なされます


更新されたファイルはである必要が/etc/udev/hwdb.binあり/lib/udev/hwdb.binます。しかし、このファイルは正しく更新されていますが、再起動後でもこれは機能しません。おそらくドキュメントに欠けているものがあります。これについて:bugs.freedesktop.org/show_bug.cgi
id

@ vinc17それは本当に面白いです、すぐにもう一度試してみることができます、私はその設定ファイルを見つけて真似しようとする必要があると思います、thx!
アクエリアスパワー14年

1
私の問題は、KEYBOARD_KEY_行が1つのスペースではなく2つのスペースで始まっていたためです(これは文書化されておらず、エラーメッセージも表示されませんでした!)。私にはわかりませんが、私のUSBキーボードでshowkey --scancodesは、udevが期待するスキャンコードを提供しません(値は異なります)。input-kbdユーティリティは、正しいスキャンコードを提供します。
vinc17 14年

1
また、evtestユーティリティは正しいスキャンコードを提供する必要があります。キーを入力すると、2行が取得され、最初の行はの形式code 4 (MSC_SCAN), value xxxで終了しますxxx。しかし、私のキーボードのドライバーはバグがあり、MSC_SCAN再マップしたいいくつかのキーについてはこの行を取得できません。そのinput-kbdため、選択したデバイスのすべてのスキャンコードを一覧表示するを使用しました。
vinc17

1
詳細な情報を回答に投稿しました。現在、36または7002cが値として機能するかどうかはわかりません。キーコード識別子が必要だと思います。私の答えをご覧ください。
vinc17 14年

回答:


17

最初に、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

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

evdev:文字列は、行の先頭になければなりません。ベンダーと製品IDの文字は大文字にする必要があることに注意してください。各KEYBOARD_KEY_(:スペースなしで行がエラーメッセージを与えるだろう、と二つのスペースに合わせたノートが前の設定は、厳密に1つのスペースを持っている必要があり静かに古いudevのバージョンでは無視されます)。KEYBOARD_KEY_その後に16進数のスキャンコードが続きます(両方evtestinput-kbd与えるもののように)。有効な値のいずれかから得られたevtest出力またはinput-kbd出力、あるいはから/usr/include/linux/input.h、例えば:ファイルKEY_102ND与える102nd(除去することによって、KEY_及び小文字に変換する)、Iは、上記使用しました。

ファイルが保存されたら、次を入力します。

udevadm hwdb --update

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

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

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

2014年に、解放udevはで不完全/バギーの情報を持っていた/lib/udev/hwdb.d/60-keyboard.hwdbが、あなたは見ることができ、ファイルの最新の開発版および/または私のバグレポートとディスカッション文書に関する問題や間隔。

これが機能しない場合は、udevdwith のログレベルを一時的に増やした後に問題が見つかる可能性がありますudevadm control(詳細については、udevadm(8)のマニュアルページを参照してください)。

udev204などの古いバージョンの場合、このメソッドは引き続き機能します。


私はudevadmコマンドを実行すると、更新されたファイルは、/lib/udev/hwdb.bin私が見て、blessそしてKEYBOARD_KEY_70085その最後に表示されます。ubuntu 14.04はこのように設定(保護?)されていると思います。試しましたudevadm control --log-priority=debuglsusb(045e:0750)に基づいて、キーボードはのようkeyboard:usb:v045ep0750*になりますが、私も試してみkeyboard:usb:v*p*ました。私の推測では、これ/etc/udev/hwdb.binは更新されるべきですが、存在すらしていません。
アクエリアスパワー14年

私がここで読んだようにudevadm hwdb --usr --update、私はそうではなかったにもかかわらず、このコマンドを使用していたように思えます。
アクエリアスパワー14年

udevadm hwdb --updateコピー/lib/udev/hwdb.bin/etc/udev/hwdb.binて実行strace udevadm trigger --sysname-match="event*"した後、ファイルhwdb.binが読み取られていないようです(これが機能する場合)。
アクエリアスパワー14年

1
@AquariusPowerはい、Ubuntu固有のバグがある可能性があります(Debian / unstableを使用しています)。実行中にデータベースが読み取られるかどうかを確認するには、こちらのテストをudevadm trigger ...参照してください。を実行する前udevadm trigger ...に、ファイルの変更時刻が更新されていることを確認する必要があることに注意してください。そうしないと、ファイルの読み取り時にアクセス時刻が更新されません。
vinc17 14年

1
@AquariusPower udevadm --version:215(およびudevパッケージバージョン:215-7)。のおかげでudevadm trigger ...、再起動する必要はないはずです(設定を削除したい場合を除き、知る限り)。ただし、再起動を試して、効果があるかどうかを確認することをお勧めします。
vinc17 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.