[brasero] Unref the session object when project type changes
- From: Philippe Rouquier <philippr src gnome org>
- To: svn-commits-list gnome org
- Subject: [brasero] Unref the session object when project type changes
- Date: Mon, 22 Jun 2009 14:28:21 -0400 (EDT)
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]