2013-01-06 63 views
1

我正在开发一个多平台的OpenGL应用程序,为此我在Linux下使用Xlib。我明白Xlib输入处理是基于事件的强烈的,但我的程序已经做了自己的事件处理,而且我更愿意轮询xserver以查找自上次轮询以来在活动窗口下按下或提出的任何键。Xlib键盘轮询

如果我必须在X下使用基于事件的输入处理,那么在重写大量代码时,我必须对其他平台执行相同的操作,因为事件方法对于不同的平台而言是如此不同。轮询会真正为我简化一些事情,但是恐怕会有这样的事情发生,而且我还没有能够获得有关应该如何完成的信息。我想直接检查/ dev/input/eventX节点,但这可能会使事情更加复杂,而不是简化。

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

+0

“事件方法从一个平台到另一个平台是如此不同”......什么?我*相当*确定他们都基于“钥匙落下”和“钥匙出现”... –

+0

我建议你调查SDL或SFML来抽象出这种事情。 – singpolyma

+0

你甚至不能轮询/ dev/input/eventX,我的意思是这个名字本身已经表明它是基于事件的。 – datenwolf

回答

1

为了有效地轮询,我通常使用select(上ConnectionNumber),要等到事情发生在连接到X,然后同时XPending我用XNextEvent抢东西。请勿拨打XNextEvent,除非XPending否则会阻止。

方便地,select提供了一个超时机制,所以你也可以停止周期性地等待做其他事情(比如绘图)。

0

轮询意味着,你的程序中会有一些循环。使用XPending来检查服务器是否有新东西(这是您的投票),然后使用XNextEvent来读取它。