将快捷方式绑定到function/多媒体键时出现问题

我想将批处理脚本连接到快捷方式。 当我在系统设置>键盘>快捷方式下绑定它时,它可以使用每个键,但我的外部Apple键盘的亮度键除外。

亮度键在showkey中用键码224225识别。

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你可以用nanogedit替换它。

安装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-downbrightness-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请在命令中用geditnano替换它。


确定键盘

 /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退出此命令。

如果您的屏幕开始向下滚动,请按EscCtrl + 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 + F1Fn + 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记下部分。 有时候改变这个就足以解决问题了。

然而,亮度键通常具有与它们相关联的正确键码,并且这是不允许它们被重新映射的。 所以我们需要将它们更改为其他密钥代码。 我们将在本例中使用prog1prog2 ,因为这些在我的计算机上没有使用,但是如果你有一个带有F1F19键的Apple键盘,你也可以使用f13f24 ,或f20f24

  1. 创建自定义键映射
    使用合适的名称在目录/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 
  2. 创建自定义密钥发布文件。 只有当你改变你的笔记本电脑键盘时
    有时密钥释放事件未正确发送,导致计算机挂起。 为避免这种情况,我们还将编写自定义密钥发布文件

     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_IDID_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。