问题描述
我在 Ubuntu 10.10 上使用 Microsoft Natural Ergonomic Keyboard 4000。多媒体键(音量、播放/暂停)、邮件和计算器按钮也有效。
现在我很想使用缩放滑块,如果可能的话,我想使用页面滚动。有什么方法可以实现吗?
最佳办法
使用以下内容创建文件 /etc/udev/rules.d/98-ms-ergo.rules
:
ACTION=="remove", GOTO="keyboard_end"
KERNEL!="event*", GOTO="keyboard_end"
ENV{ID_INPUT_KEY}=="", GOTO="keyboard_end"
SUBSYSTEMS!="usb", GOTO="keyboard_end"
SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
ENV{ID_VENDOR}=="Microsoft", ENV{ID_MODEL_ID}=="00db", RUN+="keymap $name 0xc022d pageup 0xc022e pagedown"
GOTO="keyboard_end"
这会将缩放键映射到 page-up/page-down 而不会更改 /lib/udev
中已安装的文件。
添加后,您只需拔下并重新插入键盘即可开始工作。
次佳办法
在 Xubuntu 13.10 上(也许在 Ubuntu 13.10 上也是如此)可以按如下方式执行相同的操作:
编辑 /lib/udev/hwdb.d/60-keyboard.hwdb
中的键映射:
###########################################################
# Microsoft
###########################################################
# Microsoft Natural Ergonomic Keyboard 4000
keyboard:usb:v045Ep00DB*
KEYBOARD_KEY_c022d=pageup
KEYBOARD_KEY_c022e=pagedown
运行 sudo udevadm hwdb --update
重启。
第三种办法
为了配置 Microsoft 人体工学键盘 4000,我们必须创建一个配置文件,其中包含键盘声明和映射键的记录。
为此,我们需要确定三种类型的信息:
-
键盘类型
-
键
scancode
是键盘上的实际键 -
键
name
将所需功能分配给所选键
首先找到键盘类型:
在终端中运行以下命令:
lsusb
输出确定键盘类型:
...
Bus 004 Device 022: ID 045e:00db Microsoft Corp. Natural Ergonomic Keyboard 4000 V1.0
...
它出现在 ID
之后。在这种情况下,它是 045e:00db
其次找到扫描码和密钥的名称。
为了确定它们,我们使用 evtest
程序在终端上注销特定设备的事件信息:
evtest
如果您没有该程序,请运行以下命令来安装它:
sudo apt-get install evtest
通过运行 evtest
程序,我们得到以下输出:
No device specified, trying to scan all of /dev/input/event* Available devices:
/dev/input/event0: Power Button
/dev/input/event1: Power Button
/dev/input/event2: PixArt USB Optical Mouse
/dev/input/event3: Microsoft Natural® Ergonomic Keyboard 4000
/dev/input/event4: Microsoft Natural® Ergonomic Keyboard 4000
/dev/input/event5: HDA Intel Front Headphone
/dev/input/event6: HDA Intel Line Out
/dev/input/event7: HDA Intel Line
/dev/input/event8: HDA Intel Rear Mic
/dev/input/event9: HDA Intel Front Mic
/dev/input/event10: HDA ATI HDMI HDMI/DP,pcm=3
Select the device event number [0-10]:
输出几乎是不言自明的,为键盘插入适当的数字,这里是数字 3
然后回车:
这样做会在终端上输出大量信息,并以以下几行结尾:
...
Testing ... (interrupt to exit)
Event: time 1472203902.240594, type 17 (EV_LED), code 0 (LED_NUML), value 0
Event: time 1472203902.240594, -------------- SYN_REPORT ------------
Event: time 1472203902.281456, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70058
Event: time 1472203902.281456, type 1 (EV_KEY), code 96 (KEY_KPENTER), value 0
Event: time 1472203902.281456, -------------- SYN_REPORT ------------
现在,键盘上的每个 key-press 都会转储出关键信息。例如,右 Shift 旁边的斜杠键显示:
Event: time 1472205062.294078, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70038
Event: time 1472205062.294078, type 1 (EV_KEY), code 12 (KEY_SLASH), value 0
Event: time 1472205062.294078, -------------- SYN_REPORT ------------
日志的第一行包含有关键盘上实际键的信息,例如值之后的 scancode
。在这种情况下,它是 70038
第二行包含分配的功能信息,例如键名。在这种情况下,它是 SLASH。检查其他键以找到它们的适当名称。
简而言之:
-
我们的键盘类型是:045e:00db
-
Slash 键的扫描码是:70038
-
分配的键名是 SLASH
收集必要信息后,我们创建配置文件:
sudoedit /etc/udev/hwdb.d/61-keyboard-local.hwdb
点击 i
激活插入模式并输入以下内容:
keyboard:usb:v045Ep00DB*
KEYBOARD_KEY_70038=minus
按 escape
保存并退出,然后键入 :wq
并回车。
然后运行以下两条命令使配置生效:
sudo udevadm hwdb --update
sudo udevadm control --reload
最后拔下键盘并将 re-plug 插入。
关于配置文件的一些注意事项:
-
文件的格式应该完全如图所示,映射记录前的空间很关键。
-
您可以使用任何其他文本编辑器代替
sudoedit
,只要记住按照上面解释的文件的确切格式。 -
键盘类型中添加了两个字符:
v
和p
,分别代表供应商和产品。它们也很重要。 -
键盘类型在配置文件中是大写的。我们的键盘类型是 045e:00db 但在配置中我们插入 v045Ep00DB*
-
密钥的扫描码紧跟在
KEYBOARD_KEY_
之后 -
键名在配置文件中以小写形式出现
-
按照本教程,您几乎可以自定义键盘上的每个键。
第四种办法
problem 是 evdev driver ignores keycodes > 255 。解决方案,感谢 Marco Chiappero :
1) you have to define all the remappings that you need (in the form of
"scancode keycode" list) and place them in a file under "/lib/udev/keymaps/"
(for example I created logitech-lx710-cordless there). You can find the
scancodes using evtest ("sudo evtest /dev/input/eventX", where X is your
keyboard device. Be careful, sometimes these extra keys are exposed through
a different device or your mouse interface: eg. event3 --> kbd, event4 -->
mouse & extra keys). Here some sample output:
Event: time 1294153475.909379, type 4 (Misc), code 4 (ScanCode), value c1028
"c1028" is the scancode value you're going to place in your keymap file, then
pick up a number from input.h as described earlier and convert it to
hexadecimal. Then write the remap pair in your file, maybe with a descriptive
comment, like this:
0xC1028 0x9a # rotate button
Iterate for every key > 255.
2) you have to tell udev to apply this remapping file everytime it encounters
your keyboard, so edit the "/lib/udev/rules.d/95-keymap.rules" file adding
the udev rule that matches your HW. Please don't ask me to define a rule for
you.
NOTE: you can immediately apply your keymap file by yourself typing
"sudo /lib/udev/keymap /dev/input/eventX /lib/udev/keymaps/$YOUR_FILE" and
verify it with evtest once again.
Now, you can use the Gnome shortcuts editor to see that the keys are now
usable inside X and create new shortcuts. However it might happen that no
keysym is assigned to that keycode (so you'll see 0xXY instead of XF86Foo).
You can see current mappings through xmodmap -pke, save the output into a
file and edit it if you need (a full keysym code list is available in
"/usr/lib/X11/XKeysymDB").
Once you added the keysyms to those keys you remapped, you can save this file
as ~/.Xmodmap (or as /etc/X11/Xmodmap if you wish to apply to every user).