在Linux上获取设备输入(鼠标、键盘等)

4
我正在构建跨平台游戏引擎,现在我专注于输入系统。我编写了一个抽象的输入系统,它将消息传递上去,并由运行在单独线程中的平台相关模块提供输入。
在Windows中,我创建了一个“仅消息”窗口,用于从RAWINPUT接收消息(转换为平台无关消息)并向输入系统提供输入。
现在,我正在努力找出如何在基于Unix的系统上执行类似的操作。有没有方便的获取内核输入(keyup、keydown、mousemove等)的方法?或者其他不需要显示任何窗口的方法?
编辑:我不希望我的输入系统依赖于渲染器。渲染器只应在应用程序焦点变化时通知输入...因此,我希望输入系统在不同的线程上运行。
3个回答

5

通常,跨平台输入是通过使用封装库来实现的--SDL是其中一个非常擅长的库,而且当前版本甚至是BSD许可证。

使用封装库的优点非常大,即使在Windows上使用自己的解决方案的游戏,在Linux上运行时也倾向于使用SDL作为封装库(这就是创建SDL的原始原因)。

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


我不想让我的输入系统依赖于我的渲染器。渲染器应该只在应用程序焦点改变时通知输入...因此,我希望输入系统在不同的线程上运行,而不是渲染器。不幸的是,SDL需要它们都在同一个线程中。 - relaxxx
我不知道SDL下是否有这样的限制。你为什么认为它存在?尝试在Google上搜索“sdl多线程”,有很多示例程序可以做到你所声称的不可能。 - n. m.

3
假设您正在使用X11:
Peter Hutterer撰写了一系列关于XInput2的文章(链接)。 显然支持原始事件
ManyMouse声称可以在没有窗口的情况下使用XInput2(链接)
在Unix系统上,如果可能的话,我们会尝试使用XInput2扩展。如果没有X服务器可用或X服务器不支持XInput2,则ManyMouse将尝试回退到其他方法。如果您想使用XInput2目标,请确保链接时使用“-ldl”,因为我们使用dlopen()查找X11 / XInput2库。您不必直接链接Xlib,并且如果库不存在于最终用户的系统上,则ManyMouse将优雅地失败(在ManyMouse XInput2驱动程序中报告没有鼠标)。当然,您需要在系统上安装X11头文件(在Ubuntu上,您需要apt-get install libxi-dev)。您可以使用SUPPORT_XINPUT2定义为零构建以完全禁用XInput2支持。请注意,XInput2目标不需要应用程序提供X11窗口。test_manymouse_stdio应用程序可以与此目标一起使用,只要X服务器正在运行即可。请注意,X11 DGA扩展与XInput2冲突(具体而言:SDL可能会使用它)。这是在SDL 1.2中处理此问题的好方法:
可能值得查看源代码。

0
在X Window系统中,有一个输入窗口的概念,这与Windows下的消息窗口或多或少是相似的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接