我正在使用Qt 5.3.2和一个名为gainput的输入处理库。Gainput 只能接受 XLib 事件,而不能接受 XCB 事件结构。最大的问题是Qt使用的是xcb。是否有一些将 xcb 事件移植到 xlib 事件的"简单"方法?
xcb_generic_event_t* xcbEvent = /* ... Poll/Wait for events ... */
XEvent* xlibEvent = GenericEventConvertionFunction(xcbEvent); // Something like this...
我认为没有一种简单的方法可以得到你想要的东西。
我不熟悉Qt,gainput或你的项目的性质,但你可以将现有的Xlib连接"转换"为xcb连接。通过这种方式,您可以混合使用Xlib和XCB调用。
Xlib 和 XCB 中只有一个可以管理事件队列。默认情况下,Xlib 会这样做。要更改此设置,请在进行其他调用之前调用XSetEventQueueOwner()(来自"Xlib-xcb.h")。
理想情况下,您可以首先创建一个 Xlib Display 对象,创建一个相应的xcb_display,将前者用于 Qt,轮询/等待后者并传递它 gainput
需要注意的一件事是,您只能以一种方式转换。
如何在给定xcb_connection_t对象的情况下获取显示对象?你不能。
如果此解决方案还不够。我知道没有解决你的问题的好方法。从好的方面来说,Xlib 和 xcb 事件等效性更低,因此手动转换不会太难(至少某些事件的大小不同,因此直接投射是不够的)
编辑
我相信几年前有人有过类似的问题。显然Display *display = QX11Info::display();
是你可以做的事情