Сбой xcb_get_image_reply для окна в другом рабочем пространстве / рабочем столе - PullRequest
0 голосов
/ 12 июня 2019

Ubuntu (xfce) предоставляет виртуальные рабочие столы или рабочие пространства. Я хотел бы получить скриншот приложения, которое размещено на другом виртуальном рабочем столе. Я успешно создаю xcb-соединение и могу найти окно приложения по его названию. Проблема в том, что xcb_get_image_reply не удается. Я делаю что-то вроде этого:

    auto cookie = xcb_get_image(m_XCBConnection, XCB_IMAGE_FORMAT_Z_PIXMAP, m_XCBWindow, x, y, width, height, ~0);
    xcb_generic_error_t * err = nullptr;
    auto image = xcb_get_image_reply(m_XCBConnection, cookie, &err);

    // xcb_connection_has_error( m_XCBConnection ) returns no error

    if ( err ) {
        // here I have err->error_code == 8
        free( err );
    }

Если я правильно понимаю Кодировки ошибок XCB и Объяснение общих ошибок XCB Я получаю ошибку, описанную как:

Совпадение Окно InputOnly используется в качестве ЧЕРТЕЖА. В графическом запросе аргумент GCONTEXT не имеет того же корня и глубины, что и целевой аргумент DRAWABLE. У некоторого аргумента (или пары аргументов) правильный тип и диапазон, но он не может соответствовать другим способом, требуемым запросом.

Но я понятия не имею, что мне с этим делать.

Примечание: вышеуказанное решение отлично работает, если оба приложения находятся на одном виртуальном рабочем столе.

1 Ответ

0 голосов
/ 26 июня 2019

Цитировать https://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html#requests:GetImage:

Если рисуемое окно является окном, оно должно быть доступно для просмотра, [...] (или результаты ошибки соответствия).

Итак, запрос GetImage не выполняется, потому что окно, которое вы хотите сделать снимок экрана, не видно. Сервер X11 (на самом деле) не сохраняет никакого контента, кроме того, что видно на экране. Все остальное нигде не сохраняется.

Я хотел бы получить скриншот приложения, размещенного на другом виртуальном рабочем столе.

По сути: X11 не может этого сделать, кроме как переключиться на другой виртуальный рабочий стол, подождать, пока (как?) Соответствующее окно перерисовывается, а затем сделать снимок экрана.

...