在LINUX上获取设备输入(鼠标,键盘......)

时间:2012-01-30 13:08:19

标签: c++ linux raw-input

我正在构建跨平台游戏引擎,现在我专注于输入系统。

我写了一个抽象的输入系统来传递消息 并且由平台相关模块提供,在单独的线程中运行。

在Windows中,我创建了“仅消息”窗口,该窗口提供输入 系统与RAWINPUT的消息(转换为平台无关)。

现在我在基于unix的系统上弄清楚如何做类似的事情时遇到了麻烦。 有没有方便的方法从内核获取输入(keyup,keydown,mousemove ...)? 或者任何其他方式,而不需要显示任何窗口?

修改

我不希望我的输入系统依赖于我的渲染器。渲染器应该通知 应用程序焦点更改时输入...所以我希望输入系统在与渲染器不同的线程上运行。

3 个答案:

答案 0 :(得分:5)

通常使用包装器库实现跨平台输入 - SDL是非常好的,当前版本甚至是BSD许可。

使用包装器的优势是如此之大,即使在Windows上使用自己的解决方案的Windows游戏也倾向于在Linux上运行时使用SDL作为包装器(这是SDL创建的原始原因)。

因此,在最坏的情况下,您可以将您的库保留在Windows上,并使用SDL专门用于* nix系统。

答案 1 :(得分:3)

假设你正在使用X11:

Peter Hutterer有series of XInput2 articles。显然支持raw events

ManyMouse claims to use XInput2 without a window

  
      
  • 在Unix系统上,我们尽可能尝试使用XInput2扩展。   如果没有X服务器,ManyMouse将尝试回退到其他方法   可用或X服务器不支持XInput2。如果你想使用   XInput2目标,请确保链接“-ldl”,因为我们使用dlopen()   找到X11 / XInput2库。您不必链接Xlib   直接,而ManyMouse将优雅地失败(报告没有鼠标   ManyMouse XInput2驱动程序)如果最终用户的库不存在   系统。当然,你需要系统上的X11接头(在Ubuntu上,   你想要apt-get install libxi-dev)。你可以用   SUPPORT_XINPUT2定义为零以完全禁用XInput2支持。   请注意,XInput2目标不需要您的应用提供X11   window. test_manymouse_stdio应用程序适用于此目标,只要   X服务器正在运行。请注意,X11 DGA扩展与   XInput2(具体来说:SDL可能会使用它)。这是一个很好的处理方式   这在SDL 1.2中:
  •   

可能值得查看来源。

答案 2 :(得分:0)

在X Window系统下,有一个仅输入窗口的概念,它或多或少与Windows下的仅消息窗口的窗口并行。