首页 > 解决方案 > Xlib XEventQueue 并不总是包含所有事件

问题描述

希望这不是一个错误,只是我对 Xinput 应该如何工作的误解。

我一直在写游戏,我正在使用 Xlib 从键盘获取输入。奇怪的是,一些 KeyRelease 事件似乎无限期地卡在 XServer 中,直到另一个事件发生并将该事件推送到队列中。

如果我一次混合 3 个按钮(向左、向上和向右箭头),我可以做到这一点。具有讽刺意味的是,我只能使用向左箭头键来实现它。但我已经在不同的机器上复制了它。

我曾经XPending()检查过事件队列,以及XCheckMaskEvent()他们俩,似乎认为队列是空的。但可以肯定的是,当我按下另一个键(例如rightKeyRelease 事件)时,left恰好同时发生。

这是一个错误吗?还是预期的功能?

这是实际的代码

loop do
  Fiber.yield
  next if (event = display.check_mask_event(KeyPressMask | KeyReleaseMask)).nil?
  case event
  when KeyEvent
    kcode = event.lookup_keysym event.state & ShiftMask ? 1 : 0
    return {event.type, kcode}
  else
    next
  end
end

标签: game-enginex11keyboard-eventscrystal-langxinput

解决方案


推荐阅读