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