Author: peter
Date: 2007-01-25 00:21:55 +0000 (Thu, 25 Jan 2007)
New Revision: 24739

Modified:
   squeeze/trunk/src/widget_factory.c
Log:
fixed critical disconnects


Modified: squeeze/trunk/src/widget_factory.c
===================================================================
--- squeeze/trunk/src/widget_factory.c  2007-01-24 23:49:50 UTC (rev 24738)
+++ squeeze/trunk/src/widget_factory.c  2007-01-25 00:21:55 UTC (rev 24739)
@@ -68,6 +68,8 @@
 cb_sq_widget_factory_property_notify(GObject *obj, GParamSpec *pspec, gpointer 
user_data);
 static void
 cb_sq_widget_factory_widget_destroyed(GtkObject *obj, gpointer user_data);
+static void
+cb_sq_widget_factory_object_destroyed(GtkObject *obj, gpointer user_data);
 
 static void
 cb_sq_widget_factory_action_triggered(GtkWidget *widget, gpointer user_data);
@@ -134,6 +136,7 @@
        g_signal_connect(G_OBJECT(check), "toggled", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
        g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), check);
        g_signal_connect(GTK_OBJECT(check), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), check);
 
        const gchar *large_tip = g_param_spec_get_blurb(pspec);
        gchar *small_tip = NULL;
@@ -241,6 +244,7 @@
        g_signal_connect(G_OBJECT(spin), "value-changed", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
        g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), spin);
        g_signal_connect(GTK_OBJECT(spin), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), spin);
 
        gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 3);
        gtk_box_pack_end(GTK_BOX(box), spin, TRUE, TRUE, 3);
@@ -283,6 +287,7 @@
                g_signal_connect(G_OBJECT(radio), "toggled", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
                g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), radio);
        g_signal_connect(GTK_OBJECT(radio), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), radio);
 
                if(g_value_get_enum(value) == values[i].value)
                        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), 
TRUE);
@@ -321,6 +326,7 @@
        g_signal_connect(G_OBJECT(combo), "changed", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
        g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), combo);
        g_signal_connect(GTK_OBJECT(combo), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), combo);
 
        for(i = 0; i < n; ++i)
        {
@@ -373,6 +379,7 @@
                g_signal_connect(G_OBJECT(check), "toggled", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
                g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), check);
        g_signal_connect(GTK_OBJECT(check), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), check);
 
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), 
g_value_get_enum(value) & values[i].value);
                gtk_box_pack_start(GTK_BOX(box), check, FALSE, FALSE, 5);
@@ -406,6 +413,7 @@
        g_signal_connect(G_OBJECT(entry), "activate", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
        g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), entry);
        g_signal_connect(GTK_OBJECT(entry), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), entry);
 
        gtk_entry_set_text(GTK_ENTRY(entry), g_value_get_string(value));
 
@@ -497,6 +505,7 @@
        g_signal_connect(G_OBJECT(check), "toggled", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
        g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), check);
        g_signal_connect(GTK_OBJECT(check), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), check);
 
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(check), 
g_value_get_boolean(value));
 
@@ -524,6 +533,7 @@
                g_signal_connect(G_OBJECT(radio), "toggled", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
                g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), radio);
                g_signal_connect(GTK_OBJECT(radio), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), radio);
 
                if(g_value_get_enum(value) == values[i].value)
                        
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(radio), TRUE);
@@ -558,6 +568,7 @@
                g_signal_connect(G_OBJECT(radio), "toggled", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
                g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), radio);
                g_signal_connect(GTK_OBJECT(radio), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), radio);
 
                if(g_value_get_enum(value) == values[i].value)
                        
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(radio), TRUE);
@@ -592,6 +603,7 @@
                g_signal_connect(G_OBJECT(check), "toggled", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
                g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), check);
                g_signal_connect(GTK_OBJECT(check), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), check);
 
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(check), 
g_value_get_enum(value) & values[i].value);
 
@@ -622,6 +634,7 @@
                g_signal_connect(G_OBJECT(check), "toggled", 
G_CALLBACK(cb_sq_widget_factory_property_changed), obj);
                g_signal_connect(obj, "notify", 
G_CALLBACK(cb_sq_widget_factory_property_notify), check);
                g_signal_connect(GTK_OBJECT(check), "destroy", 
G_CALLBACK(cb_sq_widget_factory_widget_destroyed), obj);
+               g_signal_connect(obj, "destroy", 
G_CALLBACK(cb_sq_widget_factory_object_destroyed), check);
 
                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(check), 
g_value_get_enum(value) & values[i].value);
 
@@ -995,7 +1008,6 @@
 static void
 cb_sq_widget_factory_widget_destroyed(GtkObject *obj, gpointer user_data)
 {
-       /* FIXME: broken on shutdown */
        if(user_data)
        {
                g_signal_handlers_disconnect_by_func(user_data, 
cb_sq_widget_factory_property_notify, obj);
@@ -1003,6 +1015,15 @@
 }
 
 static void
+cb_sq_widget_factory_object_destroyed(GtkObject *obj, gpointer user_data)
+{
+       if(user_data)
+       {
+               g_signal_handlers_disconnect_by_func(user_data, 
cb_sq_widget_factory_widget_destroyed, obj);
+       }
+}
+
+static void
 sq_widget_factory_notify(LSQCustomAction *action, const gchar *message)
 {
        GtkWidget *dialog = gtk_message_dialog_new(NULL, 
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "%s: %s", 
action->support->id, message);

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to