]> Pileus Git - grits/blobdiff - src/grits-opengl.c
Add thread safe grits_viewer_queue_draw function
[grits] / src / grits-opengl.c
index 49a9c533015d9413c5f9d28fb67aae432beafb71..0e803baf3b5abd6a30e141bde022075254223123 100644 (file)
@@ -290,7 +290,7 @@ static gboolean run_mouse_move(GritsOpenGL *opengl, GdkEventMotion *event)
 static gboolean on_motion_notify(GritsOpenGL *opengl, GdkEventMotion *event, gpointer _)
 {
        opengl->mouse_queue = *event;
-       gtk_widget_queue_draw(GTK_WIDGET(opengl));
+       grits_viewer_queue_draw(GRITS_VIEWER(opengl));
        return FALSE;
 }
 
@@ -371,8 +371,10 @@ static gboolean on_expose(GritsOpenGL *opengl, GdkEventExpose *event, gpointer _
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
 #ifndef ROAM_DEBUG
+       g_mutex_lock(&opengl->sphere_lock);
        roam_sphere_update_errors(opengl->sphere);
        roam_sphere_split_merge(opengl->sphere);
+       g_mutex_unlock(&opengl->sphere_lock);
 #endif
 
 #ifdef ROAM_DEBUG
@@ -400,18 +402,18 @@ static gboolean on_key_press(GritsOpenGL *opengl, GdkEventKey *event, gpointer _
        /* Testing */
        if (kv == GDK_w) {
                opengl->wireframe = !opengl->wireframe;
-               gtk_widget_queue_draw(GTK_WIDGET(opengl));
+               grits_viewer_queue_draw(GRITS_VIEWER(opengl));
        }
        if (kv == GDK_p) {
                opengl->pickmode = !opengl->pickmode;
-               gtk_widget_queue_draw(GTK_WIDGET(opengl));
+               grits_viewer_queue_draw(GRITS_VIEWER(opengl));
        }
 #ifdef ROAM_DEBUG
        else if (kv == GDK_n) roam_sphere_split_one(opengl->sphere);
        else if (kv == GDK_p) roam_sphere_merge_one(opengl->sphere);
        else if (kv == GDK_r) roam_sphere_split_merge(opengl->sphere);
        else if (kv == GDK_u) roam_sphere_update_errors(opengl->sphere);
-       gtk_widget_queue_draw(GTK_WIDGET(opengl));
+       grits_viewer_queue_draw(GRITS_VIEWER(opengl));
 #endif
        return FALSE;
 }
@@ -618,6 +620,7 @@ static void grits_opengl_add(GritsViewer *_opengl, GritsObject *object,
                list->next->prev = link;
        list->next = link;
        object->ref = link;
+       g_object_ref(object);
        g_mutex_unlock(&opengl->objects_lock);
 }
 
@@ -625,6 +628,8 @@ void grits_opengl_remove(GritsViewer *_opengl, GritsObject *object)
 {
        g_assert(GRITS_IS_OPENGL(_opengl));
        GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
+       if (!object->ref)
+               return;
        g_mutex_lock(&opengl->objects_lock);
        GList *link = object->ref;
        /* Just unlink and free it, link->prev is assured */
@@ -632,6 +637,8 @@ void grits_opengl_remove(GritsViewer *_opengl, GritsObject *object)
        if (link->next)
                link->next->prev = link->prev;
        g_free(link);
+       object->ref = NULL;
+       g_object_unref(object);
        g_mutex_unlock(&opengl->objects_lock);
 }