GNU/Linux >> Linux の 問題 >  >> Linux

Linux –キーボードハードリマップキー?

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

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

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

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

ここで、setkeycodesを試すことができることがわかりました。 、「カーネルキーコードを割り当てた後、ボタンはxorgで機能するはずです」が、「USBキーボードでは「setkeycodes」を使用できない」こともわかりました。これが私の場合です(誰かがps2で機能させる場合に興味があります。アダプターが使えると思います。

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

$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/*にあるidインデックスを配置します 例からイベント3)

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

承認された回答:

まず、再マッピングする必要のあるキーのスキャンコードを見つけます。 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*を使用する必要がありました。 最初の行に。)

関連:Linux – UnixのTTYメジャー番号?

evdev: 文字列は行の先頭にある必要があります。
ベンダーと製品IDの文字は大文字である必要があります。
KEYBOARD_KEY_ 設定の前にはスペースを1つだけ含める必要があります(注:スペースのない行はエラーメッセージを表示し、2つのスペースのある行はサイレント 古いudevバージョンでは無視されます)。 KEYBOARD_KEY_ その後に16進数のスキャンコードが続きます(両方のevtestのように) およびinput-kbd 与える)。有効な値は、evtestのいずれかから取得できます。 出力またはinput-kbd 出力、または/usr/include/linux/input.hからも ファイル:たとえば、KEY_102ND 102ndを与える (KEY_を削除する 上で使用した小文字に変換します。

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

udevadm hwdb --update

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

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

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

2014年に、リリースされたudevの/lib/udev/hwdb.d/60-keyboard.hwdbに不完全/バグのある情報がありました 、ただし、ファイルの最新の開発バージョンやバグレポート、およびドキュメントと間隔の問題に関するディスカッションを確認できます。

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

古いudevの場合 204などのバージョンでも、この方法は機能するはずです。


Linux
  1. Linuxコマンドラインに関する8つのヒント

  2. Linuxコマンドラインで牛を飼う

  3. Linuxコマンドラインにアクセスしてください

  1. Linux – Rawキーボードモード?

  2. ハードディスク全体のLinuxをバックアップしますか?

  3. Linux で Win、Ctrl、および Alt キーを再マップする

  1. Linuxでハードドライブを交換する方法

  2. LinuxでVimの行を削除する方法

  3. Linux で特定のキーボードのみにキーを再マップする方法