<div dir="ltr">use XDamage extension.<br><br><div class="gmail_quote">On Sat, Mar 13, 2010 at 1:03 PM, Valery Reznic <span dir="ltr">&lt;<a href="mailto:valery_reznic@yahoo.com">valery_reznic@yahoo.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">OK, I found something interesting.<br>
It&#39;s turn out that for some reason on-screen rendering is a problem too.<br>
<br>
Greatly oversimplified description of my application:<br>
There is a mai windows with 2 buttons (&#39;A&#39;, and &#39;B&#39;)<br>
When buttons &#39;A&#39; pressed Windows &#39;W&#39; (with a lot of child windows) created and shown on the screen. It&#39;s done with function &#39;callback_A&#39;<br>
<br>
When I press button &#39;B&#39; I want following to happened:<br>
1. Window &#39;W&quot; created, like it was created, when button &#39;A&#39; pressed<br>
2. Window &#39;W&quot; content is captured.<br>
<br>
So I have callback_B like this:<br>
void callback_B()<br>
{<br>
    callback_A(); // create Window &#39;W&#39;<br>
    capture_window();<br>
}<br>
<br>
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&#39;s main application loop, which process events.<br>


To get XServer chance to process events callback_B was modified as following:<br>
<br>
void callback_B()<br>
{<br>
    callback_A(); // create Window &#39;W&#39;<br>
    handle_events();<br>
    capture_window();<br>
}<br>
<br>
Where handle_events looks like:<br>
void handle_events()<br>
{<br>
   XFlush(display);<br>
   XSync(display, False);<br>
<br>
     while (XtAppPending(appContext))<br>
     {<br>
       XtAppProcessEvent(appContext,Mask );<br>
   }<br>
}<br>
<br>
This functions used in this application in other cases when events should be handled and it&#39;s works OK.<br>
But in this case, Window &#39;W&#39; was only partially drawn.<br>
<br>
I found workaround modifie callback_B<br>
void callback_B()<br>
{<br>
    callback_A(); // create Window &#39;W&#39;<br>
    handle_events();<br>
<br>
    usleep(100000);<br>
    handle_events();<br>
<br>
    capture_window();<br>
}<br>
<br>
After some sleep and addition handle_events call Window &#39;W&#39; rendered on screen as expected.<br>
<br>
But I don&#39;t why first approach didn&#39;t work.<br>
>From the XSync man page:<br>
-------------------------------------------------------------------------<br>
       The XSync function flushes the output buffer and then waits until all<br>
       requests have been received and processed by the X server.  Any errors<br>
       generated must be handled by the error handler.  For each protocol<br>
       error received by Xlib, XSync calls the client application’s error han-<br>
       dling routine (see section 11.8.2).  Any events generated by the server<br>
       are enqueued into the library’s event queue.<br>
-------------------------------------------------------------------<br>
So it&#39;s looks like XSync alone should do the job.<br>
Obviously it was not - and it was a reason, that event_handle function was written.<br>
<br>
What I did with sleep and two calls to even_handle is work, but it&#39;s ugly.<br>
Anyone has idea why XSync alone is not enough and how I can wait to all requests to be processed by XServer ?<br>
<br>
Regards,<br>
Valery.<br>
<br>
<br>
--- On Sun, 3/7/10, Nadav Har&#39;El &lt;<a href="mailto:nyh@math.technion.ac.il">nyh@math.technion.ac.il</a>&gt; wrote:<br>
<br>
&gt; From: Nadav Har&#39;El &lt;<a href="mailto:nyh@math.technion.ac.il">nyh@math.technion.ac.il</a>&gt;<br>
&gt; Subject: Re: XWindows - how capture window ?<br>
&gt; To: &quot;Erez D&quot; &lt;<a href="mailto:erez0001@gmail.com">erez0001@gmail.com</a>&gt;<br>
&gt; Cc: &quot;Valery Reznic&quot; &lt;<a href="mailto:valery_reznic@yahoo.com">valery_reznic@yahoo.com</a>&gt;, &quot;linux-il.&quot; &lt;<a href="mailto:linux-il@cs.huji.ac.il">linux-il@cs.huji.ac.il</a>&gt;<br>
&gt; Date: Sunday, March 7, 2010, 10:38 AM<br>
<div><div></div><div class="h5">&gt; On Thu, Mar 04, 2010, Erez D wrote<br>
&gt; about &quot;Re: XWindows - how capture window ?&quot;:<br>
&gt; &gt; composite window managers (i.e. compiz, baryl) work by<br>
&gt; drawing the original<br>
&gt; &gt; window off screen, then read it as a 2D picture, and<br>
&gt; render it back to the<br>
&gt; &gt; screen with certain effects.<br>
&gt; &gt; So i know it is possible to grab an off screen window.<br>
&gt; I do not know however<br>
&gt; &gt; how to make it off screen.<br>
&gt;<br>
&gt; This is done using the &quot;Composite&quot; extension. See<br>
&gt; <a href="http://www.freedesktop.org/wiki/Software/CompositeExt" target="_blank">http://www.freedesktop.org/wiki/Software/CompositeExt</a><br>
&gt;<br>
&gt; But please note that all these &quot;extensions&quot;, as their title<br>
&gt; implies, are<br>
&gt; not available in every installation of X. The &quot;right way&quot;<br>
&gt; to use them is<br>
&gt; to use them when they&#39;re available, but fall back to some<br>
&gt; slower or uglier<br>
&gt; alternative when they aren&#39;t.<br>
&gt;<br>
&gt; &gt; There is an X Extension called XDamage, which reports<br>
&gt; changes on the window<br>
&gt; &gt; so you do not have to poll it for changes. These<br>
&gt; window managers use it.<br>
&gt;<br>
&gt; Right. <a href="http://www.freedesktop.org/wiki/Software/XDamage" target="_blank">http://www.freedesktop.org/wiki/Software/XDamage</a><br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt; Nadav Har&#39;El           <br>
&gt;             |   <br>
&gt;     Sunday, Mar  7 2010, 21 Adar 5770<br>
&gt; <a href="mailto:nyh@math.technion.ac.il">nyh@math.technion.ac.il</a> <br>
&gt;        <br>
&gt;    |-----------------------------------------<br>
&gt; Phone +972-523-790466, ICQ 13349191 |Business jargon is the<br>
&gt; art of saying<br>
&gt; <a href="http://nadav.harel.org.il" target="_blank">http://nadav.harel.org.il</a>       <br>
&gt;    |nothing while appearing to say a lot.<br>
&gt;<br>
<br>
<br>
<br>
<br>
</div></div><div><div></div><div class="h5">_______________________________________________<br>
Linux-il mailing list<br>
<a href="mailto:Linux-il@cs.huji.ac.il">Linux-il@cs.huji.ac.il</a><br>
<a href="http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il" target="_blank">http://mailman.cs.huji.ac.il/mailman/listinfo/linux-il</a><br>
</div></div></blockquote></div><br></div>