1

我正在开发一个多平台 OpenGL 应用程序,为此我在 Linux 下使用 Xlib。我知道 Xlib 输入处理是基于事件的,但是我的程序已经做了自己的事件处理,我更希望能够轮询 xserver 以获取自上次轮询以来在活动窗口下按下或引发的任何键.

如果我必须在 X 下使用基于事件的输入处理,我必须对其他平台做同样的事情,同时重写大量代码,因为事件方法在一个平台与另一个平台之间是如此不同。轮询确实会为我简化事情,但我担心这样的事情会产生大量开销,而且我什至无法获得有关应该如何完成的信息。我曾想过直接检查 /dev/input/eventX 节点,但这可能会使事情变得更复杂,而不是简化。

我真正想知道的是如何有效地轮询 Linux 系统上的键盘状态。我是否在 Xlib 上浪费时间,我应该考虑其他技术或库吗?

4

2 回答 2

2

为了有效地进行轮询,我通常使用select(on ConnectionNumber) 来等待与 X 的连接发生某些事情,然后在XPending我使用XNextEvent抓取东西的时候。不要调用XNextEvent除非XPending,否则它会阻塞。

方便的是,select它提供了一个超时机制,因此您也可以很容易地停止定期等待去做其他事情(比如绘图)。

于 2013-01-06T22:16:09.037 回答
0

轮询意味着,您将在程序中的某处有一些循环。使用 XPending 检查服务器是否有新内容(这是您的投票),然后使用 XNextEvent 读取它。

于 2013-01-06T23:29:29.933 回答