This also prevent errors if an object is removed from the viewer twice.
For example:
- The viewer is destroyed
- The opengl dispose function removes all objects
- The application frees plugins
- The plugins dispose function attempts to remove
an already removed the object
-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));
gint num, gboolean sort)
{
g_assert(GRITS_IS_OPENGL(_opengl));
if (list->next)
list->next->prev = link;
list->next = link;
if (list->next)
list->next->prev = link;
list->next = link;
g_mutex_unlock(&opengl->objects_lock);
g_mutex_unlock(&opengl->objects_lock);
-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);
{
g_assert(GRITS_IS_OPENGL(_opengl));
GritsOpenGL *opengl = GRITS_OPENGL(_opengl);
- GList *link = object->ref;
g_mutex_lock(&opengl->objects_lock);
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;
/* 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_object_unref(object);
- return object;
+ g_mutex_unlock(&opengl->objects_lock);
*
* The viewer steals the objects reference. Call g_object_ref if you plan on
* holding a reference as well.
*
* The viewer steals the objects reference. Call g_object_ref if you plan on
* holding a reference as well.
- *
- * Returns: a handle to be pass to grits_viewer_remove()
-gpointer grits_viewer_add(GritsViewer *viewer, GritsObject *object,
+void grits_viewer_add(GritsViewer *viewer, GritsObject *object,
gint level, gboolean sort)
{
GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer);
if (!klass->add)
g_warning("GritsViewer: add - Unimplemented");
gint level, gboolean sort)
{
GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer);
if (!klass->add)
g_warning("GritsViewer: add - Unimplemented");
- object->ref = klass->add(viewer, object, level, sort);
+ klass->add(viewer, object, level, sort);
}
/**
* grits_viewer_remove:
* @viewer: the viewer
}
/**
* grits_viewer_remove:
* @viewer: the viewer
- * @ref: the handle obtained from grits_viewer_add()
- *
- * Remove an object from the viewer. The objects reference count is decremented
- * prior to being removed.
+ * @object: the object to remove
- * Returns: the #GritsObject referenced by the handle
+ * Remove an object from the viewer.
+ * The objects reference count is decremented.
-GritsObject *grits_viewer_remove(GritsViewer *viewer, GritsObject *object)
+void grits_viewer_remove(GritsViewer *viewer, GritsObject *object)
{
GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer);
{
GritsViewerClass *klass = GRITS_VIEWER_GET_CLASS(viewer);
+ if (!object->viewer)
+ return;
if (!klass->remove)
g_warning("GritsViewer: remove - Unimplemented");
if (!klass->remove)
g_warning("GritsViewer: remove - Unimplemented");
klass->remove(viewer, object);
klass->remove(viewer, object);
+ g_object_unref(object);
GritsHeightFunc height_func, gpointer user_data,
gboolean update);
GritsHeightFunc height_func, gpointer user_data,
gboolean update);
- gpointer (*add) (GritsViewer *viewer, GritsObject *object,
+ void (*add) (GritsViewer *viewer, GritsObject *object,
gint level, gboolean sort);
gint level, gboolean sort);
- GritsObject *(*remove) (GritsViewer *viewer, GritsObject *object);
+ void (*remove) (GritsViewer *viewer, GritsObject *object);
};
GType grits_viewer_get_type(void);
};
GType grits_viewer_get_type(void);
GritsHeightFunc height_func, gpointer user_data,
gboolean update);
GritsHeightFunc height_func, gpointer user_data,
gboolean update);
-gpointer grits_viewer_add(GritsViewer *viewer, GritsObject *object,
+void grits_viewer_add(GritsViewer *viewer, GritsObject *object,
gint level, gboolean sort);
gint level, gboolean sort);
-GritsObject *grits_viewer_remove(GritsViewer *viewer, GritsObject *object);
+void grits_viewer_remove(GritsViewer *viewer, GritsObject *object);