X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgrits-opengl.c;h=49a9c533015d9413c5f9d28fb67aae432beafb71;hb=fca66641b8505a51767d0c249194f25da0823716;hp=14515ae3a760a230967fb1db472e56040d18008c;hpb=dcdd8c82d50feae9d91de126b313c3a5de32e030;p=grits diff --git a/src/grits-opengl.c b/src/grits-opengl.c index 14515ae..49a9c53 100644 --- a/src/grits-opengl.c +++ b/src/grits-opengl.c @@ -587,13 +587,13 @@ static void _objects_free(gpointer value, gpointer _) { struct RenderLevel *level = value; if (level->sorted.next) - g_list_free(level->sorted.next); + g_list_free_full(level->sorted.next, g_object_unref); if (level->unsorted.next) - g_list_free(level->unsorted.next); + g_list_free_full(level->unsorted.next, g_object_unref); g_free(level); } -static gpointer grits_opengl_add(GritsViewer *_opengl, GritsObject *object, +static void grits_opengl_add(GritsViewer *_opengl, GritsObject *object, gint num, gboolean sort) { g_assert(GRITS_IS_OPENGL(_opengl)); @@ -617,26 +617,22 @@ static gpointer grits_opengl_add(GritsViewer *_opengl, GritsObject *object, if (list->next) list->next->prev = link; list->next = link; + object->ref = link; g_mutex_unlock(&opengl->objects_lock); - return link; } -static GritsObject *grits_opengl_remove(GritsViewer *_opengl, GritsObject *object) +void grits_opengl_remove(GritsViewer *_opengl, GritsObject *object) { g_assert(GRITS_IS_OPENGL(_opengl)); GritsOpenGL *opengl = GRITS_OPENGL(_opengl); - GList *link = object->ref; g_mutex_lock(&opengl->objects_lock); + GList *link = object->ref; /* Just unlink and free it, link->prev is assured */ link->prev->next = link->next; if (link->next) link->next->prev = link->prev; - g_mutex_unlock(&opengl->objects_lock); - object->ref = NULL; - object->viewer = NULL; g_free(link); - g_object_unref(object); - return object; + g_mutex_unlock(&opengl->objects_lock); } /**************** @@ -657,6 +653,15 @@ static void grits_opengl_init(GritsOpenGL *opengl) static void grits_opengl_dispose(GObject *_opengl) { g_debug("GritsOpenGL: dispose"); + GritsOpenGL *opengl = GRITS_OPENGL(_opengl); + if (opengl->objects) { + GQueue *objects = opengl->objects;; + opengl->objects = NULL; + g_mutex_lock(&opengl->objects_lock); + g_queue_foreach(objects, _objects_free, NULL); + g_queue_free(objects); + g_mutex_unlock(&opengl->objects_lock); + } G_OBJECT_CLASS(grits_opengl_parent_class)->dispose(_opengl); } static void grits_opengl_finalize(GObject *_opengl) @@ -664,10 +669,9 @@ static void grits_opengl_finalize(GObject *_opengl) g_debug("GritsOpenGL: finalize"); GritsOpenGL *opengl = GRITS_OPENGL(_opengl); roam_sphere_free(opengl->sphere); - g_queue_foreach(opengl->objects, _objects_free, NULL); - g_queue_free(opengl->objects); g_mutex_clear(&opengl->objects_lock); g_mutex_clear(&opengl->sphere_lock); + gtk_gl_disable(GTK_WIDGET(opengl)); G_OBJECT_CLASS(grits_opengl_parent_class)->finalize(_opengl); } static void grits_opengl_class_init(GritsOpenGLClass *klass)