使用udev的解决方案
由于不赞成使用HAL,udev
现在使用了HAL ,因此该方法优于我的其他答案(尽管我认为使用HAL的解决方案更简单)。
但是,对于许多功能键,您只需使用“ 系统设置”>“键盘”>“快捷键”来绑定脚本,请首先尝试!它为您省去了很多麻烦。例如,亮度键不起作用(我不知道为什么不这样),因此,如果您想知道如何更改例如亮度键的行为,请继续阅读。
注意:如果您正在运行三星笔记本电脑,则可以通过samsung-tools
从http://www.voria.org/forum/安装软件包来修复所有(取决于型号)功能键。
本方法假定您知道如何使用终端,并使用vim
编辑器。如果您不知道,vim
请在命令中用gedit
或替换它nano
。
确定键盘
/lib/udev/findkeyboards
就我而言,应该打印连接到计算机的键盘
USB keyboard: input/event9
USB keyboard: input/event7
AT keyboard: input/event4
现在有两个选择:
USB键盘:
如果要重新映射USB键盘,请运行以下命令进行检查
udevadm info --export-db | awk '/event9/' RS="" | grep -P 'ID_(VENDOR|MODEL)(?!_ENC)'
您必须用正确的数字替换awk语句中的9。输出应类似于
E: ID_MODEL=USB_Receiver
E: ID_MODEL_ID=c52b
E: ID_VENDOR=Logitech
E: ID_VENDOR_ID=046d
正确表示我的键盘是通过Logitech USB接收器处理的(输入/事件7原来是我的Logitech G9鼠标,具有一些可编程按钮)。
笔记本电脑键盘:
如果要重新映射笔记本电脑键盘,AT keyboard
在我的情况下,请记住数字4。同时获取笔记本电脑的dmi信息:
cat /sys/class/dmi/id/sys_vendor
就我而言
SAMSUNG ELECTRONICS CO., LTD.
和
cat /sys/class/dmi/id/product_name
就我而言
305U1A
确定当前对功能键的映射
现在,我们可以通过听键盘来确定当前的键盘映射(插入正确的数字)
sudo /lib/udev/keymap -i input/event4
您可以通过Esc在键盘上使用或在另一个键盘上使用Ctrl+ 退出此命令c。
如果屏幕开始非常困难地向下滚动,请按Esc和Ctrl+ c几次,然后按
sudo /lib/udev/keymap -i input/event4 2> /dev/null
或者,如果您仍然遇到滚动问题
sudo /lib/udev/keymap -i input/event4 > ~/keymap.log
在最后一种情况下,您仍然可以滚动,但是如果您按功能键,它们应该进入~/keymap.log
以后可以阅读的地方。
现在,我们可以通过按功能键来检查它们的当前映射,这将为您提供一个列表,例如(这是我的Fn+ F1到Fn+ F12):
scan code: 0xCE key code: kpplusminus
scan code: 0x89 key code: brightnessdown
scan code: 0x88 key code: brightnessup
scan code: 0x82 key code: switchvideomode
scan code: 0xF9 key code: f23
scan code: 0xA0 key code: mute
scan code: 0xAE key code: volumedown
scan code: 0xB0 key code: volumeup
scan code: 0x43 key code: f9
scan code: 0x44 key code: f10
scan code: 0xB3 key code: prog3
scan code: 0x86 key code: wlan
现在,写下您要更改其行为的扫描代码。
更改扫描码的关键码
如果您看到密钥代码显然没有涵盖您期望密钥执行的操作,则可以在/usr/include/linux/input.h
“ 密钥和按钮”下查看以查看是否存在与您实际想要发生的行为更匹配的密钥代码。关键码采用格式KEY_KEYCODE
,您必须KEY_
在小写后记下该部分。有时更改此设置足以解决问题。
但是,亮度键通常具有与之关联的正确键码,这是不允许重新映射它们的原因。因此,我们需要将它们更改为其他键码。我们将使用prog1
和prog2
在这个例子中,因为这些都不在我的电脑上使用,但您也可以使用f13
通过f24
,或者f20
通过f24
如果有一个有Apple键盘F1通过F19按键。
创建一个自定义键盘映射:
在目录中/lib/udev/keymaps
使用合适的名称创建一个键盘映射文件,查看输出ls /lib/udev/keymaps
以查找合适的名称。我正custom-brightness
考虑这个问题。
sudo vim /lib/udev/keymaps/custom-brightness
并输入要更改的键的扫描代码,然后输入您希望它们具有的扫描代码。我的custom-brightness
样子是这样的:
# /lib/udev/keymaps/custom-brightness
0x89 prog1
0x88 prog2
创建一个自定义密钥发布文件。 仅当您更换笔记本电脑键盘时:
有时按键释放事件未正确发送,导致计算机挂起。为了避免这种情况,我们还将编写一个自定义密钥发布文件
sudo vim /lib/udev/keymaps/force-release/custom-brightness
这个文件应该包含相同的扫描代码,我的看起来像
# /lib/udev/keymaps/force-release/custom-brightness
0x89
0x88
确保新映射已加载到规则文件中
现在,我们需要确保已加载映射。我们可以通过编辑来做到这一点/lib/udev/rules.d/95-keymap.rules
,因此进行备份很聪明
同样,我们有两个选择:
USB键盘:
由于您具有USB键盘LABEL="keyboard_usbcheck"
,因此应在下面添加条目,并且该条目应位于键盘制造商的其他条目之后。这是因为我的键盘
E: ID_MODEL=USB_Receiver
E: ID_MODEL_ID=c52b
E: ID_VENDOR=Logitech
E: ID_VENDOR_ID=046d
已被其中一项规则匹配,否则将被覆盖。
添加以下规则,在该处应适当更改ID_VENDOR_ID
和ID_MODEL_ID
以及键盘映射的名称
ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
笔记本电脑键盘:
如果/lib/udev/findkeyboards
报告了您的笔记本电脑键盘AT keyboard
应遵守的规则LABEL="keyboard_vendorcheck"
,否则请放下LABEL="keyboard_modulecheck"
。再次将其放在笔记本电脑制造商的其他条目下。添加以下规则(SAMSUNG ELECTRONICS CO., LTD.
有点长,所以我使用了通配符`)
ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keymap $name custom_brightness"
现在还要/lib/udev/rules.d/95-keyboard-force-release.rules
在备份后添加一个规则
sudo cp /lib/udev/rules.d/95-keyboard-force-release.rules /lib/udev/rules.d/95-keyboard-force-release.rules.bak
sudo vim /lib/udev/rules.d/95-keyboard-force-release.rules
再次在制造商的其他条目下添加
ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keyboard-force-release.sh $devpath custom_test"
确保udev加载新规则
要加载新规则,请运行
sudo adevadm trigger
注意:(udevadm control --reload-rules
仍然在许多网站上的说明中)不起作用。
现在检查规则是否已成功应用
sudo /lib/udev/keymap -i input/event4
现在应该报告亮度键
scan code: 0x89 key code: prog1
scan code: 0x88 key code: prog2
重新映射“系统设置”中的键
如果最后一步报告了正确的键代码,则两个键都将自动开始工作(以防万一它们首先输入了错误的键代码)。
对于亮度,您仍然必须将按键绑定到脚本,现在可以使用系统设置>键盘>快捷方式。
请享用
注意事项: