Как правильно перекомпилировать все windows в XCB (например, XRestack Windows в XLIB) - PullRequest
1 голос
/ 10 марта 2020

В настоящее время я использую Xlib только для одной функции XRestack Windows, остальное - XCB и QT5. Требуется использовать только XCB и QT5.

Я хотел бы знать, как получить правильный XRestack Windows в XCB, я пробовал решение из здесь , но windows будет означать sh

Он должен работать почти так же, как в XLIB. Нет windows мигает при перезапуске, если я перезагружаю тот же порядок windows, тогда не должно возникать экранной ошибки sh.

Код XCB, который не работал должным образом (проблема: вспыхнул windows при перезапуске ):

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

Примечание: я пробовал разные методы без удачи, я смотрел на функцию XRestack Windows, похоже, они используют LockDisplay и UnlockDisplay, я не смог найти ее в XCB.

1 Ответ

0 голосов
/ 10 марта 2020

Вот исходный код для 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;
}
...