在了解如何使用 更改扫描码到键码的映射后udev
,请参阅这个问题,我想知道这些键代码(或者事件)是如何映射到适当的操作的。
例如,如果您按下volume up键盘上的某个按钮,就会发送一个扫描代码,然后将其转换为volumeup
键控代码。但是,如何截取该键控代码、调高音量并显示相应的通知呢?
我猜测某个地方一定调用了一个脚本,所以我想知道这些脚本在哪里。
编辑:我提到的密钥代码不应与密钥代码返回相混淆xev
,但我对这些也很感兴趣;)
答案1
好的,找到了https://help.ubuntu.com/community/MultimediaKeys
当您按下键盘上的某个键时,Linux 内核会为其生成原始扫描码(如果已分配)。每个扫描码都可以映射到一个键码。这是在内核级别。X 有一种(准)完全独立的键映射方式:X 在启动时读取内核键码表,然后将键码映射到其独立的键码表(它与内核键码相同但不同 :))。然后,每个键码都可以映射到一个键符,即代表键或建议操作的字符串。因此,要使我们的键完全发挥作用,它们需要一个内核扫描码/键码加上一个 X 键码/键符。这可能看起来很奇怪,但 X 开发人员有理由将键盘映射与内核分开。这并不难,只是一个相当繁琐的过程。
因此,键码被映射到键符,那么键符在哪里呢?我从这个问题中找到了答案:哪里可以找到目前所有 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 拦截了静音键,静音键可使 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(例如 volume-up)> DBus 信号 > hardware-keys-listener 用于通知 osd(或其他程序监听)
答案2
在大多数情况下,没有运行脚本。它们会导致事件发送到窗口管理器或设置守护程序。我唯一知道脚本参与此过程的情况是配置自定义键绑定时。对于自定义键绑定,您可以添加命令行(可执行文件或脚本)并将它们绑定到键。
请参阅我针对有关在 Ubuntu 中备份键绑定的问题所写的答案:GNOME 键盘快捷键存储在哪里? 我有一个脚本可以备份或恢复所有按键绑定,包括自定义按键绑定。如果运行该脚本,您可以看到按键绑定存储在 dconf 中的哪个位置,以及哪个应用程序会收到按键事件通知。
答案3
答案与驱动程序。
每个硬件都必须有一个驱动程序才能与操作系统交互。
引用http://www.linuxforu.com/2010/11/understanding-linux-device-drivers/:
司机开车,管理、控制、指挥和监督实体在其命令下。总线驱动程序对总线所做的工作,与设备驱动程序对计算机设备(连接到计算机的任何硬件)所做的工作相同,例如鼠标、键盘、显示器、硬盘、网络摄像头、时钟等等。
此外,“飞行员”可以是人,也可以是人监控的自动系统(例如,客机上的自动驾驶系统)。同样,特定的硬件可以由软件(设备驱动程序)控制,或者可以由另一个硬件设备控制,而另一个硬件设备又可以由软件设备驱动程序管理。在后一种情况下,这种控制设备通常称为设备控制器。它本身就是一个设备,通常还需要一个驱动程序,通常称为总线驱动程序。
设备有一个设备寄存器,用于存储控制/状态位和数据位。每当需要传输某些数据时,通常通过设置数据位来发送。
因此,每当您按下键盘上的某个键时,一些数据就会写入寄存器。设备驱动程序会读取这些位并执行适当的操作。这是简短的解释。
链接:
如果你有兴趣,我建议你阅读这个关于设备驱动程序的系列文章,该系列由 17 篇精心撰写的文章组成,linuxforu: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/