从内核模块启动图形应用程序?

从内核模块启动图形应用程序?

我目前的问题是:在我的 Acer Nitro 笔记本电脑键盘上,有一个 Nitro 键 - 这是其他笔记本电脑品牌没有的特殊键。您可以在下图中看到退格键旁边有一个奇怪的 N 键 - 这就是 Nitro 键。

硝基键

我想开发一个 GUI 应用程序,以便每当按下 Nitro 按钮时,我的应用程序就会显示。我使用的是 Ubuntu 22.04。

根据我的发现,我认为我必须编写一个 LKM 来捕获 Nitro 按键事件并从那里启动应用程序。我在这里关注答案(https://stackoverflow.com/questions/33836541/linux-kernel-how-to-capture-a-key-press-and-replace-it-with-another-key)来捕获按键事件。

我想知道是否可以在 LKM 中启动 GTK 应用程序 - 换句话说,将示例代码放在这里(https://www.gtk.org/docs/getting-started/hello-world)在我的内核模块代码中。另外,我想知道我是否走在实现目标的正确道路上。

提前致谢!

[更新]澄清我想要的内容:Acer Nitro 笔记本电脑通常有一个名为 Nitrosense 的应用程序,它提供了一个 GUI 来更改键盘颜色和风扇速度。按下 Nitro 键后,用户会看到 GUI。然而,Nitrosense 应用程序仅适用于 Windows - 我想为 Ubuntu 编写同样的东西。到目前为止,我发现了各种关于更改键盘颜色和风扇速度的存储库,但是没有用于当我按下 Nitro 键时打开的应用程序的存储库,所以我想构建这样的东西。我在 Ubuntu 22.04 上使用 GNOME 42。我想要的是每当用户(已经登录)按下 Nitro 键时,就会自动显示一个 GUI 供我执行操作。

[更新2]我还找到了这个仓库https://github.com/kphanipavan/PredatorNonSense这似乎试图做与我对另一个宏碁品牌的担忧相同的事情。我认为这可能会有所帮助,会看到的。

[更新3]这是我使用时发现的事件evtest 硝基键 evtest 事件

然而,当我尝试时xev,没有打印任何内容,这让我认为 X Server 无法识别 Nitro 按键事件。我想我应该寻找文档来编写一个模块来将 Nitro 按键事件发送到 X Server?

我尝试转到 GNOME 控制中心的键盘设置来尝试添加键盘快捷键,但它也无法识别 Nitro 键 - 也许是因为 GNOME 运行在 X Server 上,而 X Server 无法识别 Nitro 键事件?

我还查看了 UPD2 中提到的存储库,因此作者所做的也是通过连续轮询grep日志来evtest查看是否按下了该键 - 查看此 shell 命令https://github.com/kphanipavan/PredatorNonSense/blob/master/PNS.sh

我想我还可以做的是编写一个简单的 systemd 服务来轮询键盘设备文件并检查 Nitro 是否被按下。然而,有人提到这可能会浪费大量资源。对此有什么建议吗?

答案1

我想开发一个 GUI 应用程序,以便每当按下 Nitro 按钮时,我的应用程序就会显示。

因此,您需要将 Nitro 按钮公开为内核输入层事件。然后一些用户空间应用程序可以对其进行操作并启动您的 UI 应用程序。

请记住,Linux 是多用户的,该系统是为您拥有一台机器和数十人使用具有不同帐户的 GUI 的情况而设计的。所以你不能只是“启动一个应用程序”,你需要找到合适的用户。但内核与用户无关。

这意味着必须针对该特定用户采取一些行动。最简单的放置位置是该特定用户(我假设是您)的窗口管理器配置。

我想知道是否可以在 LKM 中启动 GTK 应用程序

这是不行的,也是行不通的。


资源:

用于evtest查看是否Nitro已产生按键事件。如果是这样,您就不必编写内核模块。然后用它xev来查看它是否已被转换为 X 事件。

如果它不产生按键事件,那么对实际事件的搜索将会变得有趣......

最后,找出您的桌面使用的窗口管理器,然后在谷歌中搜索窗口管理器的文档,并了解如何针对特定按键启动程序。


(顺便说一句,通常最好只粘贴由四个空格缩进的文本而不是图像)

这是代码 425 的普通按键和释放事件KEY_PRESENTATION

如果您想制作自己的键盘布局,将此代码映射到 X 键符号,我建议您阅读不可靠的 XKB 配置指南 (2004)。使用新名称复制现有布局,然后对其进行修改,这样当系统包更新时您就不会丢失它。

如果您想要一个小型用户空间程序来侦听该键,请选择一种带有内核输入层库的语言,例如Python。确保使用/dev/input/by-path/...与您的键盘相对应的符号链接,/dev/input/eventX数字在不同的启动中并不稳定。

答案2

考虑到您的系统可能已经配置了热管理(通过 ACPI Thermald 守护进程或其他),我绝对不会尝试在其后面玩风扇速度。


关于更改键盘颜色的功能,您的写法是正确的,这只能通过某些适当的设备驱动程序来完成。
您的键盘(几乎肯定是某些 HID 兼容设备)必须向内核公开一些输出设备(不同于输入与键盘按键传输相关的设备)如果想要向键盘发送任何命令,则需要正确处理)

您可以从以下内容中获取灵感Acer Gaming RGB 键盘背光和 Turbo 模式 Linux 内核模块

这基本上应该旨在公开 /sys/devices 树中的控件。

您对这些控件的操作方式将由您在用户空间决定,从大胆地呼应 /sys/devices 控件到任何 gtk 小部件的概念。
使用任何键盘键(包括特殊的 Nitro 键)激活此功能是一个简单的键盘映射问题,您的 DE 可能能够通过基本系统设置来处理。

相关内容