我的二进制文件是否可以对Linux中的某些全局热键作出反应?
是否可以监听某个热键(例如Ctrl-I)然后执行特定操作?我的应用程序是用C编写的,只能在Linux上运行,并且没有GUI。是否有任何图书馆可以完成此类任务?
编辑:例如,amarok具有全局快捷方式,因此,例如,如果将键的组合映射到某个动作(比如说Ctrl +-,Ctrl和+),则可以执行该动作当我们按下按键时。如果我将Ctrl- +映射到音量增加动作,则每次按ctrl- +音量都会增加一定量。
谢谢
解决方案
回答
热键需要多大范围?他们在X会话中成为全局对象就足够了吗?在这种情况下,我们应该能够打开Xlib连接并侦听所需的事件。
通常,X中的键盘事件会传递到当前具有焦点的窗口,并在层次结构中传播,直到得到处理。显然,这不是我们想要的。我们需要先处理事件,然后再打开其他任何窗口。我们需要在根窗口上使用热键的键码和修饰符调用XGrabKey来完成此操作。
我在这里找到了一个很好的例子。
回答
在UNIX中,我们可以通过终端访问命令行shell。这可以追溯到人们实际上通过直接连接到机器的终端(例如,通过串行电缆)访问大型共享计算机的时代。
实际上," xterm"程序或者我们在UNIX机器上使用的任何衍生程序都被正确地称为其行为的终端仿真器(从我们和操作系统的角度而言),它们类似于那些老式的终端之一机器。
由于存在许多不同类型的终端,这使以有趣的方式处理输入变得有些复杂,并且UNIX系统必须了解每种类型的功能。这些功能传统上存储在termcap文件中,我认为更多现代系统会改用terminfo。尝试
man 5 terminfo
在Linux系统上获得更多信息。
现在,好消息是,我们无需对终端功能等做太多的事情,即可拥有一个命令行应用程序,该应用程序可以使用输入或者窗口功能来完成有趣的事情。有一个图书馆,诅咒会有所帮助。抬头
man 3 ncurses
在Linux系统上获取更多信息。我们也许可以找到有关在线使用诅咒的不错的教程。
回答
一种方法是让应用程序在特定端口或者套接字文件上侦听传入的请求。
然后,我们可以编写一个小型客户端应用程序,该应用程序连接到该端口或者套接字文件,并将命令发送到正在运行的应用程序。
然后,我们可以配置窗口管理器以绑定某些组合键以启动小型客户端应用程序。
回答
我认为smoofra在这里是正确的轨道;我们正在向X注册全局热键,以便可以拦截按键并采取适当的措施。我认为Xlib可能就是我们想要的,而XGrabKey是函数。
恐怕这不容易学习。我确实找到了这个似乎有用的示例:TinyWM。我还找到了一个使用Java / JNI的示例(访问相同的基础Xlib函数)。
回答
我们应该查看xbindkeys的源代码。
Xlib编程非常神秘,很难找到文档,并且存在细微的可移植性问题。复制一些经过战斗力增强的代码会更好。