键盘硬重映射键?


19

我试图找到一种方法来强制重新映射键盘键。
我尝试使用xmodmap和setxkbmap,但它们不适用于一个特定的应用程序。这样的命令适用于X tho上的其他普通窗口/应用程序。

我认为应用程序可能正在读取键盘原始数据,而忽略了X输入?

那么,如何在不使用xmodmap和setxkbmap的情况下重新映射键?如果有可能使用某些软件来完成。

我还尝试了xkeycaps,xkbcomp,但是没有尝试使用loadkeys,因为它在X上运行。

我在这里发现可以尝试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..

观察:不适用于: KEYBOARD_KEY_7e=j

(@ vinc17)通过其他一些方法来查找密钥:
evtest /dev/input/by-id/...
input-kbd 3(将id索引ls -l /dev/input/by-id/*从ex。event3找到)

PS .: *如果您有兴趣进行自我测试,则该应用程序的相关线程是这样的:http : //forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/问题我具有相同的内容:某些键(KP_Decimal,DownArrow,UpArrow,RightArrow)将被忽略,并在其中存在所有具有相同值的“ 0x00”


更新的文件应该/etc/udev/hwdb.bin不是/lib/udev/hwdb.bin。但是,尽管此文件已正确更新,但即使重新启动后,该文件也对我不起作用。也许是文档中缺少的东西。关于此内容:bugs.freedesktop.org/show_bug.cgi?id=82311
vinc17 2014年

@ vinc17真的很有趣,我可以尽快重试,我想我们必须找到该设置文件并尝试模仿它,谢谢!
水瓶座力量

1
我的问题是由于KEYBOARD_KEY_行以2个空格而不是单个空格开头(这没有记录,也没有错误消息!)。我不知道你是谁,但是用我的USB键盘,showkey --scancodes没有给出udev期望的扫描代码(值是不同的)。该input-kbd实用程序会提供正确的扫描代码。
vinc17 2014年

1
evtest实用程序还应为您提供正确的扫描代码:键入密钥后,您应获得2行,而第一行应以形式结束code 4 (MSC_SCAN), value xxx,其中xxxscancode 在哪里。但是我的键盘驱动程序有问题,MSC_SCAN对于某些我想重新映射的键,我没有得到这一行。这就是为什么我使用input-kbd,它列出了所选设备的所有扫描代码。
vinc17 2014年

1
我已经在答案中发布了详细信息。现在,我不确定36或7002c是否可以作为值。我认为您需要键码标识符。看我的答案。
vinc17 2014年

Answers:


17

首先,例如使用evtest实用程序,找到需要重新映射的密钥的扫描代码。MSC_SCAN应该输出类似于以下一行的一行:

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

其次是第二个给出当前的密钥代码。如果没有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_设置应该有一个空格之前(注:不带空格的行会给出错误信息,并与两个空格线被无声地与旧版本的udev忽略)。KEYBOARD_KEY_后面是十六进制的扫描码(与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,但是您可以查看文件的最新开发版本和/或我的错误报告以及有关文档和间距问题的讨论。

如果这不起作用,则在临时增加udevdwith 的日志级别之后,可能会发现问题udevadm control(有关详细信息,请参见udevadm(8)手册页)。

对于udev204之类的旧版本,此方法仍然可以使用。


当我运行udevadm命令时,要更新的文件是/lib/udev/hwdb.bin,我查看了blessKEYBOARD_KEY_70085在其末尾显示。我认为ubuntu 14.04是以这种方式配置(受保护的?)。我试过了udevadm control --log-priority=debug。基于lsusb(045e:0750),我的键盘变得像keyboard:usb:v045ep0750*,但我也尝试keyboard:usb:v*p*过。我的猜测是/etc/udev/hwdb.bin应该对此进行更新,但是甚至不存在。
Aquarius Power

正如我在此处阅读的那样udevadm hwdb --usr --update,尽管我没有使用它,但可能就像我正在使用此命令一样。
Aquarius Power

之后udevadm hwdb --update我复制/lib/udev/hwdb.bin/etc/udev/hwdb.bin与RAN strace udevadm trigger --sysname-match="event*"和文件hwdb.bin似乎并没有被它读取(如果是这样的作品)。
Aquarius Power

1
@AquariusPower是的,可能存在一个特定于Ubuntu的错误(我正在使用Debian / unstable)。要查看执行时是否读取了数据库udevadm trigger ...,请在此处查看我的测试。请注意,在运行之前udevadm trigger ...,您需要确保已更新文件的修改时间,否则在读取文件时访问时间将不会更新。
vinc17

1
@AquariusPower udevadm --version:215(和udev软件包版本:215-7)。多亏了udevadm trigger ...,您不需要重新启动(除非您要删除设置AFAIK)。但是您可能想尝试重新启动以查看是否有任何效果。
vinc17 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.