我正在用C编写一个程序,以在运行Linux发行版的MacBook Pro上从OS X实现键盘背光功能.到目前为止,它会在启动时打开背光,并且如果在20秒钟内未注册任何键盘和鼠标事件,它将关闭背光,当然,在注册事件时会再次打开背光.我需要程序做的下一件事是捕获键盘上的背光上/下键的按键,但是我不确定该如何处理.
我目前正在使用XScreenSaverQueryInfo来获取键盘和鼠标事件的空闲时间,因此使用X11 API的方法是可以的.我做了很多谷歌搜索,但还没有找到我确定要继续的方法.我发现的许多方法存在的问题是,它们使用键码来标识键,但是我认为这不是可行的解决方案,因为该程序应适用于任何可用的键盘布局.
对我应该使用的方法和API有任何想法吗?什么才是最好的?
问候,
解决方法:
正常的方法是使用XGrabKey().它使用键码,但是您不会对键码进行硬编码,可以通过XKeysymToKeycode()获得.为了更正确,您还希望在获得MappingNotify(XMappingEvent)时重做抓取. (请注意,MappingNotify,而不是MapNotify.)如果这些键没有键符-可能不是旧的X版本上的键符,但是希望新的X.org版本有一个键符-那么您只需对键码进行硬接线即可.它不会非常健壮或可移植,但可能适用于具有相同硬件模型的Linux上的每个人.
请准备好全局获取键,因此,如果您尝试XGrabKey()并且其他东西已经获取了该键,您将收到X错误-默认情况下退出该程序. XGrabKey()的另一个怪癖是它使用精确的修饰符集来获取键.例如,要同时使用NumLock和不使用NumLock,都需要抓取两次.查看Global Hotkey with X11/Xlib
在普通的Linux安装程序中(如果您想在上游项目中获得类似的功能),桌面环境不希望有很多单独的应用程序在争夺按键并出错.因此,将有一些*协调点,例如窗口管理器或特殊的守护程序可能会执行所有键绑定,并根据需要将命令转发给其他进程.因此,如果您尝试将功能默认集成到发行版中,那么您可能希望考虑修补处理此类特殊键的相同上游代码.
要注意的另一件事是Xkb API,它复杂得多. Xkb有一些可以弯腰的方式来获取密钥,但是我不知道采用这种方式有什么好处.