关键代码如何映射到适当的操作?


18

在弄清楚如何使用更改扫描代码到键控代码的映射之后udev,请参阅此问题,我想知道如何将这些键控代码(或事件,如果需要)映射到适当的操作。

因此,例如,如果您按下volume up键盘,则会发送扫描代码,然后将其转换为volumeup键码。但是,如何截获此关键代码,调高音量并显示相应的通知?

我的猜测是必须在某个地方调用脚本,因此我想知道这些脚本在哪里。

编辑:我提到的关键代码不要与xev返回的关键代码混淆,但我对那些也很感兴趣;)


3
我不同意,例如通知是非常特定于Ubuntu的,因此我想知道通知是如何发送的。我的猜测是必须在某个地方调用脚本,所以我想知道这些脚本在哪里。
Gerhard Burger

2
这是一个有效的特定于Ubuntu的问题,因为IIRC多年来Ubuntu的处理方式已发生变化。知道事件按热键触发适当的动作时,Ubuntu中的事件顺序是非常有趣的。可能的目的:自定义亮度控件,调试热键问题等
gertvdijk 2013年

2
@Seth似乎已过时。从10.04开始,很早以前就不推荐使用HAL。它还缺少有关如何触发桌面通知的信息。
gertvdijk

1
今天,我遇到了wiki.ubuntu.com/Hotkeys/Troubleshooting,它提供了一些不错的指针(有指向wiki.ubuntu.com/Hotkeys/Architecture的链接,它非常有用)。我认为斯蒂芬·奥斯特米勒(Stephen Ostermiller)的答案是正确的,但我想找到这些脚本并能够对其进行更改;)
Gerhard Burger 2013年

1
^^此信息似乎已过时,在gnome-settings-daemon下没有任何键绑定...尽管compiz部分下有很多亮度方面的问题(我猜测是统一的?)谁知道如何notify-osd工作?我认为那是发送亮度通知的地方……
Gerhard Burger

Answers:


6

好的,可以在https://help.ubuntu.com/community/MultimediaKeys找到

当您敲击键盘上的某个键时,Linux内核会为其生成原始扫描代码(如果已分配)。每个扫描码可以映射到一个键码。这是在内核级别。X具有(完全)完全独立的映射键的方式:X在启动时读取内核键码表,然后将键码映射到其独立的键码表(与内核键码相同,但不同:)。然后,每个键码都可以映射到一个键符,即代表一个键或建议一个动作的字符串。因此,要使我们的密钥完全起作用,它们需要一个内核扫描代码/密钥代码以及一个X密钥代码/密钥符号。看起来很奇怪,但是X开发人员有理由保留与内核分开的键盘映射。一点也不困难,只是一个繁琐的过程。

因此,键码映射到keyym,那么keyym在哪里?我找到了这个问题并回答了这个问题:这些天我在哪里可以找到所有X键符号的列表?由于我们在谈论音量键,因此可以XF86keysym.h在答案中提到的源代码中找到它。

在我计算机上的那个文件中,我发现了以下内容:

#define XF86XK_AudioLowerVolume 0x1008FF11   /* Volume control down        */
#define XF86XK_AudioMute    0x1008FF12   /* Mute sound from the system */
#define XF86XK_AudioRaiseVolume 0x1008FF13   /* Volume control up          */

奇怪...其他值不同,也许有多个系统可以处理密钥?http://crunchbang.org/forums/viewtopic.php?id=16656


我正在使用Xubuntu,并且要控制按键,我需要手动映射操作(例如,如何更改xubuntu中的键盘快捷键?)。但是,通知似乎是独立的,好像它们是在按键上拾取并采取相应的操作一样。这可能意味着Ubuntu中的其他程序是以这种方式设置的,因此不需要将脚本映射到按键。

因此,我很确定程序现在可以使用该键(因此找不到脚本)。

在Xubuntu中,我遇到了Pulse Audio和使用自定义脚本更改音量的问题,似乎Pulse截获了Mute键,Mute键使Alsa和PulseAudio静音,但仅取消Alsa的静音解决方法。


检查有关NotifyOSD的内容https://wiki.ubuntu.com/NotifyOSD#Volume_changes

如果您查看这些图:https : //wiki.ubuntu.com/NotifyOSD#Architecture

特别是这个: 在此处输入图片说明

它表明有一个“硬件按键侦听器”接收DBus或HAL形式?然后,它“从系统中检索视觉元素”,其中声音和亮度图标位于Notify-OSD的源中,然后从那里创建气泡。


这一切都令人困惑,但据我所知(到目前为止):

原始扫描码(例如e016)>键码(例如160)>键符(例如XF86AudioMute)> gnome-settings-daemon(例如音量提高)> DBus信号>用于notify-osd的硬件键监听器(或其他)节目监听)


看起来这已经到了!从一开始就被标记为CW,所以我想您还在改进?:)
gertvdijk

是的,我需要进一步研究,该图中有很多问号。
Mateo,

顺便说一句,您是否偶然将其纳入社区Wiki答案?也许要求mod撤消它...哦,那些图形很可能有点过时了,因为HAL早已弃用了……至少我们到了:D
Gerhard Burger


@gertvdijk我知道,但是这对于他将要错过的所有投票都是可耻的;)
Gerhard Burger

1

在大多数情况下,没有运行脚本。它们导致事件被发送到窗口管理器或设置守护程序。在此过程中,我唯一了解脚本是在配置自定义键绑定时。对于自定义键绑定,可以添加命令行(可执行文件或脚本)并将其绑定到键。

请参阅我写给有关在Ubuntu中备份键绑定的问题的答案:GNOME键盘快捷方式存储在哪里? 我有一个脚本来备份或还原所有键绑定,包括自定义键绑定。如果运行脚本,则可以看到dconf中的键绑定存储在哪里,以及哪个应用程序收到有关键事件的通知。


那么如何触发桌面通知?
Gerhard Burger 2013年

我相信gnome设置守护程序负责在例如音量和亮度的情况下触发它们。
Stephen Ostermiller 2013年

2
我运行了您的脚本,但是似乎要做的就是获取可以通过“ 系统设置”>“键盘”>“快捷方式”访问的快捷方式,例如,我没有找到任何有关亮度的参考。
Gerhard Burger

获取快捷键的很酷的脚本。
Mateo,

0

答案与司机有关

每个硬件都必须具有驱动程序才能与操作系统进行交互。

引用http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/

驱动程序在其命令下驱动,管理,控制,引导和监视实体。总线驱动程序对总线的作用,设备驱动程序对计算机设备(与计算机连接的任何硬件)(例如鼠标,键盘,监视器,硬盘,网络摄像头,时钟等)的作用。

此外,“飞行员”可以是人,甚至可以是由人监视的自动系统(例如,客机中的自动驾驶系统)。同样,特定的硬件可以由一个软件(设备驱动程序)控制,也可以由另一个硬件设备控制,而另一个硬件设备又可以由软件设备驱动程序进行管理。在后一种情况下,这样的控制设备通常称为设备控制器。作为设备本身,它通常还需要一个驱动程序,通常称为总线驱动程序。

设备具有设备寄存器,该寄存器存储控制/状态位和数据位。每当需要传输某些数据时,通常通过设置数据位来发送。

因此,每当您按下键盘上的某个键时,就会在寄存器中写入一些数据。这些位由设备驱动程序读取,并执行适当的操作。这是简短的解释。

链接:


3
嗯...我不认为驾驶员实际上对我在键盘上按下的键的含义有任何了解。笔记本电脑中的某些特殊热键设备可能需要驱动程序-但这不包括“多媒体”之类的常规多媒体热键。这必须在kernel / X / DE的更常见区域中进行介绍。我还认为有关Linux kerner设备驱动程序编程的参考资料非常广泛。
gertvdijk

我认为对于大多数现代键盘,Ubuntu都使用该evdev驱动程序,但是我看不出这有什么用处……
Gerhard Burger 2013年
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.