Author: abrander
Date: 2009-07-19 20:50:55 +0200 (Sun, 19 Jul 2009)
New Revision: 2596

Modified:
   trunk/librawstudio/rs-filter.c
   trunk/librawstudio/rs-filter.h
Log:
Implemented stronger and more robust cross-filter referencing.

Modified: trunk/librawstudio/rs-filter.c
===================================================================
--- trunk/librawstudio/rs-filter.c      2009-07-19 17:45:28 UTC (rev 2595)
+++ trunk/librawstudio/rs-filter.c      2009-07-19 18:50:55 UTC (rev 2596)
@@ -36,9 +36,26 @@
 static guint signals[LAST_SIGNAL] = { 0 };
 
 static void
+dispose(GObject *obj)
+{
+       RSFilter *filter = RS_FILTER(obj);
+
+       if (!filter->dispose_has_run)
+       {
+               filter->dispose_has_run = TRUE;
+               if (filter->previous)
+               {
+                       filter->previous->next_filters = 
g_slist_remove(filter->previous->next_filters, filter);
+                       g_object_unref(filter->previous);
+               }
+       }
+}
+
+static void
 rs_filter_class_init(RSFilterClass *klass)
 {
        filter_debug("rs_filter_class_init(%p)", klass);
+       GObjectClass *object_class = G_OBJECT_CLASS(klass);
 
        signals[CHANGED_SIGNAL] = g_signal_new ("changed",
                G_TYPE_FROM_CLASS (klass),
@@ -54,6 +71,8 @@
        klass->get_width = NULL;
        klass->get_height = NULL;
        klass->previous_changed = NULL;
+
+       object_class->dispose = dispose;
 }
 
 static void
@@ -93,19 +112,10 @@
        return filter;
 }
 
-static void
-rs_filter_weak_unlink(gpointer data, GObject *where_the_object_was)
-{
-       RSFilter *filter = RS_FILTER(data);
-       RSFilter *next = RS_FILTER(where_the_object_was);
-
-       filter->next_filters = g_slist_remove(filter->next_filters, next);
-}
-
 /**
  * Set the previous RSFilter in a RSFilter-chain
  * @param filter A RSFilter
- * @param previous A previous RSFilter or NULL
+ * @param previous A previous RSFilter
  */
 void
 rs_filter_set_previous(RSFilter *filter, RSFilter *previous)
@@ -116,14 +126,13 @@
 
        if (filter->previous && (filter->previous != previous))
        {
-               g_object_weak_unref(G_OBJECT(filter), rs_filter_weak_unlink, 
previous);
                filter->previous->next_filters = 
g_slist_remove(filter->previous->next_filters, filter);
+               g_object_unref(filter->previous);
        }
 
-       filter->previous = previous;
+       filter->previous = g_object_ref(previous);
+
        previous->next_filters = g_slist_append(previous->next_filters, filter);
-
-       g_object_weak_ref(G_OBJECT(filter), rs_filter_weak_unlink, previous);
 }
 
 /**

Modified: trunk/librawstudio/rs-filter.h
===================================================================
--- trunk/librawstudio/rs-filter.h      2009-07-19 17:45:28 UTC (rev 2595)
+++ trunk/librawstudio/rs-filter.h      2009-07-19 18:50:55 UTC (rev 2596)
@@ -83,6 +83,8 @@
 
 struct _RSFilter {
        GObject parent;
+       gboolean dispose_has_run;
+
        RSFilter *previous;
        GSList *next_filters;
        gboolean enabled;
@@ -112,7 +114,7 @@
 /**
  * Set the previous RSFilter in a RSFilter-chain
  * @param filter A RSFilter
- * @param previous A previous RSFilter or NULL
+ * @param previous A previous RSFilter
  */
 extern void rs_filter_set_previous(RSFilter *filter, RSFilter *previous);
 


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to