]> spindle.queued.net Git - midori/commitdiff
Disconnect boolean and string property proxy callbacks on destroy
authorEnrico Tröger <enrico.troeger@uvena.de>
Mon, 1 Jun 2009 01:43:36 +0000 (03:43 +0200)
committerChristian Dywan <christian@twotoasts.de>
Mon, 1 Jun 2009 01:43:36 +0000 (03:43 +0200)
This fixes critical warnings seen when opening and closing
multiple windows, which led notification callbacks to be invoked
on invalid widgets.

katze/katze-utils.c

index 54969ea666a63161655696132c20dbfe62266e29..42e8703178d09e365ed8244bc1bb7f24e62fc290 100644 (file)
@@ -129,6 +129,22 @@ proxy_object_notify_string_cb (GObject*    object,
     g_free (value);
 }
 
+static void
+proxy_widget_boolean_destroy_cb (GtkWidget* proxy,
+                                 GObject*   object)
+{
+    g_signal_handlers_disconnect_by_func (object,
+        proxy_object_notify_boolean_cb, proxy);
+}
+
+static void
+proxy_widget_string_destroy_cb (GtkWidget* proxy,
+                                 GObject*  object)
+{
+    g_signal_handlers_disconnect_by_func (object,
+        proxy_object_notify_string_cb, proxy);
+}
+
 /**
  * katze_property_proxy:
  * @object: a #GObject
@@ -208,6 +224,8 @@ katze_property_proxy (gpointer     object,
         notify_property = g_strdup_printf ("notify::%s", property);
         g_signal_connect (object, notify_property,
             G_CALLBACK (proxy_object_notify_boolean_cb), widget);
+        g_signal_connect (widget, "destroy",
+            G_CALLBACK (proxy_widget_boolean_destroy_cb), object);
         g_free (notify_property);
     }
     else if (type == G_TYPE_PARAM_STRING && _hint == g_intern_string ("file"))
@@ -300,6 +318,8 @@ katze_property_proxy (gpointer     object,
         notify_property = g_strdup_printf ("notify::%s", property);
         g_signal_connect (object, notify_property,
             G_CALLBACK (proxy_object_notify_string_cb), widget);
+        g_signal_connect (widget, "destroy",
+            G_CALLBACK (proxy_widget_string_destroy_cb), object);
         g_free (notify_property);
     }
     else if (type == G_TYPE_PARAM_FLOAT)