Aqu*_*wer 21 linux keyboard x11 key-mapping
我正在尝试找到一种强制重新映射键盘键的方法。
我尝试使用 xmodmap 和 setxkbmap,但它们不适用于某个特定应用程序。此类命令适用于 X tho 上的其他普通窗口/应用程序。
我认为应用程序可能正在读取键盘原始数据并忽略 X 输入?
那么,如何在不使用 xmodmap 和 setxkbmap 的情况下重新映射密钥?如果有可能使用某些软件来完成。
我也试过 xkeycaps、xkbcomp,但没有试过 loadkeys,因为它在 X 上运行。
我在这里发现我可以尝试setkeycodes,“因为在分配内核键码后,按钮应该在 xorg 中工作”,但我也发现“你不能在 USB 键盘上使用‘setkeycodes’”,这就是我的情况(我对 case 感兴趣有人让它在 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..
Run Code Online (Sandbox Code Playgroud)
观察:也不适用于: KEYBOARD_KEY_7e=j
一些更多的替代方法(由@vinc17 提供)来查找键:
evtest /dev/input/by-id/... 或者
input-kbd 3(把ls -l /dev/input/by-id/*从 ex.event3找到的 id 索引放在)
PS.: *如果您有兴趣测试自己,该应用程序的相关线程是这样的:http : //forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/我的问题有相同的:一些键(KP_Decimal、DownArrow、UpArrow、RightArrow)被忽略并被认为都具有相同的值“0x00”
vin*_*c17 22
首先找到需要重新映射的密钥的扫描码,例如使用evtest实用程序。MSC_SCAN应该输出如下一行(其中包含):
Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068
Run Code Online (Sandbox Code Playgroud)
其次是给出当前密钥代码的第二个。如果没有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
Run Code Online (Sandbox Code Playgroud)
(在 udev 220 之前,我必须keyboard:usb:v05ACp0221*用于第一行。)
该evdev:字符串必须在该行的开头。请注意,供应商和产品 ID 中的字母应为大写字母。每个KEYBOARD_KEY_设置之前都应该正好有一个空格(注意:没有空格的行会给出错误消息,而旧的 udev 版本会默默地忽略有两个空格的行)。KEYBOARD_KEY_后跟十六进制的扫描码(就像两者evtest和input-kbd给出的一样)。可以从evtest输出或input-kbd输出,甚至从/usr/include/linux/input.h文件中获得有效值:例如,KEY_102ND将给出102nd(通过删除KEY_并转换为小写),我在上面使用过。
保存文件后,键入:
udevadm hwdb --update
Run Code Online (Sandbox Code Playgroud)
(重新)构建数据库/etc/udev/hwdb.bin(您可以检查其时间戳)。然后,
udevadm trigger --sysname-match="event*"
Run Code Online (Sandbox Code Playgroud)
将考虑新设置。您可以使用evtest.
2014 年,发布的 udev 中包含不完整/错误信息/lib/udev/hwdb.d/60-keyboard.hwdb,但您可以查看该文件的最新开发版本和/或我的错误报告以及有关文档和间距问题的讨论。
如果这不起作用,可能会在临时增加udevdwith的日志级别后发现问题udevadm control(有关详细信息,请参阅 udevadm(8) 手册页)。
对于udev204 等旧版本,此方法应该仍然有效。
| 归档时间: |
|
| 查看次数: |
7899 次 |
| 最近记录: |