<div dir="ltr">Hi!<div>I've made a modified version [1] of the example of threaded animation using Cairo [2].</div><div><br></div><div style>First I've used the method to create a cairo_gl_surface from the test/gl_source_surface.c file adapted to create the surface for a given widget instead for a defined size.</div>
<div style><br></div><div style>Also, for simplicity, I removed all the handled signals except the destroy one.</div><div style><br></div><div style>To handle the drawing for the window widget using the cairo_gl backend I use the create_gl_surface_for_window function passing it the proper widget information.</div>
<div style><br></div><div style>So far, for a single drawing execution it works as expected:</div><div style>1) In main() create the window_surface</div><div style>2) The do_draw function creates a context based on window_surface</div>
<div style>3) Once done the drawings with Cairo then the buffers are swapped and the content is shown on screen.</div><div style><br></div><div style>Notice that the window_surface is never destroyed explicitly because it is owned by the window widget and so it will be destroyed when the window is destroyed by gtk.</div>
<div style><br></div><div style>The problem comes when I enable the multithreading support by uncommenting the line:</div><div style><p style="text-align:left;margin:0px;font-size:11px;font-family:Menlo;color:rgb(0,132,0)">
<br></p><p style="text-align:left;margin:0px;font-size:11px;font-family:Menlo;color:rgb(0,132,0)">//(void)g_timeout_add(33, (GSourceFunc)timer_exe, window);</p><div style="text-align:left"><br></div><div style="text-align:left">
It triggers the timer_exe function 33 times per second and then it creates threads that will call do_draw each time.</div><div style="text-align:left"><br></div><div style="text-align:left">Once enabled it crashes at the first painting function from Cairo. </div>
<div style="text-align:left"><br></div><div style="text-align:left">I believe that the problem is that the window_surface belongs to the window widget when I created it and then I can't modify it outside the main gtk thread. </div>
<div style="text-align:left"><br></div><div style="text-align:left">How can I solve this? If I enclose the Cairo painting operations inside a gdk_threads_enter and </div></div><div style>gdk_threads_leave I would add a lot of time consuming operations to the main gtk thread, which is precisely what I want to avoid using multithreading.</div>
<div style><br></div><div style>Any help? I would like to know at last, if my assumptions of the window_surface ownership are true or not.</div><div style><br></div><div style>Thanks!</div><div style>  </div><div style>[1] <a href="https://github.com/genete/my-test-area/blob/direct_draw/src/cairo_sample.c">https://github.com/genete/my-test-area/blob/direct_draw/src/cairo_sample.c</a></div>
<div>[2] <a href="http://cairographics.org/threaded_animation_with_cairo/">http://cairographics.org/threaded_animation_with_cairo/</a><br clear="all"><div><br></div>-- <br>Carlos<br><a href="http://synfig.org" target="_blank">http://synfig.org</a><br>

</div></div>