Я могу скопировать содержимое корневого окна в xcb_image_t
в клиентской (т.е. CPU) памяти, используя xcb_image_get()
(независимо от его статуса map, хотя предположительно корневое окно всегда отображается em >?). Например:
xcb_image_t* xcb_img = xcb_image_get(xcb_connection, xcb_screen->root, 0, 0, xcb_screen->width_in_pixels, xcb_screen->height_in_pixels, 0x00ffffff, XCB_IMAGE_FORMAT_Z_PIXMAP);
Теперь пиксели корневого окна находятся в xcb_img->data
.
Но я пытаюсь скопировать содержимое корневого окна в xcb_pixmap_t
(в памяти сервера), и оно не работает (вызов не завершается неудачно, но возвращает мусор, как если бы окно не было отображено):
xcb_void_cookie_t copy_cookie = xcb_copy_area_checked(xcb_connection, xcb_screen->root, xcb_pixmap, xcb_gc_null, 0, 0, 0, 0, xcb_screen->width_in_pixels, xcb_screen->height_in_pixels);
xcb_generic_error_t* copy_error = xcb_request_check(xcb_connection, copy_cookie);
if(copy_error)
exit(1);
Однако он работает для других окон, которые случайно отображаются (и не работает для подобластей тех окон, которые закрыты другими окнами, в том смысле, что копия возвращает мусор).
Я понимаю, что окно должно быть сопоставлено, чтобы иметь значимое содержимое. Это наводит меня на мысль, что корневое окно никогда не отображается (или что-то в этом роде).
Все, что я хочу, - это скопировать содержимое дисплея (т.е. пиксели, которые в настоящее время отображаются на физическом дисплее / мониторе) в
xcb_pixmap_t
(или, что то же самое, в XlibPixmap
). Как я могу это сделать? (Это так легко работает для _9 _...)
xcb_create_gc
, либо позже сxcb_change_gc
) - person Uli Schlachter   schedule 22.08.2018XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS
имеет значение?xcb_gc_null
- это просто (то, что я думаю) тривиальный gc, т.е.xcb_create_gc(connection, xcb_gc_null, window_xid, XCB_GC_GRAPHICS_EXPOSURES, (u32[]){XCB_EXPOSURES_NOT_ALLOWED})
- person étale-cohomology   schedule 24.08.2018