将快捷方式绑定到function/多媒体键时出现问题
我想将批处理脚本连接到快捷方式。 当我在系统设置>键盘>快捷方式下绑定它时,它可以使用每个键,但我的外部Apple键盘的亮度键除外。
亮度键在showkey中用键码224和225识别。
xev输出:
FocusOut event, serial 41, synthetic NO, window 0x4000001, mode NotifyGrab, detail NotifyAncestor FocusIn event, serial 41, synthetic NO, window 0x4000001, mode NotifyUngrab, detail NotifyAncestor KeymapNotify event, serial 41, synthetic NO, window 0x0, keys: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
有什么建议我可以做什么?
使用halevt的解决方案
根据手册页, halevt
是HAL事件的通用处理程序。 它被弃用并被udev
取代,但由于我对udev
了解不够,我会给出一个halevt
解决方案。
编辑:经过一些严重的汗水,我设法在udev
做到这一点。 看到我的其他答案 。
我将使用vim
编辑文件,但如果你不知道vim
你可以用nano
或gedit
替换它。
安装halevt
sudo apt-get update && sudo apt-get install halevt
确定要绑定到脚本的事件
停止已经运行的halevt
守护进程:
sudo /etc/init.d/halevt stop
现在看看halevt
可以识别你想要使用的键的事件,启动监听器:
sudo -u halevt halevt -fig:plugdev
现在按键盘上要绑定脚本的function键。 我知道OP希望让亮度键正常工作,所以让我们继续吧。 亮度键的输出应如下所示:
Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-down) Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-up)
您可以看到brightness-down
和brightness-up
事件已传输。
将事件绑定到脚本
现在编辑文件/etc/halevt/halevt.xml
:
sudo vim /etc/halevt/halevt.xml
并添加以下行(我在底部,在 ):
当然,您应该将value
更改为您从侦听器获取的事件,并通过您要执行的命令执行exec
。
授予halevt用户执行命令或脚本的权限
由于halevt
守护程序作为halevt
用户运行,因此您必须授予其执行您在exec
指定的权限的权限。
运行(记得用您选择的编辑器替换vim
)
sudo EDITOR=vim visudo
并在底部添加以下行
halevt ALL=(root) NOPASSWD: /home/user/brightness-script.sh
并保存并退出。
确保您的脚本可执行
sudo chmod +x /home/user/brightness-script.sh
再次启动halevt守护程序
sudo /etc/init.d/halevt start
它应该工作!
解决方案使用udev
由于HAL已被弃用且现在使用了udev
,因此这种方法比我的其他答案更受欢迎 (尽管我认为使用HAL的解决方案更简单)。
但是对于许多function键,您只需使用系统设置>键盘>快捷键来绑定脚本,请先试试! 它可以为您节省很多麻烦。 例如,亮度键不起作用(我不知道为什么不这样做),所以如果你想知道如何改变亮度键的行为,请继续阅读。
注意 :如果您运行的是三星笔记本,则可以通过安装http://www.voria.org/forum/上的samsung-tools
软件包修复所有(取决于型号)function键。
本文假设您了解如何使用终端,并使用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接收器处理的(输入/ event7原来是我的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
确定function键的当前映射
现在我们可以通过听键盘来确定当前的键映射(插入正确的数字)
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
在最后一种情况下,您仍然可以滚动,但是如果您按下function键,它们应该进入~/keymap.log
,您可以在以后阅读它们。
现在我们可以通过按下它们来检查function键的当前映射,这应该给你一个列表(这是我的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_
以小写forms记下部分。 有时候改变这个就足以解决问题了。
然而,亮度键通常具有与它们相关联的正确键码,并且这是不允许它们被重新映射的。 所以我们需要将它们更改为其他密钥代码。 我们将在本例中使用prog1
和prog2
,因为这些在我的计算机上没有使用,但是如果你有一个带有F1到F19键的Apple键盘,你也可以使用f13
到f24
,或f20
到f24
。
-
创建自定义键映射 :
使用合适的名称在目录/lib/udev/keymaps
创建一个keymap文件,查看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
来做到这/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
重新映射系统设置中的键
如果最后一步报告了正确的密钥代码,则密钥开始自动工作(如果它们首先使用了错误的密钥代码)。
对于亮度,您仍然必须将键绑定到一个脚本,现在可以使用系统设置>键盘>快捷键 。
请享用
备注 :
-
如果您的密钥有错误的密钥代码并通过这种方法修复,请按照
/usr/share/doc/udev/README.keymap.txt.gz
的说明操作(您可以打开它而无需使用zless
提取)并发送结果那里提到的电子邮件adres,然后更改可以包含在下一个版本中。 很多用户都会受益! -
非常感谢Vaidas Jablonskis的这篇有用的post。