reparenting a GtkDrawingArea with OpenGL

View: New views
2 Messages — Rating Filter:   Alert me  

reparenting a GtkDrawingArea with OpenGL

by Jeff Eberl :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

I originally posted this to the glade-users list, but I think it belongs in the gtkglext list instead.

I have  a window with two GtkDrawingArea's.  One is a map and one is a picture, I'm trying to swap the two windows with the click of a button.  Surrounding each drawing is a bunch of buttons and things. 

This is how I reparent them:

gtk_widget_ref(map_widget);
gtk_widget_ref(pic_widget);

gtk_container_remove(left_
container, map_widget);
gtk_container_remove(right_container, pic_widget);

gtk_container_add(left_container, pic_widget);
gtk_container_add(right_container, map_widget);

gtk_widget_unref(map_widget);
gtk_widget_unref(pic_widget);

The buttons, the boxes, and everything in the widgets swaps out, but the next time I try to draw in either of them, the gdk_gl_drawable_gl_begin fails:

GdkGKExt-CRITICAL **: gdk_gl_window_impl_x11_make_context_current: assertion 'GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext)' failed

So, that's a bummer.  I didn't write the code I'm using to instantiate the widgets, or draw the pic/map.  I'm wondering if maybe the problem is that the "realize" event gets called twice, but all the gdk setup stuff is actually in a different method, one that doesn't get called twice.  The realize callback doesn't really have anything in it.

Any help would be appreciated.  I'm running in circles.

Jeff

_______________________________________________
gtkglext-list mailing list
gtkglext-list@...
http://mail.gnome.org/mailman/listinfo/gtkglext-list

Re: reparenting a GtkDrawingArea with OpenGL

by Braden McDaniel :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Fri, 2009-05-15 at 14:40 -0600, Jeff Eberl wrote:

> I have  a window with two GtkDrawingArea's.  One is a map and one is a
> picture, I'm trying to swap the two windows with the click of a
> button.  Surrounding each drawing is a bunch of buttons and things.  
>
> This is how I reparent them:
>
> gtk_widget_ref(map_widget);
> gtk_widget_ref(pic_widget);
>
> gtk_container_remove(left_
> container, map_widget);
> gtk_container_remove(right_container, pic_widget);
>
> gtk_container_add(left_container, pic_widget);
> gtk_container_add(right_container, map_widget);
>
> gtk_widget_unref(map_widget);
> gtk_widget_unref(pic_widget);
>
> The buttons, the boxes, and everything in the widgets swaps out, but
> the next time I try to draw in either of them, the
> gdk_gl_drawable_gl_begin fails:
>
> GdkGKExt-CRITICAL **: gdk_gl_window_impl_x11_make_context_current:
> assertion 'GDK_IS_GL_CONTEXT_IMPL_X11 (glcontext)' failed
>
> So, that's a bummer.  I didn't write the code I'm using to instantiate
> the widgets, or draw the pic/map.  I'm wondering if maybe the problem
> is that the "realize" event gets called twice, but all the gdk setup
> stuff is actually in a different method, one that doesn't get called
> twice.  The realize callback doesn't really have anything in it.

Hm... Is it getting unrealized? If that happens, and it isn't getting
realized again, that may explain the behavior you're observing.

To debug this, you'd need to track the lifetime of the GdkGLDrawable
that's supposed to be handed off to gdk_gl_drawable_begin; obviously
it's invalid by the time it's getting there.  A stack trace should give
you some starting points for places to put breakpoints.

--
Braden McDaniel <braden@...>

_______________________________________________
gtkglext-list mailing list
gtkglext-list@...
http://mail.gnome.org/mailman/listinfo/gtkglext-list