集成XCB和libX11事件循环 - 挂在Xt

时间:2015-06-11 08:01:49

标签: qt events x11 xcb motif

我正在尝试将两个代码体集成到同一个进程中,每个进程都有各自的GUI工具包的独立事件循环 - 其中一个使用Xt,另一个使用Qt5。目的只是为了能够显示Qt子窗口,而不是像现在已经不存在的Qt / Motif集成扩展那样实现完全集成。

我已经能够构建一个使用标准Qt事件循环运行的原型原型,并使用本机事件过滤器将XCB事件转换为XEvents(使用XESetWireToEvent +其处理程序从xEvents / X11有线格式转换)。然后使用XtDispatchEvent()将这些XEvent直接调度到Xt。此时,我可以运行该程序,并在同一程序中创建Xt / Motif小部件和Qt小部件,使用菜单,绘制2D图形,并使用Qt&主题小部件。

我遇到的问题是,在创建新的Motif对话框时会有很长的延迟。我已经将它跟踪到libXt中的_XtWaitForSomething(),最终归结为X服务器连接套接字上的select()或poll()。由于XtManageChild()内部发生的窗口布局管理,会发生对_XtWaitForSomething()的调用。 _XtWaitForSomething()似乎正在检查事件队列中是否有待处理的事件。

我有很多问题:

  1. 在同一程序中同时使用XCB和libX11调用(使用XCB作为事件队列主控)时,我可以预期来自经典Xlib的调用也能正常工作 - 例如通过libX11调用将事件发布到XCB事件队列,或通过旧的libX11调用确定XCB事件队列中是否有任何待处理的事件?

  2. 为什么XtManageChild()最终会阻止libXt中的_XtWaitForSomething()? 看起来它可能正在等待几何变化事件。 有趣的是,Qt的平台层在一个单独的线程中读取XCB事件,然后在主线程中调度它们。我现在想知道在Xt有机会检查事件队列是否包含_XtWaitForSomething()中的任何内容之前,Qt的XCB读取器线程是否正在吃事件,从而导致死锁。 有什么方法可以在我调用Xt时导致Qt的XCB事件循环[或一般的XCB事件循环]阻塞?我不能只修改Qt在XCB层中有一个条件变量,因为改变Qt不是一个选项。

  3. #0  0x00000037b30e9a5d in poll () from /lib64/libc.so.6
    #1  0x000000355f82d468 in _XtWaitForSomething () from /lib64/libXt.so.6
    #2  0x00007ffff77b871f in _XmRootGeometryManager () from /lib64/libXm.so.2
    #3  0x000000355f82569f in _XtMakeGeometryRequest () from /lib64/libXt.so.6
    #4  0x000000355f8257aa in XtMakeGeometryRequest () from /lib64/libXt.so.6
    
    #5  0x00007ffff77b77e6 in geometry_manager () from /lib64/libXm.so.2
    #6  0x000000355f8255f4 in _XtMakeGeometryRequest () from /lib64/libXt.so.6
    #6  0x000000355f8255f4 in _XtMakeGeometryRequest () from /lib64/libXt.so.6
    #7  0x000000355f8257aa in XtMakeGeometryRequest () from /lib64/libXt.so.6
    #8  0x00007ffff773852e in _XmMakeGeometryRequest () from /lib64/libXm.so.2
    #9  0x00007ffff770ed51 in change_managed () from /lib64/libXm.so.2
    #10 0x000000355f82a2e8 in XtRealizeWidget () from /lib64/libXt.so.6
    #11 0x00007ffff771c8d6 in change_managed () from /lib64/libXm.so.2
    #12 0x000000355f82c57d in ManageChildren () from /lib64/libXt.so.6
    #13 0x000000355f82ca11 in XtManageChildren () from /lib64/libXt.so.6
    #14 0x000000355f82cb18 in XtManageChild () from /lib64/libXt.so.6
    ...
    
    1. XCB中事件队列“所有者”状态究竟是什么意味着[XSetEventQueueOwner(...,XCBOwnsEventQueue)]。这是否意味着XLib调用收获事件实际上不会从事件队列的头部“接受”任何事件?

    2. 所描述的方法是否存在明显的阻塞问题? 我已经知道我可能需要整理计时器(不再调用在事件循环中处理这些的Xt函数),Qt子窗口到motif小部件的窗口父级,...

    3. 感谢。

0 个答案:

没有答案