GtkGLArea: Always destroy context on unrealize

We had some code that tried to reuse the context over realize, but
that doesn't work as we need to share with the possibly new
paint context of the re-realized window.
This commit is contained in:
Alexander Larsson 2014-10-30 12:08:31 +01:00
parent 5f14630b76
commit ad30262fef

View File

@ -247,7 +247,10 @@ gtk_gl_area_unrealize (GtkWidget *widget)
else else
g_warning ("can't free framebuffer"); g_warning ("can't free framebuffer");
gdk_gl_context_clear_current (); /* Make sure to destroy if current */
g_object_run_dispose (G_OBJECT (priv->context));
g_object_unref (priv->context);
priv->context = NULL;
} }
g_clear_error (&priv->error); g_clear_error (&priv->error);
@ -379,24 +382,12 @@ gtk_gl_area_draw (GtkWidget *widget,
return TRUE; return TRUE;
} }
static void
gtk_gl_area_screen_changed (GtkWidget *widget,
GdkScreen *old_screen)
{
GtkGLArea *self = GTK_GL_AREA (widget);
GtkGLAreaPrivate *priv = gtk_gl_area_get_instance_private (self);
/* this will cause the context to be recreated on realize */
g_clear_object (&priv->context);
}
static void static void
gtk_gl_area_class_init (GtkGLAreaClass *klass) gtk_gl_area_class_init (GtkGLAreaClass *klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
widget_class->screen_changed = gtk_gl_area_screen_changed;
widget_class->realize = gtk_gl_area_realize; widget_class->realize = gtk_gl_area_realize;
widget_class->unrealize = gtk_gl_area_unrealize; widget_class->unrealize = gtk_gl_area_unrealize;
widget_class->size_allocate = gtk_gl_area_size_allocate; widget_class->size_allocate = gtk_gl_area_size_allocate;