簡體   English   中英

X11 / XCB / Xlib:將根窗口復制到像素圖

[英]X11/XCB/Xlib: Copy root window to pixmap

我可以根窗口中的內容復制到一個xcb_image_t在客戶端使用(即,CPU)存儲器xcb_image_get()無論其地圖狀態,盡管推測根窗口總是被映射 ?)。 例如:

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_txcb_pixmap_t (或等效地, xcb_pixmap_t到Xlib Pixmap )。 我怎樣才能做到這一點? (對於xcb_get_image()如此容易工作)

您希望您的GC將SubwindowMode設置為IncludeInferiors(默認為ClipByChildren)。

從X11協議描述:

對於ClipByChildren,所有可見的InputOutput子項都會同時剪切源窗口和目標窗口。 對於IncludeInferiors,源窗口和目標窗口都不會被其裁剪。 這將導致在源中包含子窗口內容,並通過目標的子窗口邊界進行繪制。 將IncludeInferior與一個深度的源或目標窗口一起使用,並將其映射到不同深度的劣等對象,這是非法的,但是核心協議未定義語義。

https://www.x.org/releases/X11R7.5/doc/x11proto/proto.html

這意味着使用ClipByChildren,您僅從用作源的窗口進行復制。 如果該窗口具有子窗口,則“用作其中”的窗口不擁有“其中”的像素。 因此,X11假定您不需要這些像素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM