[brasero] Unref the session object when project type changes



commit d5895801382e955563ae1303f34d2dbcdc778a67
Author: Philippe Rouquier <bonfire-app wanadoo fr>
Date:   Mon Jun 22 20:26:30 2009 +0200

    Unref the session object when project type changes
    Make two widgets accept having a session set not only at construct time so we now unref the project session every time the project type changes

 libbrasero-burn/brasero-dest-selection.c |    2 -
 src/brasero-project-name.c               |   80 ++++++++++++++++-----
 src/brasero-project-name.h               |    4 +
 src/brasero-project.c                    |  114 ++++++++++++++----------------
 4 files changed, 119 insertions(+), 81 deletions(-)
---
diff --git a/libbrasero-burn/brasero-dest-selection.c b/libbrasero-burn/brasero-dest-selection.c
index c471467..47bb1a8 100644
--- a/libbrasero-burn/brasero-dest-selection.c
+++ b/libbrasero-burn/brasero-dest-selection.c
@@ -644,8 +644,6 @@ brasero_dest_selection_class_init (BraseroDestSelectionClass *klass)
 GtkWidget *
 brasero_dest_selection_new (BraseroBurnSession *session)
 {
-	g_return_val_if_fail (BRASERO_IS_BURN_SESSION (session), NULL);
-
 	return g_object_new (BRASERO_TYPE_DEST_SELECTION,
 			     "session", session,
 			     NULL);
diff --git a/src/brasero-project-name.c b/src/brasero-project-name.c
index c733196..640f080 100644
--- a/src/brasero-project-name.c
+++ b/src/brasero-project-name.c
@@ -566,6 +566,65 @@ brasero_project_name_track_removed (BraseroBurnSession *session,
 }
 
 static void
+brasero_project_name_unset_session (BraseroProjectName *project)
+{
+	BraseroProjectNamePrivate *priv;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (project);
+
+	if (!priv->session)
+		return;
+
+	g_signal_handlers_disconnect_by_func (priv->session,
+					      brasero_project_name_track_added,
+					      project);
+	g_signal_handlers_disconnect_by_func (priv->session,
+					      brasero_project_name_track_changed,
+					      project);
+	g_signal_handlers_disconnect_by_func (priv->session,
+					      brasero_project_name_track_removed,
+					      project);
+	g_signal_handlers_disconnect_by_func (priv->session,
+					      brasero_project_name_flags_changed,
+					      project);
+
+	g_object_unref (priv->session);
+	priv->session = NULL;
+}
+
+void
+brasero_project_name_set_session (BraseroProjectName *project,
+				  BraseroBurnSession *session)
+{
+	BraseroProjectNamePrivate *priv;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (project);
+
+	brasero_project_name_unset_session (project);
+
+	if (!session)
+		return;
+
+	priv->session = g_object_ref (session);
+	g_signal_connect (priv->session,
+			  "track-added",
+			  G_CALLBACK (brasero_project_name_track_added),
+			  project);
+	g_signal_connect (priv->session,
+			  "track-changed",
+			  G_CALLBACK (brasero_project_name_track_changed),
+			  project);
+	g_signal_connect (priv->session,
+			  "track-removed",
+			  G_CALLBACK (brasero_project_name_track_removed),
+			  project);
+	g_signal_connect (priv->session,
+			  "flags-changed",
+			  G_CALLBACK (brasero_project_name_flags_changed),
+			  project);
+}
+
+static void
 brasero_project_name_set_property (GObject *object,
 				   guint property_id,
 				   const GValue *value,
@@ -577,23 +636,8 @@ brasero_project_name_set_property (GObject *object,
 
 	switch (property_id) {
 	case PROP_SESSION:
-		priv->session = g_object_ref (g_value_get_object (value));
-		g_signal_connect (priv->session,
-				  "track-added",
-				  G_CALLBACK (brasero_project_name_track_added),
-				  object);
-		g_signal_connect (priv->session,
-				  "track-changed",
-				  G_CALLBACK (brasero_project_name_track_changed),
-				  object);
-			g_signal_connect (priv->session,
-				  "track-removed",
-				  G_CALLBACK (brasero_project_name_track_removed),
-				  object);
-		g_signal_connect (priv->session,
-				  "flags-changed",
-				  G_CALLBACK (brasero_project_name_flags_changed),
-				  object);
+		brasero_project_name_set_session (BRASERO_PROJECT_NAME (object),
+						  g_value_get_object (value));
 		break;
 
 	default:
@@ -670,7 +714,7 @@ brasero_project_name_class_init (BraseroProjectNameClass *klass)
 							      "The session",
 							      "The session to work with",
 							      BRASERO_TYPE_BURN_SESSION,
-							      G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
+							      G_PARAM_READWRITE));
 }
 
 GtkWidget *
diff --git a/src/brasero-project-name.h b/src/brasero-project-name.h
index a6d87c9..c794600 100644
--- a/src/brasero-project-name.h
+++ b/src/brasero-project-name.h
@@ -55,6 +55,10 @@ GType brasero_project_name_get_type (void) G_GNUC_CONST;
 GtkWidget *
 brasero_project_name_new (BraseroBurnSession *session);
 
+void
+brasero_project_name_set_session (BraseroProjectName *project,
+				  BraseroBurnSession *session);
+
 G_END_DECLS
 
 #endif /* _BRASERO_PROJECT_NAME_H_ */
diff --git a/src/brasero-project.c b/src/brasero-project.c
index b5e5d92..f03e845 100644
--- a/src/brasero-project.c
+++ b/src/brasero-project.c
@@ -1031,27 +1031,6 @@ brasero_project_init (BraseroProject *obj)
 	gtk_box_pack_start (GTK_BOX (obj), obj->priv->message, FALSE, TRUE, 0);
 	gtk_widget_show (obj->priv->message);
 
-	obj->priv->session = brasero_session_cfg_new ();
-
-	/* NOTE: "is-valid" is emitted whenever there is a change in the
-	 * contents of the session. So no need to connect to track-added, ... */
-	g_signal_connect (obj->priv->session,
-			  "is-valid",
-			  G_CALLBACK (brasero_project_is_valid),
-			  obj);
-	g_signal_connect (obj->priv->session,
-			  "track-added",
-			  G_CALLBACK (brasero_project_track_added),
-			  obj);
-	g_signal_connect (obj->priv->session,
-			  "track-changed",
-			  G_CALLBACK (brasero_project_track_changed),
-			  obj);
-	g_signal_connect (obj->priv->session,
-			  "track-removed",
-			  G_CALLBACK (brasero_project_track_removed),
-			  obj);
-
 	/* bottom */
 	box = gtk_hbox_new (FALSE, 6);
 	gtk_container_set_border_width (GTK_CONTAINER (box), 0);
@@ -1076,7 +1055,7 @@ brasero_project_init (BraseroProject *obj)
 			  GTK_EXPAND,
 			  0, 0);
 
-	selector = brasero_dest_selection_new (BRASERO_BURN_SESSION (obj->priv->session));
+	selector = brasero_dest_selection_new (NULL);
 	gtk_widget_show (selector);
 	obj->priv->selection = selector;
 
@@ -1537,11 +1516,24 @@ brasero_project_reset (BraseroProject *project)
     	project->priv->burnt = 0;
 	project->priv->modified = 0;
 
-	brasero_burn_session_set_flags (BRASERO_BURN_SESSION (project->priv->session),
-					BRASERO_BURN_FLAG_NONE);
-	brasero_burn_session_add_track (BRASERO_BURN_SESSION (project->priv->session),
-					NULL,
-					NULL);
+	if (project->priv->session) {
+		g_signal_handlers_disconnect_by_func (project->priv->session,
+						      brasero_project_is_valid,
+						      project);
+		g_signal_handlers_disconnect_by_func (project->priv->session,
+						      brasero_project_track_added,
+						      project);
+		g_signal_handlers_disconnect_by_func (project->priv->session,
+						      brasero_project_track_changed,
+						      project);
+		g_signal_handlers_disconnect_by_func (project->priv->session,
+						      brasero_project_track_removed,
+						      project);
+
+		/* unref session to force it to remove all temporary files */
+		g_object_unref (project->priv->session);
+		project->priv->session = NULL;
+	}
 
 	brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_SIZE);
 	brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_LOADING);
@@ -1549,12 +1541,44 @@ brasero_project_reset (BraseroProject *project)
 }
 
 static void
+brasero_project_new_session (BraseroProject *project)
+{
+	if (project->priv->session)
+		brasero_project_reset (project);
+
+	project->priv->session = brasero_session_cfg_new ();
+
+	/* NOTE: "is-valid" is emitted whenever there is a change in the
+	 * contents of the session. So no need to connect to track-added, ... */
+	g_signal_connect (project->priv->session,
+			  "is-valid",
+			  G_CALLBACK (brasero_project_is_valid),
+			  project);
+	g_signal_connect (project->priv->session,
+			  "track-added",
+			  G_CALLBACK (brasero_project_track_added),
+			  project);
+	g_signal_connect (project->priv->session,
+			  "track-changed",
+			  G_CALLBACK (brasero_project_track_changed),
+			  project);
+	g_signal_connect (project->priv->session,
+			  "track-removed",
+			  G_CALLBACK (brasero_project_track_removed),
+			  project);
+
+	brasero_dest_selection_set_session (BRASERO_DEST_SELECTION (project->priv->selection),
+					    BRASERO_BURN_SESSION (project->priv->session));
+	brasero_project_name_set_session (BRASERO_PROJECT_NAME (project->priv->name_display),
+					  BRASERO_BURN_SESSION (project->priv->session));
+}
+
+static void
 brasero_project_switch (BraseroProject *project, BraseroProjectType type)
 {
 	GtkAction *action;
 
-	/* FIXME: */
-	g_object_ref (project->priv->session);
+	brasero_project_new_session (project);
 
 	if (type == BRASERO_PROJECT_TYPE_AUDIO) {
 		project->priv->current = BRASERO_DISC (project->priv->audio);
@@ -1702,38 +1726,6 @@ brasero_project_set_none (BraseroProject *project)
 	GtkAction *action;
 	GtkWidget *status;
 
-	if (project->priv->project_status) {
-		gtk_widget_hide (project->priv->project_status);
-		gtk_dialog_response (GTK_DIALOG (project->priv->project_status),
-				     GTK_RESPONSE_CANCEL);
-		project->priv->project_status = NULL;
-	}
-
-	if (project->priv->chooser) {
-		gtk_widget_destroy (project->priv->chooser);
-		project->priv->chooser = NULL;
-	}
-
-	if (project->priv->project) {
-		g_free (project->priv->project);
-		project->priv->project = NULL;
-	}
-
-	if (project->priv->cover) {
-		g_free (project->priv->cover);
-		project->priv->cover = NULL;
-	}
-
-	if (project->priv->chooser) {
-		gtk_widget_destroy (project->priv->chooser);
-		project->priv->chooser = NULL;
-	}
-
-	if (project->priv->current) {
-		brasero_disc_set_session_contents (project->priv->current, NULL);
-		project->priv->current = NULL;
-	}
-
 	brasero_project_reset (project);
 
 	/* update buttons/menus */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]