xcb_get_image_reply не работает для окна в другом рабочем пространстве/рабочем столе

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 Я получаю описание ошибки в виде:

Match Окно InputOnly используется как DRAWABLE. В графическом запросе аргумент GCONTEXT не имеет того же корня и глубины, что и целевой аргумент DRAWABLE. Некоторый аргумент (или пара аргументов) имеет правильный тип и диапазон, но он не соответствует каким-либо другим образом, требуемым запросом.

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

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


person Bogdan    schedule 12.06.2019    source источник


Ответы (1)


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

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

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

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

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

person Uli Schlachter    schedule 26.06.2019
comment
Это жалость. Это также объясняет, почему он не работает, когда система включает экран блокировки. - person Bogdan; 28.06.2019