在Linux上使用X11捕获特定键的事件

3
我正在使用C++编写一个程序,用于在运行Linux发行版的MacBook Pro上实现OS X中的键盘背光功能。到目前为止,它会在启动时打开背光,并在未注册键盘和鼠标事件20秒后将其关闭,当检测到事件时,它会再次打开背光。接下来我需要让程序捕获按键事件,以便控制键盘背光的亮度,但我不确定如何处理。

我目前正在使用XScreenSaverQueryInfo获取键盘和鼠标事件的闲置时间,因此使用X11 API的方法是可以接受的。我已经做了很多搜索,但没有找到我确信可以使用的方法。我发现很多方法都使用键码来识别键,但我认为这不是一个可行的解决方案,因为该程序应适用于任何可用的键盘布局。

你有什么建议的方法和API?哪种方法最好?

谢谢!

2个回答

2

如果您还没有这样做,请熟悉xev。启动它,将焦点放在它上面,然后按键,以查看发生了什么。


2
这个操作的正常方式是使用XGrabKey()。它使用键码,但你不会硬编码键码,而是使用XKeysymToKeycode()获取它。更正确的做法是在收到MappingNotify(XMappingEvent)时重新进行抓取。(注意,是MappingNotify而不是MapNotify)。如果这些键没有一个键符号 - 在旧版本的X上可能没有,但是希望新的X.org版本有一个 - 那么你只需要硬编码键码。这样做可能不太健壮或可移植,但对于使用相同硬件模型的Linux上的每个人来说都可能有效。

要准备好键盘抓取是全局的,因此如果你尝试XGrabKey()并且其他程序已经抓取了该键,则会出现X错误 - 默认情况下会退出程序。XGrabKey()的另一个怪癖是它使用精确的修饰符集来抓取按键。例如,为了处理NumLock和非NumLock状态下的按键,你需要抓取两次。请参见 Global Hotkey with X11/Xlib

在正常的Linux设置中(如果您想将此功能引入上游项目),桌面环境不希望许多独立的应用程序争夺按键并出错。因此,会有一些中央协调点,例如窗口管理器或特殊守护进程会处理所有按键绑定并根据需要转发命令给其他进程。因此,如果您想将您的功能默认集成到发行版中,则可能需要查看修补其他特殊按键处理的上游代码。

另一个要注意的是Xkb API,这更加复杂。有某种方式可以使用Xkb 抓住按键,但我不知道采用这种方法的任何优势。


当您连接多个键盘时,通过“Xkb”路线进行操作变得非常重要,因为此时键码和键符不再容易映射到一起。 - Ulrich Schwarz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接