XWindows - how capture window ?

XWindows - how capture window ?

Erez D erez0001 at gmail.com
Sun Mar 14 08:35:38 IST 2010


use XDamage extension.

On Sat, Mar 13, 2010 at 1:03 PM, Valery Reznic <valery_reznic at yahoo.com>wrote:

> 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();
> }
>
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.cs.huji.ac.il/pipermail/linux-il/attachments/20100314/ae84d924/attachment.html>


More information about the Linux-il mailing list