gpt4 book ai didi

c++ - 如何在XCB中正确地重新堆叠所有窗口(例如XLIB中的XRestackWindows)

转载 作者:行者123 更新时间:2023-12-02 10:35:16 27 4
gpt4 key购买 nike

目前,我仅将Xlib用于XRestackWindows的一个功能,其余的是XCB和QT5。要求是仅使用XCB和QT5。

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

它必须几乎完全按照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中找不到它。

最佳答案

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

关于c++ - 如何在XCB中正确地重新堆叠所有窗口(例如XLIB中的XRestackWindows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60612753/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com