XWindows - how capture window ?

XWindows - how capture window ?

Valery Reznic valery_reznic at yahoo.com
Sat Mar 13 16:47:10 IST 2010



--- On Sat, 3/13/10, Micha <michf at post.tau.ac.il> wrote:

From: Micha <michf at post.tau.ac.il>
Subject: Re: XWindows - how capture window ?
To: 
Cc: "linux-il." <linux-il at cs.huji.ac.il>
Date: Saturday, March 13, 2010, 4:00 PM





ב-13/03/2010, בשעה 13:03, Valery Reznic <valery_reznic at yahoo.com> כתב/ה:

OK, I found something interesting.
It's turn out that for some reason on-screen rendering is a problem too.

Greatly oversimplified description of my application:
There is a mai windows with 2 buttons ('A', and 'B')
When buttons 'A' pressed Windows 'W' (with a lot of child windows) created and shown on the screen. It's done with function 'callback_A'

When I press button 'B' I want following to happened:
1. Window 'W" created, like it was created, when button 'A' pressed
2. Window 'W" content is captured.

So I have callback_B like this:
void callback_B()
{
    callback_A(); // create Window 'W'
    capture_window();
}


Problem is, like you stated that you to wait for all the drawing callbacks to finish
The best approach for such a thing is to post and event to do the capture that will go on the queue after the draw events and then process the capture in that callback

I though about this but it's looks like events reported to be processed, while them still not - or I misunderstood meaning of XSync function.

Valery.

So far so good. The only trouble is that requests sent to XServer in the function callback_A have no chance to be processed before call to capture_window() function, because application does not retirned to it's main application loop, which process events.
To get XServer chance to process events callback_B was modified as following:

void callback_B()
{
    callback_A(); // create Window 'W'
    handle_events();
    capture_window();
}

Where handle_events looks like:
void handle_events()
{
   XFlush(display);
   XSync(display, False);

     while (XtAppPending(appContext))
     {
       XtAppProcessEvent(appContext,Mask );
   }
}

This functions used in this application in other cases when events should be handled and it's works OK.
But in this case, Window 'W' was only partially drawn.

I found workaround modifie callback_B
void callback_B()
{
    callback_A(); // create Window 'W'
    handle_events();

    usleep(100000);
    handle_events();

    capture_window();
}

After some sleep and addition handle_events call Window 'W' rendered on screen as expected.

But I don't why first approach didn't work.
>From the XSync man page:
-------------------------------------------------------------------------
       The XSync function flushes the output buffer and then waits until all
       requests have been received and processed by the X server.  Any errors
       generated must be handled by the error handler.  For each protocol
       error received by Xlib, XSync calls the client application’s error han-
       dling routine (see section 11.8.2).  Any events generated by the server
       are enqueued into the library’s event queue.
-------------------------------------------------------------------
So it's looks like XSync alone should do the job.
Obviously it was not - and it was a reason, that event_handle function was written.

What I did with sleep and two calls to even_handle is work, but it's ugly.
Anyone has idea why XSync alone is not enough and how I can wait to all requests to be processed by XServer ?

Regards,
Valery.


--- On Sun, 3/7/10, Nadav Har'El <nyh at math.technion.ac.il> wrote:

From: Nadav Har'El <nyh at math.technion.ac.il>
Subject: Re: XWindows - how capture window ?
To: "Erez D" <erez0001 at gmail.com>
Cc: "Valery Reznic" <valery_reznic at yahoo.com>, "linux-il." <linux-il at cs.huji.ac.il>
Date: Sunday, March 7, 2010, 10:38 AM
On Thu, Mar 04, 2010, Erez D wrote
about "Re: XWindows - how capture window ?":
composite window managers (i.e. compiz, baryl) work by
drawing the original
window off screen, then read it as a 2D picture, and
render it back to the
screen with certain effects.
So i know it is possible to grab an off screen window.
I do not know however
how to make it off screen.

This is done using the "Composite" extension. See
http://www.freedesktop.org/wiki/Software/CompositeExt

But please note that all these "extensions", as their title
implies, are
not available in every installation of X. The "right way"
to use them is
to use them when they're available, but fall back to some
slower or uglier
alternative when they aren't.

There is an X Extension called XDamage, which reports
changes on the window
so you do not have to poll it for changes. These
window managers use it.

Right. http://www.freedesktop.org/wiki/Software/XDamage


-- 
Nadav Har'El           
            |   
    Sunday, Mar  7 2010, 21 Adar 5770
nyh at math.technion.ac.il 
       
   |-----------------------------------------
Phone +972-523-790466, ICQ 13349191 |Business jargon is the
art of saying
http://nadav.harel.org.il       
   |nothing while appearing to say a lot.





_______________________________________________
Linux-il mailing list
Linux-il at cs.huji.ac.il
http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il

-----Inline Attachment Follows-----

_______________________________________________
Linux-il mailing list
Linux-il at cs.huji.ac.il
http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il



      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.cs.huji.ac.il/pipermail/linux-il/attachments/20100313/2ad7cfbc/attachment-0001.html>


More information about the Linux-il mailing list