【问题标题】:How to restack all windows properly in XCB (like XRestackWindows in XLIB)如何在 XCB 中正确地重新堆叠所有窗口(如 XLIB 中的 XRestackWindows)
【发布时间】:2020-03-10 06:56:13
【问题描述】:

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

我想知道一种在 XCB 中拥有适当 XRestackWindows 的方法,我尝试了 here 的解决方案,但窗口会闪烁

它必须几乎与它在 XLIB 中的工作方式完全相同。重新堆叠时没有窗口闪烁,如果我重新堆叠相同顺序的窗口,则不会发生屏幕闪烁。

无法正常工作的 XCB 代码(问题:重新堆叠时闪烁的窗口):

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);
}

注意:我试过不同的方法都没有运气,我一直在看 XRestackWindows 函数,似乎他们使用了 LockDisplay 和 UnlockDisplay,我在 XCB 中找不到。

【问题讨论】:

    标签: c++ xlib xorg xcb


    【解决方案1】:

    这里是XRestackWindows的源代码(复制自https://sources.debian.org/src/libx11/2:1.6.9-2/src/RestackWs.c/?hl=33#L33):

    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;
        }
    

    这会为列表中的每个窗口发送一个ConfigureWindow 请求,前一个窗口为“下方”。

    等效的 XCB 代码应该类似于以下内容(未经测试,我什至没有检查它是否编译,但应该足以理解这个想法):

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2015-09-21
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 2017-08-19
      相关资源
      最近更新 更多