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


8

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

在显示键中使用键代码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 

有什么建议我可以做什么?

Answers:


6

使用harevt的解决方案

根据手册页,halevt是HAL事件的通用处理程序。它已被弃用,并由代替udev,但是由于我对此不太了解,因此udev我将给出一个halevt解决方案。

编辑:经过大量的汗水,我设法在做到了udev。看到我的其他答案

我将vim用来编辑文件,但是如果您不知道vim可以用nano或替换它gedit

安装harlevt

sudo apt-get update && sudo apt-get install halevt

确定要绑定到脚本的事件
停止halevt已经运行的守护程序:

sudo /etc/init.d/halevt stop

现在查看是否halevt可以识别您要使用的键的事件,启动侦听器:

sudo -u halevt halevt -fig:plugdev

现在,按下要绑定脚本的键盘上的功能键。我知道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

并添加以下几行(我在最下面的底部</halevt:Configuration>):

<halevt:Device match="hal.info.category = input">

    <halevt:Condition name="ButtonPressed" value="brightness-up" exec="sudo /home/user/brightness-script.sh up"/>

    <halevt:Condition name="ButtonPressed" value="brightness-down" exec="sudo /home/user/brightness-script.sh down"/>

</halevt:Device>

当然,您应该在哪里更改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

它应该正在工作!


完美地工作。再次感谢您的准确答复。
remi

不客气,还看到我的新的答案使用udev。但是请随时使用其他解决方案,重要的是它正在起作用;)
Gerhard Burger 2013年

E: Unable to locate package halevt在14.04。
umpirsky 2014年

由于不再包含Ubuntu 13.10 halevt(packages.ubuntu.com/search?keywords=halevt
Gerhard Burger

11

使用udev的解决方案

由于不赞成使用HAL,udev现在使用了HAL ,因此该方法优于我的其他答案(尽管我认为使用HAL的解决方案更简单)。

但是,对于许多功能键,您只需使用“ 系统设置”>“键盘”>“快捷键”来绑定脚本,请首先尝试!它为您省去了很多麻烦。例如,亮度键不起作用(我不知道为什么不这样),因此,如果您想知道如何更改例如亮度键的行为,请继续阅读。

注意:如果您正在运行三星笔记本电脑,则可以通过samsung-toolshttp://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

如果屏幕开始非常困难地向下滚动,请按EscCtrl+ c几次,然后按

sudo /lib/udev/keymap -i input/event4 2> /dev/null

或者,如果您仍然遇到滚动问题

sudo /lib/udev/keymap -i input/event4 > ~/keymap.log

在最后一种情况下,您仍然可以滚动,但是如果您按功能键,它们应该进入~/keymap.log以后可以阅读的地方。

现在,我们可以通过按功能键来检查它们的当前映射,这将为您提供一个列表,例如(这是我的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_在小写后记下该部分。有时更改此设置足以解决问题。

但是,亮度键通常具有与之关联的正确键码,这是不允许重新映射它们的原因。因此,我们需要将它们更改为其他键码。我们将使用prog1prog2在这个例子中,因为这些都不在我的电脑上使用,但您也可以使用f13通过f24,或者f20通过f24如果有一个有Apple键盘F1通过F19按键。

  1. 创建一个自定义键盘映射
    在目录中/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
    
  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,因此进行备份很聪明

同样,我们有两个选择:

  • 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),然后将结果发送到此处提到的电子邮件地址,然后更改将包含在下一个版本中。许多用户将受益!

  • 非常感谢Vaidas Jablonskis的这篇有用的帖子。


1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky

感谢您的评论,我调查了它,看来udev将被合并到systemd中,而键盘映射设置将在hwdb中进行管理。根据bbs.archlinux.org/viewtopic.php?id=168720的描述,可以从较早版本的systemd中提取findkeyboards,但是我不确定其余答案是否仍然适用...
Gerhard Burger
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.