【问题标题】:Xlib keyboard pollingXlib 键盘轮询
【发布时间】:2013-01-06 21:46:21
【问题描述】:

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

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

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

【问题讨论】:

  • “事件方法从一个平台到另一个平台如此不同”......什么?我相当确定它们都是基于“key down”和“key come up”...
  • 我建议您研究 SDL 或 SFML 以抽象出这类事情。
  • 你甚至不能轮询 /dev/input/eventX,我的意思是这个名字本身已经表明它是基于事件的。

标签: linux opengl input xlib


【解决方案1】:

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

方便的是,select 提供了超时机制,因此您也可以很容易地停止定期等待以执行其他操作(例如绘图)。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      相关资源
      最近更新 更多