Taking a screenshot with translucent windows

Anthony Petrov anthony.petrov at oracle.com
Tue Oct 11 09:21:42 PDT 2011


Hello,

Our application needs to be able to take screenshots programmatically. 
Historically, we used an xwd-like approach for this - basically, drawing 
the entire windows hierarchy starting from the root window into a pixmap.

However, on modern systems with translucency effects enabled, the areas 
occupied by translucent windows are painted black when we take a 
screenshot using this method. This can easily be reproduced with the xwd 
utility itself.

We tried to retrieve a handle to the overlay window provided by the 
XComposite extension and use it instead of the root window for our 
purposes. Basically we were doing the following (pseudo-code):

Window window = XRootWindow();

if (XComposite is available) {
    window = XCompositeGetOverlayWindow();
}

xwd_like_procedure_for_window(window);

if (XComposite is available) {
    XCompositeReleaseOverlayWindow(window);
}

This works fine as long as only one screenshot is taken during the app's 
life-cycle. However, if we need to take several screenshots in a row, 
for some reason subsequent images contain various visual artifacts 
regardless of whether the translucency effects are enabled on the X 
server or not.

Could anyone suggest the correct way to take a screenshot 
programmatically when we know that translucent windows may be present on 
the screen?

Please point me to a correct mailing list if this question doesn't 
belong here. Any help is appreciated.

PS. Please keep me in the CC list as I'm not subscribed to this mailing 
list.

--
best regards,
Anthony


More information about the xorg-devel mailing list