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

在弄清楚如何使用udev更改扫描代码到密钥代码的映射之后,看到这个问题 ,我想知道这些密钥代码(或者如果你愿意的话)将如何映射到适当的操作。

因此,例如,如果按键盘上的音量调高 ,则会发送扫描代码,然后将其转换为volumeup键代码。 但是这个密钥代码是如何被截获的,卷被调高了,并显示了相应的通知?

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

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

好的,请访问https://help.ubuntu.com/community/MultimediaKeys

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

所以密钥代码映射到keysym,所以密钥的位置在哪里? 我找到并回答了这个问题: 这些天我在哪里可以找到所有X键盘的列表? 由于我们在讨论卷密钥,因此可以在XF86keysym.h中提到的源代码中的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正在拦截静音键, 静音键使Alsa和PulseAudio静音,但是只取消Alsa为有趣的解决方法做出的静音 。


请查看NotifyOSD https://wiki.ubuntu.com/NotifyOSD#Volume_changes

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

特别是这一个: 在此处输入图像描述

它表明有一个“硬件密钥监听器”接收表格DBus或HAL? 然后它“从系统中检索视觉元素”,声音和亮度图标位于Notify-OSD的源中,然后从那里制作气泡。


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

原始扫描码(例如e016)>键码(例如160)> keysym(例如XF86AudioMute)> gnome-settings-daemon(例如音量增加)> DBus信号>用于notify-osd的硬件键 – 侦听器(或其他)程序听力)

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

请看一下我写的关于在Ubuntu中备份键绑定的问题的答案: GNOME键盘快捷键存储在哪里? 我有一个备份或恢复所有键绑定的脚本,包括自定义键绑定。 如果您运行该脚本,您可以在dconf中查看存储键绑定的位置,以及哪个应用程序会收到有关键事件的通知。

答案与司机有关

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

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

驱动程序在其命令下驱动, 管理,控制,指示和监视实体 。 总线驱动程序使用总线做什么,设备驱动程序使用计算机设备(连接到计算机的任何硬件),如鼠标,键盘,显示器,硬盘,网络摄像头,时钟等。

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

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

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

链接:

  • 如果您有兴趣,我建议您阅读本系列驱动程序,其中包含linuxforu撰写的17篇精心撰写的文章: http : //www.linuxforu.com/tag/linux-device-drivers-series/ 。

  • 您可以阅读包含有关如何为USB键盘编写设备驱动程序的说明的特定文档: http : //www.emntech.com/docs/USB_KeyBoard_Driver_eMNTech.pdf

  • 如果您对Linux设备驱动程序非常兴奋,请阅读“Linux设备驱动程序”一书,该书以PDF格式免费提供: http : //lwn.net/Kernel/LDD3/