キーボードのキーを強制的に再マップする方法を見つけようとしています。
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 3
(ls -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*
を使用する必要がありました。 最初の行に。)
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などのバージョンでも、この方法は機能するはずです。