C++ 如何在XCB中正确重新打包所有窗口(如XLIB中的XRestackWindows)

C++ 如何在XCB中正确重新打包所有窗口(如XLIB中的XRestackWindows),c++,xlib,xorg,xcb,C++,Xlib,Xorg,Xcb,目前我只使用Xlib实现一个函数XRestackWindows,其余的是XCB和QT5。要求仅使用XCB和QT5 我想知道一种在XCB中使用正确的XRestackWindows的方法,我尝试了一种解决方案,但windows会闪烁 它必须像XLIB中那样工作。重新加载时没有窗口闪烁,如果重新加载相同顺序的窗口,则不会出现屏幕闪烁 工作不正常的XCB代码(问题:重新启动时闪烁的windows): void restackWindows(标准::向量列表) { xcb_connection_t*con

目前我只使用Xlib实现一个函数XRestackWindows,其余的是XCB和QT5。要求仅使用XCB和QT5

我想知道一种在XCB中使用正确的XRestackWindows的方法,我尝试了一种解决方案,但windows会闪烁

它必须像XLIB中那样工作。重新加载时没有窗口闪烁,如果重新加载相同顺序的窗口,则不会出现屏幕闪烁

工作不正常的XCB代码(问题:重新启动时闪烁的windows):

void restackWindows(标准::向量列表)
{
xcb_connection_t*conn=QX11Info::connection();
无符号int arg[1]={XCB_STACK_MODE_over};
用于(自动赢:列表)
{
xcb_配置_窗口(conn,win,xcb_配置_窗口_堆栈_模式,arg);
}
xcb_冲洗(连接);
}

注意:我尝试了不同的方法,但运气不好,我一直在查看XRestackWindows函数,它们似乎使用了LockDisplay和UnlockDisplay,我在XCB中找不到它。

以下是
XRestackWindows
的源代码(复制自):

void restackWindows(std::vector<xcb_window_t> list)
{
xcb_connection_t *conn = QX11Info::connection(); 
unsigned int arg[1] = { XCB_STACK_MODE_ABOVE };
for ( auto win : list )
{
    xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_STACK_MODE, arg);
}
xcb_flush(conn);
}
int
XRestackWindows (
    register Display *dpy,
    register Window *windows,
    int n)
{
    int i = 0;

    LockDisplay(dpy);
    while (windows++, ++i < n) {
        register xConfigureWindowReq *req;

        GetReqExtra (ConfigureWindow, 8, req);
        req->window = *windows;
        req->mask = CWSibling | CWStackMode;
        {
            register CARD32 *values = (CARD32 *)
              NEXTPTR(req,xConfigureWindowReq);
            *values++ = *(windows-1);
            *values   = Below;
        }
        }
    UnlockDisplay(dpy);
    SyncHandle();
    return 1;
    }
int restack_windows(xcb_connection_t *conn, xcb_window_t *windows, int n)
{
    int i = 0;

    while (windows++, ++i < n) {
        xcb_configure_window(conn, *windows,
            XCB_CONFIG_WINDOW_SIBLING | XCB_CONFIG_WINDOW_STACK_MODE,
            (uint32_t[]) { *(windows - 1), XCB_STACK_MODE_BELOW });
    }
    return 1;
}