brasero r1306 - in trunk: . po src



Author: philippr
Date: Wed Sep 24 19:52:26 2008
New Revision: 1306
URL: http://svn.gnome.org/viewvc/brasero?rev=1306&view=rev

Log:
	Another patch that moves the project name back to main window (was in
	burn option dialogs before)
	It removes the project size as a consequence, the size of the project is
	now in the statusbar
	It modifies the way multisession media are displayed and loaded
	It fixes some small bugs introduced by previous changes

	One known bug: the project name is not updated when a multisession disc
	is loaded

	* src/Makefile.am:
	* src/brasero-app.c (brasero_app_get_statusbar1),
	(brasero_menu_item_selected_cb), (brasero_menu_item_deselected_cb):
	* src/brasero-burn-options.c (brasero_burn_options_valid_media_cb),
	(brasero_burn_options_init):
	* src/brasero-data-disc.c (brasero_data_disc_import_session),
	(brasero_data_disc_import_session_cb),
	(brasero_data_disc_use_overburn_response_cb),
	(brasero_data_disc_project_oversized_cb),
	(brasero_disc_disc_session_import_response_cb),
	(brasero_data_disc_import_button_new),
	(brasero_data_disc_session_available_cb),
	(brasero_data_disc_session_loaded_cb), (brasero_data_disc_clear),
	(brasero_data_disc_reset), (brasero_data_disc_set_session_param),
	(brasero_data_disc_add_ui), (brasero_data_disc_init),
	(brasero_data_disc_iface_disc_init):
	* src/brasero-data-session.c (brasero_data_session_check_size),
	(brasero_data_session_size_changed),
	(brasero_data_session_remove_last),
	(brasero_data_session_add_last),
	(brasero_data_session_has_available_media),
	(brasero_data_session_get_available_media),
	(brasero_data_session_get_loaded_medium),
	(brasero_data_session_is_valid_multi),
	(brasero_data_session_disc_added_cb),
	(brasero_data_session_disc_removed_cb),
	(brasero_data_session_init), (brasero_data_session_finalize),
	(brasero_data_session_class_init):
	* src/brasero-data-session.h:
	* src/brasero-disc-message.c (brasero_disc_message_add_button),
	(brasero_disc_message_add_close_button):
	* src/brasero-disc-message.h:
	* src/brasero-disc-option-dialog.c
	(brasero_disc_option_dialog_set_disc),
	(brasero_disc_option_dialog_valid_media_cb):
	* src/brasero-disc.c:
	* src/brasero-disc.h:
	* src/brasero-file-filtered.c
	(brasero_file_filtered_get_label_text):
	* src/brasero-marshal.list:
	* src/brasero-notify.c (brasero_notify_button_add):
	* src/brasero-notify.h:
	* src/brasero-project-name.c (brasero_project_name_truncate_label),
	(brasero_project_name_get_default_label),
	(brasero_project_name_label_insert_text),
	(brasero_project_name_label_changed),
	(brasero_project_name_set_type),
	(brasero_project_name_set_multisession_medium),
	(brasero_project_name_init), (brasero_project_name_finalize),
	(brasero_project_name_class_init), (brasero_project_name_new):
	* src/brasero-project-name.h:
	* src/brasero-project-size.c:
	* src/brasero-project-size.h:
	* src/brasero-project.c (brasero_project_get_proportion),
	(brasero_project_init), (brasero_project_update_project_size),
	(brasero_project_size_changed_cb),
	(brasero_project_flags_changed_cb), (brasero_project_burn),
	(brasero_project_switch), (brasero_project_set_none),
	(brasero_project_open_project), (brasero_project_open_playlist):
	* src/brasero-session-cfg.c (brasero_session_cfg_check):


Added:
   trunk/src/brasero-project-name.c
   trunk/src/brasero-project-name.h
Removed:
   trunk/src/brasero-project-size.c
   trunk/src/brasero-project-size.h
Modified:
   trunk/ChangeLog
   trunk/po/ChangeLog
   trunk/po/POTFILES.in
   trunk/src/Makefile.am
   trunk/src/brasero-app.c
   trunk/src/brasero-burn-options.c
   trunk/src/brasero-data-disc.c
   trunk/src/brasero-data-session.c
   trunk/src/brasero-data-session.h
   trunk/src/brasero-disc-message.c
   trunk/src/brasero-disc-message.h
   trunk/src/brasero-disc-option-dialog.c
   trunk/src/brasero-disc.c
   trunk/src/brasero-disc.h
   trunk/src/brasero-file-filtered.c
   trunk/src/brasero-marshal.list
   trunk/src/brasero-notify.c
   trunk/src/brasero-notify.h
   trunk/src/brasero-project.c
   trunk/src/brasero-session-cfg.c

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Wed Sep 24 19:52:26 2008
@@ -1,6 +1,7 @@
 # List of source files containing translatable strings.
 [encoding: UTF-8]
 
+src/brasero-project-name.c
 src/brasero-burn-options.c
 src/brasero-src-info.c
 src/brasero-app.c

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Wed Sep 24 19:52:26 2008
@@ -93,8 +93,6 @@
 	brasero-layout.h         \
 	brasero-file-chooser.c         \
 	brasero-file-chooser.h         \
-	brasero-project-size.c         \
-	brasero-project-size.h         \
 	burn-session.h 		\
 	brasero-sum-dialog.c         \
 	brasero-sum-dialog.h         \
@@ -276,7 +274,9 @@
 	brasero-session-cfg.h           \
 	brasero-session-cfg.c           \
 	brasero-burn-options.h           \
-	brasero-burn-options.c
+	brasero-burn-options.c           \
+	brasero-project-name.c           \
+	brasero-project-name.h
 
 if BUILD_INOTIFY
 brasero_SOURCES += brasero-file-monitor.c brasero-file-monitor.h

Modified: trunk/src/brasero-app.c
==============================================================================
--- trunk/src/brasero-app.c	(original)
+++ trunk/src/brasero-app.c	Wed Sep 24 19:52:26 2008
@@ -169,7 +169,7 @@
 	priv = BRASERO_APP_PRIVATE (app);
 
 	/* FIXME: change with future changes */
-	return priv->statusbar2;
+	return priv->statusbar1;
 }
 
 GtkWidget *
@@ -547,6 +547,10 @@
 				    priv->tooltip_ctx,
 				    message);
 		g_free (message);
+
+		gtk_statusbar_push (GTK_STATUSBAR (priv->statusbar1),
+				    priv->tooltip_ctx,
+				    "");
 	}
 }
 
@@ -560,6 +564,8 @@
 
 	gtk_statusbar_pop (GTK_STATUSBAR (priv->statusbar2),
 			   priv->tooltip_ctx);
+	gtk_statusbar_pop (GTK_STATUSBAR (priv->statusbar1),
+			   priv->tooltip_ctx);
 }
 
 static void

Modified: trunk/src/brasero-burn-options.c
==============================================================================
--- trunk/src/brasero-burn-options.c	(original)
+++ trunk/src/brasero-burn-options.c	Wed Sep 24 19:52:26 2008
@@ -235,32 +235,19 @@
 		gtk_widget_show (priv->info);
 	}
 
-	if (priv->message_input) {
-		gtk_widget_hide (priv->message_input);
-		brasero_notify_message_remove (BRASERO_NOTIFY (priv->message_input),
-					       BRASERO_NOTIFY_CONTEXT_SIZE);
-	}
-
-	brasero_notify_message_remove (BRASERO_NOTIFY (priv->message_output),
-				       BRASERO_NOTIFY_CONTEXT_SIZE);
-
 	if (valid == BRASERO_SESSION_INSUFFICIENT_SPACE) {
-		GtkWidget *message;
-
-		message = brasero_notify_message_add (BRASERO_NOTIFY (priv->message_output),
-						      _("Please, choose another CD or DVD or insert a new one."),
-						      _("The size of the project is too large for the disc even with the overburn option."),
-						      -1,
-						      BRASERO_NOTIFY_CONTEXT_SIZE);
+		brasero_notify_message_add (BRASERO_NOTIFY (priv->message_output),
+					    _("Please, choose another CD or DVD or insert a new one."),
+					    _("The size of the project is too large for the disc even with the overburn option."),
+					    -1,
+					    BRASERO_NOTIFY_CONTEXT_SIZE);
 	}
 	else if (valid == BRASERO_SESSION_NO_OUTPUT) {
-		GtkWidget *message;
-
-		message = brasero_notify_message_add (BRASERO_NOTIFY (priv->message_output),
-						      _("Please, insert a recordable CD or DVD."),
-						      _("There is no recordable medium inserted."),
-						      -1,
-						      BRASERO_NOTIFY_CONTEXT_SIZE);
+		brasero_notify_message_add (BRASERO_NOTIFY (priv->message_output),
+					    _("Please, insert a recordable CD or DVD."),
+					    _("There is no recordable medium inserted."),
+					    -1,
+					    BRASERO_NOTIFY_CONTEXT_SIZE);
 	}
 	else if (valid == BRASERO_SESSION_NO_INPUT_MEDIUM) {
 		GtkWidget *message;
@@ -287,12 +274,11 @@
 		}
 	}
 	else if (valid == BRASERO_SESSION_NOT_SUPPORTED) {
-		gtk_widget_show (priv->message_input);
-		message = brasero_notify_message_add (BRASERO_NOTIFY (priv->message_output),
-						      _("Please, replace the disc with a recordable CD or DVD."),
-						      _("The medium is not writable with the current set of plugins."),
-						      -1,
-						      BRASERO_NOTIFY_CONTEXT_SIZE);
+		brasero_notify_message_add (BRASERO_NOTIFY (priv->message_output),
+					    _("Please, replace the disc with a recordable CD or DVD."),
+					    _("The medium is not writable with the current set of plugins."),
+					    -1,
+					    BRASERO_NOTIFY_CONTEXT_SIZE);
 	}
 	else if (valid == BRASERO_SESSION_OVERBURN_NECESSARY) {
 		GtkWidget *message;
@@ -300,6 +286,7 @@
 		message = brasero_notify_message_add (BRASERO_NOTIFY (priv->message_output),
 						      _("Would you like to burn beyond the disc reported capacity?"),
 						      _("The size of the project is too large for the disc."
+							"\nYou may want to use this option if you're using 90 or 100 min CD-R(W) which can't be properly recognised and therefore need overburn option."
 							"\nNOTE: This option might cause failure."),
 						      -1,
 						      BRASERO_NOTIFY_CONTEXT_SIZE);
@@ -320,7 +307,17 @@
 	else if (valid == BRASERO_SESSION_APPENDING) {
 		
 	}
-*/
+*/	else {
+		if (priv->message_input) {
+			gtk_widget_hide (priv->message_input);
+			brasero_notify_message_remove (BRASERO_NOTIFY (priv->message_input),
+						       BRASERO_NOTIFY_CONTEXT_SIZE);
+		}
+
+		brasero_notify_message_remove (BRASERO_NOTIFY (priv->message_output),
+					       BRASERO_NOTIFY_CONTEXT_SIZE);
+	}
+
 	gtk_window_resize (GTK_WINDOW (self), 10, 10);
 }
 
@@ -399,7 +396,7 @@
 
 	string = g_strdup_printf ("<b>%s</b>", _("Select a disc to write to"));
 	selection = brasero_utils_pack_properties (string,
-						  // priv->message_output,
+						   priv->message_output,
 						   priv->copies_box,
 						   priv->info,
 						   priv->selection,

Modified: trunk/src/brasero-data-disc.c
==============================================================================
--- trunk/src/brasero-data-disc.c	(original)
+++ trunk/src/brasero-data-disc.c	Wed Sep 24 19:52:26 2008
@@ -70,6 +70,7 @@
 #include "burn-basics.h"
 #include "burn-track.h"
 #include "burn-session.h"
+#include "burn-volume-obj.h"
 
 
 typedef struct _BraseroDataDiscPrivate BraseroDataDiscPrivate;
@@ -84,6 +85,7 @@
 
 	GtkUIManager *manager;
 	GtkActionGroup *disc_group;
+	GtkActionGroup *import_group;
 
 	gint press_start_x;
 	gint press_start_y;
@@ -97,15 +99,15 @@
 	guint editing:1;
 	guint reject_files:1;
 
+	guint overburning:1;
+
 	guint G2_files:1;
 	guint deep_directory:1;
 };
 
 #define BRASERO_DATA_DISC_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_DATA_DISC, BraseroDataDiscPrivate))
 
-static void
-brasero_data_disc_import_session_cb (GtkToggleAction *action,
-				     BraseroDataDisc *disc);
+
 static void
 brasero_data_disc_new_folder_clicked_cb (GtkButton *button,
 					 BraseroDataDisc *disc);
@@ -136,18 +138,12 @@
 	 G_CALLBACK (brasero_data_disc_new_folder_clicked_cb)},
 };
 
-static GtkToggleActionEntry toggle_entries [] = {
-	{"ImportSession", "drive-optical", N_("Import Session"), NULL, N_("Import session"),
-	 G_CALLBACK (brasero_data_disc_import_session_cb), FALSE},
-};
-
 static const gchar *description = {
 	"<ui>"
 	"<menubar name='menubar' >"
 		"<menu action='EditMenu'>"
 		"<placeholder name='EditPlaceholder'>"
 			"<menuitem action='NewFolder'/>"
-			"<menuitem action='ImportSession'/>"
 		"</placeholder>"
 		"</menu>"
 	"</menubar>"
@@ -162,7 +158,6 @@
 		"<placeholder name='DiscButtonPlaceholder'>"
 			"<separator/>"
 			"<toolitem action='NewFolder'/>"
-			"<toolitem action='ImportSession'/>"
 		"</placeholder>"
 	"</toolbar>"
 	"</ui>"
@@ -199,6 +194,9 @@
 			 G_IMPLEMENT_INTERFACE (BRASERO_TYPE_DISC,
 					        brasero_data_disc_iface_disc_init));
 
+#define BRASERO_DATA_DISC_MEDIUM	"brasero-data-disc-medium"
+#define BRASERO_DATA_DISC_MERGE_ID	"brasero-data-disc-merge-id"
+
 /**
  * Actions callbacks
  */
@@ -229,6 +227,7 @@
 
 static gboolean
 brasero_data_disc_import_session (BraseroDataDisc *disc,
+				  BraseroMedium *medium,
 				  gboolean import)
 {
 	BraseroDataDiscPrivate *priv;
@@ -238,7 +237,7 @@
 	if (import) {
 		GError *error = NULL;
 
-		if (!brasero_data_session_add_last (BRASERO_DATA_SESSION (priv->project), &error)) {
+		if (!brasero_data_session_add_last (BRASERO_DATA_SESSION (priv->project), medium, &error)) {
 			brasero_data_disc_import_failure_dialog (disc, error);
 			return FALSE;
 		}
@@ -253,22 +252,28 @@
 
 static void
 brasero_data_disc_import_session_cb (GtkToggleAction *action,
-				     BraseroDataDisc *disc)
+				     BraseroDataDisc *self)
 {
 	BraseroDataDiscPrivate *priv;
+	BraseroMedium *medium;
 	gboolean res;
 
-	priv = BRASERO_DATA_DISC_PRIVATE (disc);
+	priv = BRASERO_DATA_DISC_PRIVATE (self);
 
-	brasero_notify_message_remove (BRASERO_NOTIFY (priv->message), BRASERO_NOTIFY_CONTEXT_MULTISESSION);
+	medium = g_object_get_data (G_OBJECT (action), BRASERO_DATA_DISC_MEDIUM);
+	if (!medium)
+		return;
 
-	res = brasero_data_disc_import_session (disc, gtk_toggle_action_get_active (action));
+	brasero_notify_message_remove (BRASERO_NOTIFY (priv->message), BRASERO_NOTIFY_CONTEXT_MULTISESSION);
+	res = brasero_data_disc_import_session (self,
+						medium,
+						gtk_toggle_action_get_active (action));
 
 	/* make sure the button reflects the current state */
 	if (gtk_toggle_action_get_active (action) != res) {
-		g_signal_handlers_block_by_func (action, brasero_data_disc_import_session_cb, disc);
+		g_signal_handlers_block_by_func (action, brasero_data_disc_import_session_cb, self);
 		gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), res);
-		g_signal_handlers_unblock_by_func (action, brasero_data_disc_import_session_cb, disc);
+		g_signal_handlers_unblock_by_func (action, brasero_data_disc_import_session_cb, self);
 	}
 }
 
@@ -579,6 +584,76 @@
 }
 
 static void
+brasero_data_disc_use_overburn_response_cb (GtkButton *button,
+					    GtkResponseType response,
+					    BraseroDataDisc *self)
+{
+	BraseroDataDiscPrivate *priv;
+
+	priv = BRASERO_DATA_DISC_PRIVATE (self);
+
+	if (response != GTK_RESPONSE_OK)
+		return;
+
+	priv->overburning = 1;
+}
+
+static void
+brasero_data_disc_project_oversized_cb (BraseroDataProject *project,
+					gboolean oversized,
+					gboolean overburn,
+					BraseroDataDisc *self)
+{
+	GtkWidget *message;
+	BraseroDataDiscPrivate *priv;
+
+	priv = BRASERO_DATA_DISC_PRIVATE (self);
+
+	if (overburn) {
+		if (priv->overburning)
+			return;
+
+		message = brasero_notify_message_add (BRASERO_NOTIFY (priv->message),
+						      _("Would you like to burn beyond the disc reported capacity?"),
+						      _("The size of the project is too large for the disc and you must remove files from the project otherwise."
+							"\nYou may want to use this option if you're using 90 or 100 min CD-R(W) which can't be properly recognised and therefore need overburn option."
+							"\nNOTE: This option might cause failure."),
+						      -1,
+						      BRASERO_NOTIFY_CONTEXT_SIZE);
+
+		brasero_disc_message_set_image (BRASERO_DISC_MESSAGE (message), GTK_STOCK_DIALOG_WARNING);
+		brasero_notify_button_add (BRASERO_NOTIFY (priv->message),
+					   BRASERO_DISC_MESSAGE (message),
+					   _("_Overburn"),
+					   _("Burn beyond the disc reported capacity"),
+					   GTK_RESPONSE_OK);
+		brasero_notify_button_add (BRASERO_NOTIFY (priv->message),
+					   BRASERO_DISC_MESSAGE (message),
+					   _("_Cancel"),
+					   _("Click here not to use overburning"),
+					   GTK_RESPONSE_CANCEL);
+		
+		g_signal_connect (BRASERO_DISC_MESSAGE (message),
+				  "response",
+				  G_CALLBACK (brasero_data_disc_use_overburn_response_cb),
+				  self);
+	}
+	else if (oversized) {
+		message = brasero_notify_message_add (BRASERO_NOTIFY (priv->message),
+						      _("Please, delete some files from the project."),
+						      _("The size of the project is too large for the disc even with the overburn option."),
+						      -1,
+						      BRASERO_NOTIFY_CONTEXT_SIZE);
+
+		brasero_disc_message_set_image (BRASERO_DISC_MESSAGE (message), GTK_STOCK_DIALOG_WARNING);
+		brasero_disc_message_add_close_button (BRASERO_DISC_MESSAGE (message));
+	}
+	else
+		brasero_notify_message_remove (BRASERO_NOTIFY (priv->message),
+					       BRASERO_NOTIFY_CONTEXT_SIZE);
+}
+
+static void
 brasero_data_disc_project_loaded_cb (BraseroDataProject *project,
 				     gint loading,
 				     BraseroDataDisc *self)
@@ -1086,15 +1161,21 @@
 {
 	gboolean res;
 	GtkAction *action;
+	gchar *action_name;
+	BraseroMedium *medium;
 	BraseroDataDiscPrivate *priv;
 
 	if (response != GTK_RESPONSE_OK)
 		return;
 
 	priv = BRASERO_DATA_DISC_PRIVATE (self);
-	res = brasero_data_disc_import_session (self, TRUE);
 
-	action = gtk_action_group_get_action (priv->disc_group, "ImportSession");
+	medium = g_object_get_data (G_OBJECT (button), BRASERO_DATA_DISC_MEDIUM);
+	res = brasero_data_disc_import_session (self, medium, TRUE);
+
+	action_name = g_strdup_printf ("Import_%s", brasero_medium_get_udi (medium));
+	action = gtk_action_group_get_action (priv->import_group, action_name);
+	g_free (action_name);
 
 	g_signal_handlers_block_by_func (action, brasero_data_disc_import_session_cb, self);
 	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), res);
@@ -1102,50 +1183,177 @@
 }
 
 static void
+brasero_data_disc_import_button_new (BraseroDataDisc *self,
+				     BraseroMedium *medium)
+{
+	int merge_id;
+	gchar *string;
+	GtkAction *action;
+	gchar *action_name;
+	gchar *volume_name;
+	gchar *description;
+	BraseroDataDiscPrivate *priv;
+	GtkToggleActionEntry toggle_entry = { 0, };
+
+	priv = BRASERO_DATA_DISC_PRIVATE (self);
+
+	action_name = g_strdup_printf ("Import_%s", brasero_medium_get_udi (medium));
+	volume_name = brasero_volume_get_display_label (BRASERO_VOLUME (medium), FALSE);
+
+	/* Translators: %s is the name of the volume to import */
+	string = g_strdup_printf (_("Import %s"), volume_name);
+	g_free (volume_name);
+
+	toggle_entry.name = action_name;
+	toggle_entry.stock_id = "drive-optical";
+	toggle_entry.label = string;
+	toggle_entry.tooltip = string;
+	toggle_entry.callback = G_CALLBACK (brasero_data_disc_import_session_cb);
+
+	gtk_action_group_add_toggle_actions (priv->import_group,
+					     &toggle_entry,
+					     1,
+					     self);
+	g_free (string);
+
+	action = gtk_action_group_get_action (priv->import_group, action_name);
+	if (!action) {
+		g_free (action_name);
+		return;
+	}
+
+	g_object_ref (medium);
+	g_object_set_data (G_OBJECT (action),
+			   BRASERO_DATA_DISC_MEDIUM,
+			   medium);
+
+	g_object_set (action,
+		      "short-label", _("Import"), /* for toolbar buttons */
+		      NULL);
+
+	description = g_strdup_printf ("<ui>"
+				       "<menubar name='menubar'>"
+				       "<menu action='EditMenu'>"
+				       "<placeholder name='EditPlaceholder'>"
+				       "<menuitem action='%s'/>"
+				       "</placeholder>"
+				       "</menu>"
+				       "</menubar>"
+				       "<toolbar name='Toolbar'>"
+				       "<placeholder name='DiscButtonPlaceholder'>"
+				       "<toolitem action='%s'/>"
+				       "</placeholder>"
+				       "</toolbar>"
+				       "</ui>",
+				       action_name,
+				       action_name);
+
+	merge_id = gtk_ui_manager_add_ui_from_string (priv->manager,
+						      description,
+						      -1,
+						      NULL);
+	g_object_set_data (G_OBJECT( action),
+			   BRASERO_DATA_DISC_MERGE_ID,
+			   GINT_TO_POINTER (merge_id));
+
+	g_free (description);
+	g_free (action_name);
+}
+
+static void
 brasero_data_disc_session_available_cb (BraseroDataSession *session,
-					gboolean multisession,
+					BraseroMedium *medium,
+					gboolean available,
 					BraseroDataDisc *self)
 {
-	GtkAction *action;
 	BraseroDataDiscPrivate *priv;
 
 	priv = BRASERO_DATA_DISC_PRIVATE (self);
-	action = gtk_action_group_get_action (priv->disc_group, "ImportSession");
 
-	if (multisession) {
+	if (available) {
+		gchar *string;
+		gchar *volume_name;
 		GtkWidget *message;
 
-		gtk_action_set_sensitive (action, TRUE);
+		/* create button and menu entry */
+		brasero_data_disc_import_button_new (self, medium);
+
+		/* ask user */
+		volume_name = brasero_volume_get_display_label (BRASERO_VOLUME (medium), FALSE);
+
+		/* Translators: %s is the name of the volume to import */
+		string = g_strdup_printf (_("Import %s"), volume_name);
+		g_free (volume_name);
+
+		string = g_strdup_printf (_("Do you want to import the session from \'%s\'?"), volume_name);
 		message = brasero_notify_message_add (BRASERO_NOTIFY (priv->message),
-						      _("A multisession disc is inserted:"),
-						      _("Do you want to import its contents?"),
+						      string,
+						      _("That way, old files from previous sessions will be usable after burning."),
 						      10000,
 						      BRASERO_NOTIFY_CONTEXT_MULTISESSION);
+		g_free (string);
 
-		brasero_disc_message_set_image (BRASERO_DISC_MESSAGE (message), GTK_STOCK_DIALOG_INFO);
+		brasero_disc_message_set_image (BRASERO_DISC_MESSAGE (message),
+						GTK_STOCK_DIALOG_INFO);
 
 		brasero_notify_button_add (BRASERO_NOTIFY (priv->message),
 					   BRASERO_DISC_MESSAGE (message),
 					   _("_Import Session"),
 					   _("Click here to import its contents"),
 					   GTK_RESPONSE_OK);
+
+		/* no need to ref the medium since its removal would cause the
+		 * hiding of the message it's associated with */
+		g_object_set_data (G_OBJECT (message),
+				   BRASERO_DATA_DISC_MEDIUM,
+				   medium);
+
 		g_signal_connect (BRASERO_DISC_MESSAGE (message),
 				  "response",
 				  G_CALLBACK (brasero_disc_disc_session_import_response_cb),
 				  self);
 	}
 	else {
+		int merge_id;
+		GtkAction *action;
+		gchar *action_name;
+
+		action_name = g_strdup_printf ("Import_%s", brasero_medium_get_udi (medium));
+		action = gtk_action_group_get_action (priv->import_group, action_name);
+		g_free (action_name);
+
 		brasero_notify_message_remove (BRASERO_NOTIFY (priv->message), BRASERO_NOTIFY_CONTEXT_MULTISESSION);
-		gtk_action_set_sensitive (action, FALSE);
-		gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), FALSE);
+
+		merge_id = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action), BRASERO_DATA_DISC_MERGE_ID));
+		gtk_ui_manager_remove_ui (priv->manager, merge_id);
+		gtk_action_group_remove_action (priv->import_group, action);
+
+		/* unref it since we reffed it when it was associated with the action */
+		g_object_unref (medium);
 	}
 }
 
 static void
 brasero_data_disc_session_loaded_cb (BraseroDataSession *session,
+				     BraseroMedium *medium,
 				     gboolean loaded,
 				     BraseroDataDisc *self)
 {
+	BraseroDataDiscPrivate *priv;
+	gchar *action_name;
+	GtkAction *action;
+
+	priv = BRASERO_DATA_DISC_PRIVATE (self);
+
+	action_name = g_strdup_printf ("Import_%s", brasero_medium_get_udi (medium));
+	action = gtk_action_group_get_action (priv->import_group, action_name);
+	g_free (action_name);
+
+	g_signal_handlers_block_by_func (action, brasero_data_disc_import_session_cb, self);
+	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), loaded);
+	g_signal_handlers_unblock_by_func (action, brasero_data_disc_import_session_cb, self);
+
+	/* Update buttons states */
 	if (loaded)
 		brasero_disc_flags_changed (BRASERO_DISC (self), BRASERO_BURN_FLAG_MERGE);
 	else
@@ -1171,12 +1379,17 @@
 	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
 		gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), FALSE);
 
+	if (brasero_data_session_get_loaded_medium (BRASERO_DATA_SESSION (priv->project)))
+		brasero_data_session_remove_last (BRASERO_DATA_SESSION (priv->project));
+
 	if (priv->load_errors) {
 		g_slist_foreach (priv->load_errors, (GFunc) g_free , NULL);
 		g_slist_free (priv->load_errors);
 		priv->load_errors = NULL;
 	}
 
+	priv->overburning = FALSE;
+
 	priv->G2_files = FALSE;
 	priv->deep_directory = FALSE;
 
@@ -1195,13 +1408,19 @@
 brasero_data_disc_reset (BraseroDisc *disc)
 {
 	BraseroDataDiscPrivate *priv;
-	GtkAction *action;
 
 	priv = BRASERO_DATA_DISC_PRIVATE (disc);
 
-	action = gtk_action_group_get_action (priv->disc_group, "ImportSession");
-	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
-		gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), FALSE);
+	/* Unload session */
+	if (brasero_data_session_get_loaded_medium (BRASERO_DATA_SESSION (priv->project)))
+		brasero_data_session_remove_last (BRASERO_DATA_SESSION (priv->project));
+
+	/* Hide all toggle actions for session importing */
+	if (gtk_action_group_get_visible (priv->import_group))
+		gtk_action_group_set_visible (priv->import_group, FALSE);
+
+	if (gtk_action_group_get_visible (priv->disc_group))
+		gtk_action_group_set_visible (priv->disc_group, FALSE);
 
 	if (priv->load_errors) {
 		g_slist_foreach (priv->load_errors, (GFunc) g_free , NULL);
@@ -1211,6 +1430,8 @@
 
 	brasero_data_project_reset (priv->project);
 
+	priv->overburning = FALSE;
+
 	priv->loading = FALSE;
 	priv->G2_files = FALSE;
 	priv->deep_directory = FALSE;
@@ -1371,12 +1592,24 @@
 
 	/* set multisession options */
 	if (brasero_data_session_get_loaded_medium (BRASERO_DATA_SESSION (priv->project))) {
+		BraseroDrive *drive;
+		BraseroMedium *medium;
+
+		medium = brasero_data_session_get_loaded_medium (BRASERO_DATA_SESSION (priv->project));
+		if (medium)
+			drive = brasero_medium_get_drive (medium);
+		else
+			drive = NULL;
+
+		if (priv->overburning)
+			brasero_burn_session_add_flag (session, BRASERO_BURN_FLAG_OVERBURN);
+
 		/* remove the following flag just in case */
 		brasero_burn_session_remove_flag (session,
 						  BRASERO_BURN_FLAG_FAST_BLANK|
 						  BRASERO_BURN_FLAG_BLANK_BEFORE_WRITE);
 		brasero_burn_session_add_flag (session, BRASERO_BURN_FLAG_MERGE);
-		brasero_burn_session_set_burner (session, brasero_data_session_get_loaded_medium (BRASERO_DATA_SESSION (priv->project)));
+		brasero_burn_session_set_burner (session, drive);
 	}
 
 	type.type = BRASERO_TRACK_TYPE_DATA;
@@ -1544,16 +1777,6 @@
 	return TRUE;
 }
 
-static void
-brasero_data_disc_set_drive (BraseroDisc *disc, BraseroDrive *drive)
-{
-	BraseroDataDiscPrivate *priv;
-
-	priv = BRASERO_DATA_DISC_PRIVATE (disc);
-
-	brasero_data_session_set_drive (BRASERO_DATA_SESSION (priv->project), drive);
-}
-
 static guint
 brasero_data_disc_add_ui (BraseroDisc *disc,
 			  GtkUIManager *manager,
@@ -1565,7 +1788,6 @@
 	guint merge_id;
 
 	priv = BRASERO_DATA_DISC_PRIVATE (disc);
-
 	if (priv->message) {
 		g_object_unref (priv->message);
 		priv->message = NULL;
@@ -1581,39 +1803,56 @@
 					      entries,
 					      G_N_ELEMENTS (entries),
 					      disc);
-		gtk_action_group_add_toggle_actions (priv->disc_group,
-						     toggle_entries,
-						     G_N_ELEMENTS (toggle_entries),
-						     disc);
 		gtk_ui_manager_insert_action_group (manager,
 						    priv->disc_group,
 						    0);
-	}
 
-	merge_id = gtk_ui_manager_add_ui_from_string (manager,
-						      description,
-						      -1,
-						      &error);
-	if (!merge_id) {
-		BRASERO_BURN_LOG ("Adding ui elements failed: %s", error->message);
-		g_error_free (error);
-		return 0;
+		merge_id = gtk_ui_manager_add_ui_from_string (manager,
+							      description,
+							      -1,
+							      &error);
+		if (!merge_id) {
+			BRASERO_BURN_LOG ("Adding ui elements failed: %s", error->message);
+			g_error_free (error);
+			return 0;
+		}
+
+		action = gtk_action_group_get_action (priv->disc_group, "NewFolder");
+		g_object_set (action,
+			      "short-label", _("New Folder"), /* for toolbar buttons */
+			      NULL);
+	
+		priv->manager = manager;
+		g_object_ref (manager);
 	}
+	else
+		gtk_action_group_set_visible (priv->disc_group, TRUE);
 
-	action = gtk_action_group_get_action (priv->disc_group, "ImportSession");
-	gtk_action_set_sensitive (action, FALSE);
-	g_object_set (action,
-		      "short-label", _("Import"), /* for toolbar buttons */
-		      NULL);
+	/* Now let's take care of all the available sessions */
+	if (!priv->import_group) {
+		GSList *iter;
+		GSList *list;
 
-	action = gtk_action_group_get_action (priv->disc_group, "NewFolder");
-	g_object_set (action,
-		      "short-label", _("New Folder"), /* for toolbar buttons */
-		      NULL);
+		priv->import_group = gtk_action_group_new ("session_import_group");
+		gtk_action_group_set_translation_domain (priv->import_group, GETTEXT_PACKAGE);
+		gtk_ui_manager_insert_action_group (manager,
+						    priv->import_group,
+						    0);
+
+		list = brasero_data_session_get_available_media (BRASERO_DATA_SESSION (priv->project));
+		for (iter = list; iter; iter = iter->next) {
+			BraseroMedium *medium;
 
-	priv->manager = manager;
-	g_object_ref (manager);
-	return merge_id;
+			medium = iter->data;
+			brasero_data_disc_import_button_new (BRASERO_DATA_DISC (disc), medium);
+		}
+		g_slist_foreach (list, (GFunc) g_object_unref, NULL);
+		g_slist_free (list);
+	}
+	else
+		gtk_action_group_set_visible (priv->import_group, TRUE);
+
+	return -1;
 }
 
 /**
@@ -2135,6 +2374,11 @@
 			  G_CALLBACK (brasero_data_disc_project_loaded_cb),
 			  object);
 	g_signal_connect (priv->project,
+			  "oversize",
+			  G_CALLBACK (brasero_data_disc_project_oversized_cb),
+			  object);
+
+	g_signal_connect (priv->project,
 			  "row-inserted",
 			  G_CALLBACK (brasero_data_disc_contents_added_cb),
 			  object);
@@ -2381,7 +2625,6 @@
 	iface->get_status = brasero_data_disc_get_status;
 	iface->get_selected_uri = brasero_data_disc_get_selected_uri;
 	iface->add_ui = brasero_data_disc_add_ui;
-	iface->set_drive = brasero_data_disc_set_drive;
 }
 
 static void

Modified: trunk/src/brasero-data-session.c
==============================================================================
--- trunk/src/brasero-data-session.c	(original)
+++ trunk/src/brasero-data-session.c	Wed Sep 24 19:52:26 2008
@@ -33,18 +33,31 @@
 #include "scsi-device.h"
 
 #include "burn-drive.h"
+#include "burn-medium.h"
+#include "burn-medium-monitor.h"
 
 #include "brasero-data-session.h"
 #include "brasero-data-project.h"
 #include "brasero-file-node.h"
 
+#include "brasero-marshal.h"
+
 typedef struct _BraseroDataSessionPrivate BraseroDataSessionPrivate;
 struct _BraseroDataSessionPrivate
 {
-	BraseroDrive *drive;
+	/* Multisession drives that are inserted */
+	GSList *media;
+
+	/* Drive whose session is loaded */
+	BraseroMedium *loaded;
+
+	/* Nodes from the loaded session in the tree */
 	GSList *nodes;
 
-	guint multi_inserted:1;
+	glong size_changed_sig;
+
+	guint is_oversized:1;
+	guint is_overburn:1;
 };
 
 #define BRASERO_DATA_SESSION_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_DATA_SESSION, BraseroDataSessionPrivate))
@@ -52,6 +65,7 @@
 G_DEFINE_TYPE (BraseroDataSession, brasero_data_session, BRASERO_TYPE_DATA_PROJECT);
 
 enum {
+	OVERSIZE_SIGNAL,
 	AVAILABLE_SIGNAL,
 	LOADED_SIGNAL,
 	LAST_SIGNAL
@@ -59,6 +73,76 @@
 
 static gulong brasero_data_session_signals [LAST_SIGNAL] = { 0 };
 
+static void
+brasero_data_session_check_size (BraseroDataSession *self)
+{
+	BraseroDataSessionPrivate *priv;
+	gint64 max_sectors = 0;
+	gint64 medium_sect = 0;
+	gint64 sectors = 0;
+
+	priv = BRASERO_DATA_SESSION_PRIVATE (self);
+
+	sectors = brasero_data_project_get_size (BRASERO_DATA_PROJECT (self));
+	brasero_medium_get_free_space (priv->loaded,
+				       NULL,
+				       &medium_sect);
+
+	/* NOTE: This is not good since with a DVD 3% of 4.3G may be too much
+	 * with 3% we are slightly over the limit of the most overburnable discs
+	 * but at least users can try to overburn as much as they can. */
+
+	/* The idea would be to test write the disc with cdrecord from /dev/null
+	 * until there is an error and see how much we were able to write. So,
+	 * when we propose overburning to the user, we could ask if he wants
+	 * us to determine how much data can be written to a particular disc
+	 * provided he has chosen a real disc. */
+	max_sectors = medium_sect * 103 / 100;
+
+	if (medium_sect < sectors) {
+		/* send it once */
+		if (!priv->is_oversized || priv->is_overburn) {
+			gboolean overburn;
+
+			/* see if overburn is possible */
+			overburn = (sectors < max_sectors);
+			if (!priv->is_overburn && overburn)
+				g_signal_emit (self,
+					       brasero_data_session_signals [OVERSIZE_SIGNAL],
+					       0,
+					       TRUE,
+					       overburn);
+			else if (!overburn)
+				g_signal_emit (self,
+					       brasero_data_session_signals [OVERSIZE_SIGNAL],
+					       0,
+					       TRUE,
+					       overburn);
+
+			priv->is_overburn = overburn;
+		}
+
+		priv->is_oversized = TRUE;
+	}
+	else {
+		if (priv->is_oversized || priv->is_overburn)
+			g_signal_emit (self,
+				       brasero_data_session_signals [OVERSIZE_SIGNAL],
+				       0,
+				       FALSE,
+				       FALSE);
+
+		priv->is_oversized = FALSE;
+		priv->is_overburn = FALSE;
+	}
+}
+
+static void
+brasero_data_session_size_changed (BraseroDataProject *project,
+				   gpointer NULL_data)
+{
+	brasero_data_session_check_size (BRASERO_DATA_SESSION (project));
+}
 
 void
 brasero_data_session_remove_last (BraseroDataSession *self)
@@ -85,7 +169,21 @@
 	g_signal_emit (self,
 		       brasero_data_session_signals [LOADED_SIGNAL],
 		       0,
+		       priv->loaded,
 		       FALSE);
+
+	if (priv->loaded) {
+		g_object_unref (priv->loaded);
+		priv->loaded = NULL;
+	}
+
+	if (priv->size_changed_sig) {
+		g_signal_handler_disconnect (self, priv->size_changed_sig);
+		priv->size_changed_sig = 0;
+	}
+
+	priv->is_oversized = FALSE;
+	priv->is_overburn = FALSE;
 }
 
 static void
@@ -114,13 +212,14 @@
 
 gboolean
 brasero_data_session_add_last (BraseroDataSession *self,
+			       BraseroMedium *medium,
 			       GError **error)
 {
 	BraseroDataSessionPrivate *priv;
 	BraseroDeviceHandle *handle;
 	BraseroVolFile *volume;
 	BraseroScsiErrCode err;
-	BraseroMedium *medium;
+	BraseroDrive *drive;
 	const gchar *device;
 	BraseroVolSrc *vol;
 	gint64 block;
@@ -128,7 +227,7 @@
 
 	priv = BRASERO_DATA_SESSION_PRIVATE (self);
 
-	if (!priv->multi_inserted) {
+	if (!g_slist_find (priv->media, medium)) {
 		g_set_error (error,
 			     BRASERO_BURN_ERROR,
 			     BRASERO_BURN_ERROR_GENERAL,
@@ -136,8 +235,19 @@
 		return FALSE;
 	}
 
+	if (priv->loaded == medium)
+		return TRUE;
+
+	/* Remove the old imported session if any */
+	if (priv->nodes)
+		brasero_data_session_remove_last (self);
+
+	if (priv->loaded) {
+		g_object_unref (priv->loaded);
+		priv->loaded = NULL;
+	}
+	
 	/* get the address for the last track and retrieve the file list */
-	medium = brasero_drive_get_medium (priv->drive);
 	brasero_medium_get_last_data_track_address (medium,
 						    NULL,
 						    &block);
@@ -149,7 +259,8 @@
 		return FALSE;
 	}
 
-	device = brasero_drive_get_device (priv->drive);
+	drive = brasero_medium_get_drive (medium);
+ 	device = brasero_drive_get_device (drive);
 	handle = brasero_device_handle_open (device, &err);
 	if (!handle) {
 		g_set_error (error,
@@ -202,81 +313,178 @@
 		priv->nodes = g_slist_prepend (priv->nodes, node);
 	}
 
-	/* put this here in case we have to replace one file at the root
-	 * brasero_data_disc_is_session_path_deleted would think it needs
-	 * to restore a session file */
-	//priv->session = volume;
+	priv->loaded = medium;
+	g_object_ref (medium);
 
 	brasero_volume_file_free (volume);
 
 	g_signal_emit (self,
 		       brasero_data_session_signals [LOADED_SIGNAL],
 		       0,
+		       priv->loaded,
 		       TRUE);
 
+	/* check the size of the selection to see if it fits the current 
+	 * selected disc and listen for signal "size-changed" */
+	priv->is_oversized = FALSE;
+	priv->is_overburn = FALSE;
+	brasero_data_session_check_size (self);
+
+	priv->size_changed_sig = g_signal_connect (self,
+						   "size-changed",
+						   G_CALLBACK (brasero_data_session_size_changed),
+						   NULL);
 	return TRUE;
 }
 
-void
-brasero_data_session_set_drive (BraseroDataSession *self,
-				BraseroDrive *drive)
+gboolean
+brasero_data_session_has_available_media (BraseroDataSession *self)
 {
 	BraseroDataSessionPrivate *priv;
-	BraseroMedia media_status;
-	BraseroMedium *medium;
-	BraseroBurnCaps *caps;
-	BraseroMedia media;
 
 	priv = BRASERO_DATA_SESSION_PRIVATE (self);
 
-	if (priv->drive == drive)
-		return;
+	return priv->media != NULL;
+}
 
-	/* Remove the old imported session if any */
-	if (priv->nodes)
-		brasero_data_session_remove_last (self);
+GSList *
+brasero_data_session_get_available_media (BraseroDataSession *self)
+{
+	GSList *retval;
+	BraseroDataSessionPrivate *priv;
 
-	if (priv->drive)
-		g_object_unref (priv->drive);
-	
-	priv->drive = drive;
+	priv = BRASERO_DATA_SESSION_PRIVATE (self);
+
+	retval = g_slist_copy (priv->media);
+	g_slist_foreach (retval, (GFunc) g_object_ref, NULL);
 
-	if (drive)
-		g_object_ref (drive);
+	return retval;
+}
+
+BraseroMedium *
+brasero_data_session_get_loaded_medium (BraseroDataSession *self)
+{
+	BraseroDataSessionPrivate *priv;
+
+	priv = BRASERO_DATA_SESSION_PRIVATE (self);
+	if (!priv->media || !priv->nodes)
+		return NULL;
+
+	return priv->loaded;
+}
+
+static gboolean
+brasero_data_session_is_valid_multi (BraseroMedium *medium)
+{
+	BraseroMedia media;
+	BraseroBurnCaps *caps;
+	BraseroMedia media_status;
 
-	/* Now test for a multisession medium inserted and signal */
-	medium = brasero_drive_get_medium (priv->drive);
 	media = brasero_medium_get_status (medium);
 
 	caps = brasero_burn_caps_get_default ();
 	media_status = brasero_burn_caps_media_capabilities (caps, media);
 	g_object_unref (caps);
 
-	priv->multi_inserted = (media_status & BRASERO_MEDIUM_WRITABLE) &&
-			       (media & BRASERO_MEDIUM_HAS_DATA) &&
-			       (brasero_medium_get_last_data_track_address (medium, NULL, NULL) != -1);
+	return (media_status & BRASERO_MEDIUM_WRITABLE) &&
+	       (media & BRASERO_MEDIUM_HAS_DATA) &&
+	       (brasero_medium_get_last_data_track_address (medium, NULL, NULL) != -1);
+}
+
+static void
+brasero_data_session_disc_added_cb (BraseroMediumMonitor *monitor,
+				    BraseroMedium *medium,
+				    BraseroDataSession *self)
+{
+	BraseroDataSessionPrivate *priv;
+
+	priv = BRASERO_DATA_SESSION_PRIVATE (self);
+
+	if (!brasero_data_session_is_valid_multi (medium))
+		return;
+
+	g_object_ref (medium);
+	priv->media = g_slist_prepend (priv->media, medium);
 
 	g_signal_emit (self,
 		       brasero_data_session_signals [AVAILABLE_SIGNAL],
 		       0,
-		       priv->multi_inserted);
+		       medium,
+		       TRUE);
 }
 
-BraseroDrive *
-brasero_data_session_get_loaded_medium (BraseroDataSession *self)
+static void
+brasero_data_session_disc_removed_cb (BraseroMediumMonitor *monitor,
+				      BraseroMedium *medium,
+				      BraseroDataSession *self)
 {
+	GSList *iter;
+	GSList *next;
 	BraseroDataSessionPrivate *priv;
 
 	priv = BRASERO_DATA_SESSION_PRIVATE (self);
-	if (!priv->multi_inserted || !priv->nodes)
-		return NULL;
 
-	return priv->drive;
+	/* see if that's the current loaded one */
+	if (priv->loaded && priv->loaded == medium)
+		brasero_data_session_remove_last (self);
+
+	/* remove it from our list */
+	for (iter = priv->media; iter; iter = next) {
+		BraseroMedium *iter_medium;
+
+		iter_medium = iter->data;
+		next = iter->next;
+
+		if (medium == iter_medium) {
+			g_signal_emit (self,
+				       brasero_data_session_signals [AVAILABLE_SIGNAL],
+				       0,
+				       medium,
+				       FALSE);
+
+			priv->media = g_slist_remove (priv->media, iter_medium);
+			g_object_unref (iter_medium);
+		}
+	}
 }
 
 static void
 brasero_data_session_init (BraseroDataSession *object)
-{}
+{
+	GSList *iter, *list;
+	BraseroMediumMonitor *monitor;
+	BraseroDataSessionPrivate *priv;
+
+	priv = BRASERO_DATA_SESSION_PRIVATE (object);
+
+	monitor = brasero_medium_monitor_get_default ();
+	g_signal_connect (monitor,
+			  "medium-added",
+			  G_CALLBACK (brasero_data_session_disc_added_cb),
+			  object);
+	g_signal_connect (monitor,
+			  "medium-removed",
+			  G_CALLBACK (brasero_data_session_disc_removed_cb),
+			  object);
+
+	list = brasero_medium_monitor_get_media (monitor,
+						 BRASERO_MEDIA_TYPE_WRITABLE|
+						 BRASERO_MEDIA_TYPE_REWRITABLE);
+	g_object_unref (monitor);
+
+	/* check for a multisession medium already in */
+	for (iter = list; iter; iter = iter->next) {
+		BraseroMedium *medium;
+
+		medium = iter->data;
+		if (brasero_data_session_is_valid_multi (medium)) {
+			g_object_ref (medium);
+			priv->media = g_slist_prepend (priv->media, medium);
+		}
+	}
+	g_slist_foreach (list, (GFunc) g_object_unref, NULL);
+	g_slist_free (list);
+}
 
 static void
 brasero_data_session_finalize (GObject *object)
@@ -284,9 +492,15 @@
 	BraseroDataSessionPrivate *priv;
 
 	priv = BRASERO_DATA_SESSION_PRIVATE (object);
-	if (priv->drive) {
-		g_object_unref (priv->drive);
-		priv->drive = NULL;
+	if (priv->loaded) {
+		g_object_unref (priv->loaded);
+		priv->loaded = NULL;
+	}
+
+	if (priv->media) {
+		g_slist_foreach (priv->media, (GFunc) g_object_unref, NULL);
+		g_slist_free (priv->media);
+		priv->media = NULL;
 	}
 
 	if (priv->nodes) {
@@ -294,12 +508,16 @@
 		priv->nodes = NULL;
 	}
 
+	/* NOTE no need to clean up size_changed_sig since it's connected to 
+	 * ourselves. It disappears with use. */
+
 	/* don't care about the nodes since they will be automatically
 	 * destroyed */
 
 	G_OBJECT_CLASS (brasero_data_session_parent_class)->finalize (object);
 }
 
+
 static void
 brasero_data_session_class_init (BraseroDataSessionClass *klass)
 {
@@ -315,9 +533,10 @@
 			  G_SIGNAL_RUN_LAST,
 			  0,
 			  NULL, NULL,
-			  g_cclosure_marshal_VOID__BOOLEAN,
+			  brasero_marshal_VOID__OBJECT_BOOLEAN,
 			  G_TYPE_NONE,
-			  1,
+			  2,
+			  G_TYPE_OBJECT,
 			  G_TYPE_BOOLEAN);
 	brasero_data_session_signals [LOADED_SIGNAL] = 
 	    g_signal_new ("session_loaded",
@@ -325,8 +544,20 @@
 			  G_SIGNAL_RUN_LAST,
 			  0,
 			  NULL, NULL,
-			  g_cclosure_marshal_VOID__BOOLEAN,
+			  brasero_marshal_VOID__OBJECT_BOOLEAN,
+			  G_TYPE_NONE,
+			  2,
+			  G_TYPE_OBJECT,
+			  G_TYPE_BOOLEAN);
+	brasero_data_session_signals [OVERSIZE_SIGNAL] = 
+	    g_signal_new ("oversize",
+			  G_TYPE_FROM_CLASS (klass),
+			  G_SIGNAL_RUN_LAST,
+			  0,
+			  NULL, NULL,
+			  brasero_marshal_VOID__BOOLEAN_BOOLEAN,
 			  G_TYPE_NONE,
-			  1,
+			  2,
+			  G_TYPE_BOOLEAN,
 			  G_TYPE_BOOLEAN);
 }

Modified: trunk/src/brasero-data-session.h
==============================================================================
--- trunk/src/brasero-data-session.h	(original)
+++ trunk/src/brasero-data-session.h	Wed Sep 24 19:52:26 2008
@@ -25,7 +25,7 @@
 
 #include <glib-object.h>
 
-#include "burn-drive.h"
+#include "burn-medium.h"
 #include "brasero-data-project.h"
 
 G_BEGIN_DECLS
@@ -54,16 +54,20 @@
 
 gboolean
 brasero_data_session_add_last (BraseroDataSession *session,
+			       BraseroMedium *medium,
 			       GError **error);
-BraseroDrive *
-brasero_data_session_get_loaded_medium (BraseroDataSession *session);
-
-void
-brasero_data_session_set_drive (BraseroDataSession *session,
-				BraseroDrive *drive);
 void
 brasero_data_session_remove_last (BraseroDataSession *session);
 
+BraseroMedium *
+brasero_data_session_get_loaded_medium (BraseroDataSession *session);
+
+GSList *
+brasero_data_session_get_available_media (BraseroDataSession *session);
+
+gboolean
+brasero_data_session_has_available_media (BraseroDataSession *session);
+
 G_END_DECLS
 
 #endif /* _BRASERO_DATA_SESSION_H_ */

Modified: trunk/src/brasero-disc-message.c
==============================================================================
--- trunk/src/brasero-disc-message.c	(original)
+++ trunk/src/brasero-disc-message.c	Wed Sep 24 19:52:26 2008
@@ -276,7 +276,7 @@
 	gtk_widget_destroy (GTK_WIDGET (self));
 }
 
-void
+GtkWidget *
 brasero_disc_message_add_button (BraseroDiscMessage *self,
 				 GtkSizeGroup *group,
 				 const gchar *text,
@@ -293,7 +293,7 @@
 
 	/* only add buttons to group if the text is not wrapped. Otherwise
 	 * buttons would be too big. */
-	layout = gtk_label_get_layout (priv->primary);
+	layout = gtk_label_get_layout (GTK_LABEL (priv->primary));
 	if (!pango_layout_is_wrapped (layout))
 		gtk_size_group_add_widget (priv->group, button);
 
@@ -312,6 +312,7 @@
 			    TRUE,
 			    0);
 	gtk_widget_queue_draw (GTK_WIDGET (self));
+	return button;
 }
 
 void
@@ -328,7 +329,7 @@
 
 	/* only add buttons to group if the text is not wrapped. Otherwise
 	 * buttons would be too big. */
-	layout = gtk_label_get_layout (priv->primary);
+	layout = gtk_label_get_layout (GTK_LABEL (priv->primary));
 	if (pango_layout_is_wrapped (layout))
 		gtk_size_group_add_widget (priv->group, button);
 

Modified: trunk/src/brasero-disc-message.h
==============================================================================
--- trunk/src/brasero-disc-message.h	(original)
+++ trunk/src/brasero-disc-message.h	Wed Sep 24 19:52:26 2008
@@ -77,7 +77,7 @@
 void
 brasero_disc_message_set_progress (BraseroDiscMessage *self,
 				   gdouble progress);
-void
+GtkWidget *
 brasero_disc_message_add_button (BraseroDiscMessage *message,
 				 GtkSizeGroup *group,
 				 const gchar *text,

Modified: trunk/src/brasero-disc-option-dialog.c
==============================================================================
--- trunk/src/brasero-disc-option-dialog.c	(original)
+++ trunk/src/brasero-disc-option-dialog.c	Wed Sep 24 19:52:26 2008
@@ -65,8 +65,6 @@
 	GtkWidget *joliet_toggle;
 	GtkWidget *multi_toggle;
 
-	GtkWidget *label;
-
 	GtkWidget *video_options;
 	GtkWidget *dvd_audio;
 	GtkWidget *vcd_label;
@@ -149,123 +147,6 @@
 		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->multi_toggle), FALSE);
 }
 
-static gchar *
-brasero_disc_option_dialog_truncate_label (const gchar *label)
-{
-	const gchar *delim;
-	gchar *next_char;
-
-	/* find last possible character. We can't just do a tmp + 32 
-	 * since we don't know if we are at the start of a character */
-	delim = label;
-	while ((next_char = g_utf8_find_next_char (delim, NULL))) {
-		if (next_char - label > 32)
-			break;
-
-		delim = next_char;
-	}
-
-	return g_strndup (label, delim - label);
-}
-
-static gchar *
-brasero_disc_option_dialog_get_default_label (BraseroDiscOptionDialog *dialog)
-{
-	time_t t;
-	gchar buffer [128];
-	BraseroDrive *drive;
-	gchar *title_str = NULL;
-	BraseroTrackType source;
-	BraseroBurnSession *session;
-	BraseroDiscOptionDialogPrivate *priv;
-
-	priv = BRASERO_DISC_OPTION_DIALOG_PRIVATE (dialog);
-
-	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
-
-	brasero_burn_session_get_input_type (session, &source);
-	drive = brasero_burn_session_get_burner (session);
-
-	t = time (NULL);
-	strftime (buffer, sizeof (buffer), "%d %b %y", localtime (&t));
-
-	if (source.type == BRASERO_TRACK_TYPE_DATA) {
-		BraseroBurnFlag flags;
-
-		flags = brasero_burn_session_get_flags (session);
-		if (flags & BRASERO_BURN_FLAG_MERGE) {
-			BraseroMedium *medium;
-
-			medium = brasero_drive_get_medium (drive);
-			title_str = brasero_volume_get_name (BRASERO_VOLUME (medium));
-		}
-
-		if (!title_str || title_str [0] == '\0') {
-			/* NOTE to translators: the final string must not be over
-			 * 32 _bytes_ otherwise it gets truncated. */
-			title_str = g_strdup_printf (_("Data disc (%s)"), buffer);
-
-			if (strlen (title_str) > 32) {
-				g_free (title_str);
-				strftime (buffer, sizeof (buffer), "%F", localtime (&t));
-				title_str = g_strdup_printf ("Data disc %s", buffer);
-			}
-		}
-	}
-	else if (source.type == BRASERO_TRACK_TYPE_AUDIO) {
-		if (source.subtype.audio_format & (BRASERO_VIDEO_FORMAT_UNDEFINED|BRASERO_VIDEO_FORMAT_VCD|BRASERO_VIDEO_FORMAT_VIDEO_DVD))
-			/* NOTE to translators: the final string must not be over
-			 * 32 _bytes_ */
-			title_str = g_strdup_printf (_("Video disc (%s)"), buffer);
-		else
-			/* NOTE to translators: the final string must not be over
-			 * 32 _bytes_ */
-			title_str = g_strdup_printf (_("Audio disc (%s)"), buffer);
-
-		if (strlen (title_str) > 32) {
-			g_free (title_str);
-			strftime (buffer, sizeof (buffer), "%F", localtime (&t));
-			title_str = g_strdup_printf ("Audio disc %s", buffer);
-		}
-	}
-
-	if (strlen (title_str) > 32) {
-		gchar *tmp;
-
-		tmp = brasero_disc_option_dialog_truncate_label (title_str);
-		g_free (title_str);
-
-		title_str = tmp;
-	}
-
-	g_object_unref (session);
-
-	return title_str;
-}
-
-static gboolean
-brasero_disc_option_dialog_update_label (BraseroDiscOptionDialog *dialog)
-{
-	gchar *label;
-	BraseroBurnSession *session;
-	BraseroDiscOptionDialogPrivate *priv;
-
-	priv = BRASERO_DISC_OPTION_DIALOG_PRIVATE (dialog);
-
-	if (!priv->label)
-		return FALSE;
-
-	label = brasero_disc_option_dialog_get_default_label (dialog);
-	gtk_entry_set_text (GTK_ENTRY (priv->label), label);
-	g_free (label);
-
-	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
-	brasero_burn_session_set_label (session, label);
-	g_object_unref (session);
-
-	return TRUE;
-}
-
 /**
  * These functions are used when caps-changed event or drive-changed event
  * are generated. They are used to check that flags or fs are valid.
@@ -570,144 +451,6 @@
 	priv->joliet_warning = FALSE;
 }
 
-static void
-brasero_disc_option_label_insert_text (GtkEditable *editable,
-				       const gchar *text,
-				       gint length,
-				       gint *position,
-				       gpointer data)
-{
-	BraseroDiscOptionDialogPrivate *priv;
-	const gchar *label;
-	gchar *new_text;
-	gint new_length;
-	gchar *current;
-	gint max_len;
-	gchar *prev;
-	gchar *next;
-
-	priv = BRASERO_DISC_OPTION_DIALOG_PRIVATE (data);	
-
-	/* check if this new text will fit in 32 _bytes_ long buffer */
-	label = gtk_entry_get_text (GTK_ENTRY (priv->label));
-	max_len = 32 - strlen (label) - length;
-	if (max_len >= 0)
-		return;
-
-	gdk_beep ();
-
-	/* get the last character '\0' of the text to be inserted */
-	new_length = length;
-	new_text = g_strdup (text);
-	current = g_utf8_offset_to_pointer (new_text, g_utf8_strlen (new_text, -1));
-
-	/* don't just remove one character in case there was many more
-	 * that were inserted at the same time through DND, paste, ... */
-	prev = g_utf8_find_prev_char (new_text, current);
-	if (!prev) {
-		/* no more characters so no insertion */
-		g_signal_stop_emission_by_name (editable, "insert_text"); 
-		g_free (new_text);
-		return;
-	}
-
-	do {
-		next = current;
-		current = prev;
-
-		prev = g_utf8_find_prev_char (new_text, current);
-		if (!prev) {
-			/* no more characters so no insertion */
-			g_signal_stop_emission_by_name (editable, "insert_text"); 
-			g_free (new_text);
-			return;
-		}
-
-		new_length -= next - current;
-		max_len += next - current;
-	} while (max_len < 0 && new_length > 0);
-
-	*current = '\0';
-	g_signal_handlers_block_by_func (editable,
-					 (gpointer) brasero_disc_option_label_insert_text,
-					 data);
-	gtk_editable_insert_text (editable, new_text, new_length, position);
-	g_signal_handlers_unblock_by_func (editable,
-					   (gpointer) brasero_disc_option_label_insert_text,
-					   data);
-
-	g_signal_stop_emission_by_name (editable, "insert_text");
-	g_free (new_text);
-}
-
-static void
-brasero_disc_option_label_changed (GtkEditable *editable,
-				   BraseroDiscOptionDialog *dialog)
-{
-	const gchar *label;
-	BraseroBurnSession *session;
-	BraseroDiscOptionDialogPrivate *priv;
-
-	priv = BRASERO_DISC_OPTION_DIALOG_PRIVATE (dialog);
-	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
-
-	label = gtk_entry_get_text (GTK_ENTRY (priv->label));
-	brasero_burn_session_set_label (session, label);
-	priv->label_modified = 1;
-
-	g_object_unref (session);
-}
-
-static void
-brasero_disc_option_dialog_title_widget (BraseroDiscOptionDialog *dialog)
-{
-	BraseroDiscOptionDialogPrivate *priv;
-	BraseroBurnSession *session;
-	gchar *title_str = NULL;
-	BraseroTrackType type;
-	gchar *label = NULL;
-	GtkWidget *widget;
-
-	priv = BRASERO_DISC_OPTION_DIALOG_PRIVATE (dialog);
-	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
-
-	if (!priv->label)
-		priv->label = gtk_entry_new ();
-
-	priv->label_modified = 0;
-	g_signal_connect (priv->label,
-			  "insert_text",
-			  G_CALLBACK (brasero_disc_option_label_insert_text),
-			  dialog);
-	g_signal_connect (priv->label,
-			  "changed",
-			  G_CALLBACK (brasero_disc_option_label_changed),
-			  dialog);
-
-	title_str = brasero_disc_option_dialog_get_default_label (dialog);
-	gtk_entry_set_text (GTK_ENTRY (priv->label), title_str);
-	brasero_burn_session_set_label (session, title_str);
-	g_free (title_str);
-
-	brasero_burn_session_get_input_type (session, &type);
-	if (type.type == BRASERO_TRACK_TYPE_DATA)
-		label = g_strdup_printf ("<b>%s</b>", _("Label of the disc"));
-	else if (type.type == BRASERO_TRACK_TYPE_AUDIO)
-		label = g_strdup_printf ("<b>%s</b>", _("Title"));
-
-	widget = brasero_utils_pack_properties (label, priv->label, NULL);
-	g_free (label);
-
-	gtk_widget_show_all (widget);
-	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
-			    widget,
-			    FALSE,
-			    FALSE,
-			    0);
-
-	g_object_unref (session);
-}
-
 static gboolean
 brasero_disc_option_dialog_joliet_widget (BraseroDiscOptionDialog *dialog)
 {
@@ -1253,9 +996,6 @@
 	if (brasero_burn_session_get_flags (session) & BRASERO_BURN_FLAG_MERGE)
 		brasero_burn_options_lock_selection (BRASERO_BURN_OPTIONS (dialog));
 
-	/* NOTE: the caller must have ensured the disc is ready */
-	brasero_disc_option_dialog_title_widget (dialog);
-
 	brasero_burn_session_get_input_type (session, &type);
 	if (type.type == BRASERO_TRACK_TYPE_DATA) {
 		brasero_burn_options_set_type_shown (BRASERO_BURN_OPTIONS (dialog),
@@ -1312,10 +1052,6 @@
 	/* update the joliet button */
 	brasero_disc_option_dialog_update_joliet (self);
 
-	/* see if we need to update the label */
-	if (!priv->label_modified)
-		brasero_disc_option_dialog_update_label (self);
-
 	/* for video disc see what's the output : CD or DVD */
 	if (priv->dvd_audio)
 		brasero_disc_option_dialog_update_video (self);

Modified: trunk/src/brasero-disc.c
==============================================================================
--- trunk/src/brasero-disc.c	(original)
+++ trunk/src/brasero-disc.c	Wed Sep 24 19:52:26 2008
@@ -338,22 +338,6 @@
 }
 
 void
-brasero_disc_set_current_drive (BraseroDisc *disc,
-				BraseroDrive *drive)
-{
-	BraseroDiscIface *iface;
-
-	if (!disc)
-		return;
-
-	g_return_if_fail (BRASERO_IS_DISC (disc));
-
-	iface = BRASERO_DISC_GET_IFACE (disc);
-	if (iface->set_drive)
-		(* iface->set_drive) (disc, drive);
-}
-
-void
 brasero_disc_selection_changed (BraseroDisc *disc)
 {
 	g_return_if_fail (BRASERO_IS_DISC (disc));

Modified: trunk/src/brasero-disc.h
==============================================================================
--- trunk/src/brasero-disc.h	(original)
+++ trunk/src/brasero-disc.h	Wed Sep 24 19:52:26 2008
@@ -141,9 +141,6 @@
 	guint			(*add_ui)		(BraseroDisc *disc,
 							 GtkUIManager *manager,
 							 GtkWidget *message);
-
-	void			(*set_drive)		(BraseroDisc *disc,
-							 BraseroDrive *drive);
 };
 
 GType brasero_disc_get_type ();
@@ -208,10 +205,6 @@
 void
 brasero_track_free (BraseroDiscTrack *track);
 
-void
-brasero_disc_set_current_drive (BraseroDisc *disc,
-				BraseroDrive *drive);
-
 GtkWidget *
 brasero_disc_get_use_info_notebook (void);
 

Modified: trunk/src/brasero-file-filtered.c
==============================================================================
--- trunk/src/brasero-file-filtered.c	(original)
+++ trunk/src/brasero-file-filtered.c	Wed Sep 24 19:52:26 2008
@@ -97,7 +97,6 @@
 static gchar *
 brasero_file_filtered_get_label_text (guint num, gboolean expanded)
 {
-	gchar *markup;
 	gchar *label;
 
 	if (expanded) {
@@ -113,10 +112,7 @@
 			label = g_strdup_printf (ngettext ("Show the _filtered file list (%d file)", "Show the _filtered file list (%d files)", num), num);
 	}
 
-	markup = g_strdup_printf ("<span weight=\"bold\" size=\"medium\">%s</span>", label);
-	g_free (label);
-
-	return markup;
+	return label;
 }
 
 static void

Modified: trunk/src/brasero-marshal.list
==============================================================================
--- trunk/src/brasero-marshal.list	(original)
+++ trunk/src/brasero-marshal.list	Wed Sep 24 19:52:26 2008
@@ -13,3 +13,4 @@
 INT:OBJECT,INT,INT
 BOOLEAN:STRING
 VOID:OBJECT,BOOLEAN
+VOID:BOOLEAN,BOOLEAN

Modified: trunk/src/brasero-notify.c
==============================================================================
--- trunk/src/brasero-notify.c	(original)
+++ trunk/src/brasero-notify.c	Wed Sep 24 19:52:26 2008
@@ -146,7 +146,7 @@
 	return message;
 }
 
-void
+GtkWidget *
 brasero_notify_button_add (BraseroNotify *self,
 			   BraseroDiscMessage *message,
 			   const gchar *text,
@@ -156,11 +156,11 @@
 	BraseroNotifyPrivate *priv;
 
 	priv = BRASERO_NOTIFY_PRIVATE (self);
-	brasero_disc_message_add_button (BRASERO_DISC_MESSAGE (message),
-					 priv->button,
-					 text,
-					 tooltip,
-					 response);
+	return brasero_disc_message_add_button (BRASERO_DISC_MESSAGE (message),
+						priv->button,
+						text,
+						tooltip,
+						response);
 }
 
 static void

Modified: trunk/src/brasero-notify.h
==============================================================================
--- trunk/src/brasero-notify.h	(original)
+++ trunk/src/brasero-notify.h	Wed Sep 24 19:52:26 2008
@@ -65,7 +65,7 @@
 			    const gchar *secondary,
 			    gint timeout,
 			    guint context_id);
-void
+GtkWidget *
 brasero_notify_button_add (BraseroNotify *notify,
 			   BraseroDiscMessage *message,
 			   const gchar *text,

Added: trunk/src/brasero-project-name.c
==============================================================================
--- (empty file)
+++ trunk/src/brasero-project-name.c	Wed Sep 24 19:52:26 2008
@@ -0,0 +1,309 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <string.h>
+
+#include <glib.h>
+#include <glib/gi18n-lib.h>
+#include <glib-object.h>
+
+#include <gtk/gtk.h>
+
+#include "burn-medium.h"
+#include "burn-volume-obj.h"
+
+#include "brasero-project-name.h"
+#include "brasero-project-type-chooser.h"
+
+typedef struct _BraseroProjectNamePrivate BraseroProjectNamePrivate;
+struct _BraseroProjectNamePrivate
+{
+	BraseroProjectType type;
+	BraseroMedium *medium;
+
+	guint label_modified:1;
+};
+
+#define BRASERO_PROJECT_NAME_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_PROJECT_NAME, BraseroProjectNamePrivate))
+
+
+G_DEFINE_TYPE (BraseroProjectName, brasero_project_name, GTK_TYPE_ENTRY);
+
+static gchar *
+brasero_project_name_truncate_label (const gchar *label)
+{
+	const gchar *delim;
+	gchar *next_char;
+
+	/* find last possible character. We can't just do a tmp + 32 
+	 * since we don't know if we are at the start of a character */
+	delim = label;
+	while ((next_char = g_utf8_find_next_char (delim, NULL))) {
+		if (next_char - label > 32)
+			break;
+
+		delim = next_char;
+	}
+
+	return g_strndup (label, delim - label);
+}
+
+static gchar *
+brasero_project_name_get_default_label (BraseroProjectName *self)
+{
+	time_t t;
+	gchar buffer [128];
+	gchar *title_str = NULL;
+	BraseroProjectNamePrivate *priv;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (self);
+
+	if (priv->medium) {
+		title_str = brasero_volume_get_name (BRASERO_VOLUME (priv->medium));
+		goto end;
+	}
+
+	t = time (NULL);
+	strftime (buffer, sizeof (buffer), "%d %b %y", localtime (&t));
+
+	if (priv->type == BRASERO_PROJECT_TYPE_DATA) {
+		if (!title_str || title_str [0] == '\0') {
+			/* NOTE to translators: the final string must not be over
+			 * 32 _bytes_ otherwise it gets truncated. */
+			title_str = g_strdup_printf (_("Data disc (%s)"), buffer);
+
+			if (strlen (title_str) > 32) {
+				g_free (title_str);
+				strftime (buffer, sizeof (buffer), "%F", localtime (&t));
+				title_str = g_strdup_printf ("Data disc %s", buffer);
+			}
+		}
+	}
+	else {
+		if (priv->type == BRASERO_PROJECT_TYPE_VIDEO)
+			/* NOTE to translators: the final string must not be over
+			 * 32 _bytes_ */
+			title_str = g_strdup_printf (_("Video disc (%s)"), buffer);
+		else if (priv->type == BRASERO_PROJECT_TYPE_AUDIO)
+			/* NOTE to translators: the final string must not be over
+			 * 32 _bytes_ */
+			title_str = g_strdup_printf (_("Audio disc (%s)"), buffer);
+
+		if (strlen (title_str) > 32) {
+			g_free (title_str);
+			strftime (buffer, sizeof (buffer), "%F", localtime (&t));
+			title_str = g_strdup_printf ("Audio disc %s", buffer);
+		}
+	}
+
+end:
+
+	if (title_str && strlen (title_str) > 32) {
+		gchar *tmp;
+
+		tmp = brasero_project_name_truncate_label (title_str);
+		g_free (title_str);
+
+		title_str = tmp;
+	}
+
+	return title_str;
+}
+
+static void
+brasero_project_name_label_insert_text (GtkEditable *editable,
+				        const gchar *text,
+				        gint length,
+				        gint *position,
+				        gpointer NULL_data)
+{
+	BraseroProjectNamePrivate *priv;
+	const gchar *label;
+	gchar *new_text;
+	gint new_length;
+	gchar *current;
+	gint max_len;
+	gchar *prev;
+	gchar *next;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (editable);	
+
+	/* check if this new text will fit in 32 _bytes_ long buffer */
+	label = gtk_entry_get_text (GTK_ENTRY (editable));
+	max_len = 32 - strlen (label) - length;
+	if (max_len >= 0)
+		return;
+
+	gdk_beep ();
+
+	/* get the last character '\0' of the text to be inserted */
+	new_length = length;
+	new_text = g_strdup (text);
+	current = g_utf8_offset_to_pointer (new_text, g_utf8_strlen (new_text, -1));
+
+	/* don't just remove one character in case there was many more
+	 * that were inserted at the same time through DND, paste, ... */
+	prev = g_utf8_find_prev_char (new_text, current);
+	if (!prev) {
+		/* no more characters so no insertion */
+		g_signal_stop_emission_by_name (editable, "insert_text"); 
+		g_free (new_text);
+		return;
+	}
+
+	do {
+		next = current;
+		current = prev;
+
+		prev = g_utf8_find_prev_char (new_text, current);
+		if (!prev) {
+			/* no more characters so no insertion */
+			g_signal_stop_emission_by_name (editable, "insert_text"); 
+			g_free (new_text);
+			return;
+		}
+
+		new_length -= next - current;
+		max_len += next - current;
+	} while (max_len < 0 && new_length > 0);
+
+	*current = '\0';
+	g_signal_handlers_block_by_func (editable,
+					 (gpointer) brasero_project_name_label_insert_text,
+					 NULL_data);
+	gtk_editable_insert_text (editable, new_text, new_length, position);
+	g_signal_handlers_unblock_by_func (editable,
+					   (gpointer) brasero_project_name_label_insert_text,
+					   NULL_data);
+
+	g_signal_stop_emission_by_name (editable, "insert_text");
+	g_free (new_text);
+}
+
+static void
+brasero_project_name_label_changed (GtkEditable *editable,
+				    gpointer NULL_data)
+{
+	BraseroProjectNamePrivate *priv;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (editable);
+	priv->label_modified = 1;
+}
+
+void
+brasero_project_name_set_type (BraseroProjectName *self,
+			       BraseroProjectType type)
+{
+	BraseroProjectNamePrivate *priv;
+	gchar *title_str = NULL;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (self);
+
+	priv->type = type;
+
+	if (priv->medium) {
+		g_object_unref (priv->medium);
+		priv->medium = NULL;
+	}
+
+	priv->label_modified = FALSE;
+
+	title_str = brasero_project_name_get_default_label (self);
+	gtk_entry_set_text (GTK_ENTRY (self), title_str);
+	g_free (title_str);
+}
+
+void
+brasero_project_name_set_multisession_medium (BraseroProjectName *self,
+					      BraseroMedium *medium)
+{
+	BraseroProjectNamePrivate *priv;
+	gchar *title_str;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (self);
+	if (priv->medium) {
+		g_object_unref (priv->medium);
+		priv->medium = NULL;
+	}
+
+	priv->medium = medium;
+
+	if (medium)
+		g_object_ref (medium);
+
+	if (priv->label_modified)
+		return;
+
+	title_str = brasero_project_name_get_default_label (self);
+	gtk_entry_set_text (GTK_ENTRY (self), title_str);
+	g_free (title_str);
+}
+
+static void
+brasero_project_name_init (BraseroProjectName *object)
+{
+	BraseroProjectNamePrivate *priv;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (object);
+
+	priv->label_modified = 0;
+	g_signal_connect (object,
+			  "insert_text",
+			  G_CALLBACK (brasero_project_name_label_insert_text),
+			  NULL);
+	g_signal_connect (object,
+			  "changed",
+			  G_CALLBACK (brasero_project_name_label_changed),
+			  NULL);
+}
+
+static void
+brasero_project_name_finalize (GObject *object)
+{
+	BraseroProjectNamePrivate *priv;
+
+	priv = BRASERO_PROJECT_NAME_PRIVATE (object);
+	if (priv->medium) {
+		g_object_unref (priv->medium);
+		priv->medium = NULL;
+	}
+
+	G_OBJECT_CLASS (brasero_project_name_parent_class)->finalize (object);
+}
+
+static void
+brasero_project_name_class_init (BraseroProjectNameClass *klass)
+{
+	GObjectClass* object_class = G_OBJECT_CLASS (klass);
+
+	g_type_class_add_private (klass, sizeof (BraseroProjectNamePrivate));
+
+	object_class->finalize = brasero_project_name_finalize;
+}
+
+GtkWidget *
+brasero_project_name_new (void)
+{
+	return g_object_new (BRASERO_TYPE_PROJECT_NAME, NULL);
+}
+

Added: trunk/src/brasero-project-name.h
==============================================================================
--- (empty file)
+++ trunk/src/brasero-project-name.h	Wed Sep 24 19:52:26 2008
@@ -0,0 +1,65 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2008 <bonfire-app wanadoo fr>
+ * 
+ * brasero is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * brasero is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _BRASERO_PROJECT_NAME_H_
+#define _BRASERO_PROJECT_NAME_H_
+
+#include <glib-object.h>
+
+#include <gtk/gtkentry.h>
+
+#include "brasero-project-type-chooser.h"
+
+G_BEGIN_DECLS
+
+#define BRASERO_TYPE_PROJECT_NAME             (brasero_project_name_get_type ())
+#define BRASERO_PROJECT_NAME(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BRASERO_TYPE_PROJECT_NAME, BraseroProjectName))
+#define BRASERO_PROJECT_NAME_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BRASERO_TYPE_PROJECT_NAME, BraseroProjectNameClass))
+#define BRASERO_IS_PROJECT_NAME(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BRASERO_TYPE_PROJECT_NAME))
+#define BRASERO_IS_PROJECT_NAME_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BRASERO_TYPE_PROJECT_NAME))
+#define BRASERO_PROJECT_NAME_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BRASERO_TYPE_PROJECT_NAME, BraseroProjectNameClass))
+
+typedef struct _BraseroProjectNameClass BraseroProjectNameClass;
+typedef struct _BraseroProjectName BraseroProjectName;
+
+struct _BraseroProjectNameClass
+{
+	GtkEntryClass parent_class;
+};
+
+struct _BraseroProjectName
+{
+	GtkEntry parent_instance;
+};
+
+GType brasero_project_name_get_type (void) G_GNUC_CONST;
+
+GtkWidget *
+brasero_project_name_new (void);
+
+void
+brasero_project_name_set_type (BraseroProjectName *self,
+			       BraseroProjectType type);
+void
+brasero_project_name_set_multisession_medium (BraseroProjectName *self,
+					      BraseroMedium *medium);
+
+G_END_DECLS
+
+#endif /* _BRASERO_PROJECT_NAME_H_ */

Modified: trunk/src/brasero-project.c
==============================================================================
--- trunk/src/brasero-project.c	(original)
+++ trunk/src/brasero-project.c	Wed Sep 24 19:52:26 2008
@@ -66,10 +66,10 @@
 #include "brasero-player.h"
 #endif
 
+#include "brasero-app.h"
 #include "brasero-project.h"
 #include "brasero-session-cfg.h"
 #include "brasero-jacket-edit.h"
-#include "brasero-project-size.h"
 #include "brasero-project-type-chooser.h"
 #include "brasero-disc.h"
 #include "brasero-data-disc.h"
@@ -84,6 +84,7 @@
 #include "brasero-file-chooser.h"
 #include "brasero-notify.h"
 #include "brasero-burn-options.h"
+#include "brasero-project-name.h"
 
 static void brasero_project_class_init (BraseroProjectClass *klass);
 static void brasero_project_init (BraseroProject *sp);
@@ -107,9 +108,6 @@
 brasero_project_burn_cb (GtkAction *action, BraseroProject *project);
 
 static void
-brasero_project_disc_changed_cb (BraseroProjectSize *size,
-				 BraseroProject *project);
-static void
 brasero_project_size_changed_cb (BraseroDisc *disc,
 			         gint64 size,
 			         BraseroProject *project);
@@ -158,7 +156,7 @@
 } BraseroProjectSave;
 
 struct BraseroProjectPrivate {
-	GtkWidget *size_display;
+	GtkWidget *name_display;
 	GtkWidget *discs;
 	GtkWidget *audio;
 	GtkWidget *data;
@@ -168,6 +166,8 @@
 
 	GtkUIManager *manager;
 
+	guint status_ctx;
+
 	/* header */
 	GtkWidget *burn;
 
@@ -193,7 +193,6 @@
 	guint modified:1;
 	guint has_focus:1;
 	guint oversized:1;
-	guint ask_overburn:1;
 	guint selected_uris:1;
 };
 
@@ -340,7 +339,7 @@
 				gint *center,
 				gint *footer)
 {
-	*footer = BRASERO_PROJECT (object)->priv->size_display->allocation.height + 
+	*footer = BRASERO_PROJECT (object)->priv->name_display->allocation.height +
 		  BRASERO_PROJECT_SPACING * 2 + BRASERO_PROJECT_SIZE_WIDGET_BORDER * 2;
 }
 
@@ -390,7 +389,7 @@
 {
 	GtkSizeGroup *size_group;
 	GtkWidget *alignment;
-	GtkWidget *vbox;
+	GtkWidget *label;
 	GtkWidget *box;
 
 	obj->priv = g_new0 (BraseroProjectPrivate, 1);
@@ -407,21 +406,16 @@
 	/* bottom */
 	box = gtk_hbox_new (FALSE, 6);
 	gtk_widget_show (box);
-	gtk_box_pack_end (GTK_BOX (obj), box, FALSE, FALSE, BRASERO_PROJECT_SPACING);
+	gtk_box_pack_end (GTK_BOX (obj), box, FALSE, TRUE, BRASERO_PROJECT_SPACING);
 
-	/* size widget */
-	vbox = gtk_vbox_new (FALSE, 0);
-	gtk_widget_show (vbox);
-	gtk_container_set_border_width (GTK_CONTAINER (vbox), BRASERO_PROJECT_SIZE_WIDGET_BORDER);
-	gtk_box_pack_start (GTK_BOX (box), vbox, TRUE, TRUE, 0);
-
-	obj->priv->size_display = brasero_project_size_new ();
-	gtk_widget_show (obj->priv->size_display);
-	g_signal_connect (G_OBJECT (obj->priv->size_display), 
-			  "disc-changed",
-			  G_CALLBACK (brasero_project_disc_changed_cb),
-			  obj);
-	gtk_box_pack_start (GTK_BOX (vbox), obj->priv->size_display, TRUE, TRUE, 0);
+	/* Name widget */
+	label = gtk_label_new_with_mnemonic (_("_Name:"));
+	gtk_widget_show (label);
+	gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+
+	obj->priv->name_display = brasero_project_name_new ();
+	gtk_widget_show (obj->priv->name_display);
+	gtk_box_pack_start (GTK_BOX (box), obj->priv->name_display, TRUE, TRUE, 0);
 	obj->priv->empty = 1;
 	
 	/* burn button set insensitive since there are no files in the selection */
@@ -441,10 +435,10 @@
 				     _("Start to burn the contents of the selection"));
 	gtk_size_group_add_widget (GTK_SIZE_GROUP (size_group), obj->priv->burn);
 
-	alignment = gtk_alignment_new (1.0, 0.0, 0.0, 0.0);
+	alignment = gtk_alignment_new (1.0, 0.5, 0.0, 0.0);
 	gtk_widget_show (alignment);
 	gtk_container_add (GTK_CONTAINER (alignment), obj->priv->burn);
-	gtk_box_pack_end (GTK_BOX (box), alignment, FALSE, FALSE, 0);
+	gtk_box_pack_end (GTK_BOX (box), alignment, FALSE, TRUE, 0);
 
 	/* The three panes to put into the notebook */
 	obj->priv->audio = brasero_audio_disc_new ();
@@ -544,115 +538,33 @@
 
 /********************************** size ***************************************/
 static void
-brasero_project_error_size_dialog (BraseroProject *project)
+brasero_project_update_project_size (BraseroProject *project,
+				     guint64 sectors)
 {
-	GtkWidget *message;
-
-	message = brasero_notify_message_add (BRASERO_NOTIFY (project->priv->message),
-					      _("Please, remove some files from the project."),
-					      _("The size of the project is too large for the disc even with the overburn option."),
-					      -1,
-					      BRASERO_NOTIFY_CONTEXT_SIZE);
-	brasero_disc_message_set_image (BRASERO_DISC_MESSAGE (message), GTK_STOCK_DIALOG_WARNING);
-	brasero_disc_message_add_close_button (BRASERO_DISC_MESSAGE (message));
-}
-
-static gboolean
-brasero_project_overburn_dialog (BraseroProject *project)
-{
-	GtkWidget *dialog, *toplevel;
-	gint result;
+	GtkWidget *toplevel;
+	GtkWidget *status;
+	gchar *string;
+	gchar *size;
 
-	/* get the current CD length and make sure selection is not too long */
 	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
-	dialog = gtk_message_dialog_new (GTK_WINDOW (toplevel),
-					 GTK_DIALOG_DESTROY_WITH_PARENT|
-					 GTK_DIALOG_MODAL,
-					 GTK_MESSAGE_WARNING,
-					 GTK_BUTTONS_NONE,
-					 _("Would you like to activate overburn?"));
+	status = brasero_app_get_statusbar2 (BRASERO_APP (toplevel));
 
-	gtk_window_set_title (GTK_WINDOW (dialog), _("Project Size"));
+	if (!project->priv->status_ctx)
+		project->priv->status_ctx = gtk_statusbar_get_context_id (GTK_STATUSBAR (status),
+									  "size_project");
 
-	gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-						  _("The size of the project is too large for the disc and you must remove files otherwise."
-						    "\nNOTE: This option might cause failure."));
 
-	gtk_dialog_add_button (GTK_DIALOG (dialog),
-			       _("_Don't use overburn"),
-			       GTK_RESPONSE_CANCEL);
-	gtk_dialog_add_button (GTK_DIALOG (dialog),
-			       _("Use _overburn"),
-			       GTK_RESPONSE_YES);
+	gtk_statusbar_pop (GTK_STATUSBAR (status), project->priv->status_ctx);
 
-	result = gtk_dialog_run (GTK_DIALOG (dialog));
-	gtk_widget_destroy (dialog);
-
-	if (result == GTK_RESPONSE_YES)
-		return TRUE;
+	string = brasero_utils_get_sectors_string (sectors,
+						   !BRASERO_IS_DATA_DISC (project->priv->current),
+						   TRUE,
+						   FALSE);
+	size = g_strdup_printf (_("Project estimated size: %s"), string);
+	g_free (string);
 
-	return FALSE;
-}
-
-static void
-brasero_project_check_size (BraseroProject *project)
-{
-	gboolean result;
-	gboolean overburn;
-	GtkAction *action;
-	gboolean sensitive;
-
-	result = brasero_project_size_check_status (BRASERO_PROJECT_SIZE (project->priv->size_display),
-						    &overburn);
-
-	if (result) {
-		brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_SIZE);
-		project->priv->oversized = 0;
-		goto end;
-	}
-
-	if (project->priv->is_burning) {
-		/* we don't want to show the following dialog while burning */
-		if (overburn)
-			project->priv->oversized = 0;
-		else
-			project->priv->oversized = 1;
-		return;
-	}
-
-	if (overburn) {
-		brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_SIZE);
-		project->priv->oversized = 0;
-		goto end;
-	}
-
-	/* avoid telling the user the same thing twice */
-	if (project->priv->oversized)
-		goto end;
-
-	project->priv->oversized = 1;
-	brasero_project_error_size_dialog (project);
-
-
-end:
-	if (project->priv->oversized) {
-		sensitive = FALSE;
-		g_object_set (G_OBJECT (project->priv->current), "reject-file", TRUE, NULL);
-	}
-	else {
-		sensitive = TRUE;
-		g_object_set (G_OBJECT (project->priv->current), "reject-file", FALSE, NULL);
-	}
-
-	brasero_project_set_add_button_state (project);
-
-	/* we need to make sure there is actually something to burn */
-	sensitive = (project->priv->empty == FALSE &&
-		     project->priv->oversized == FALSE);
-
-	action = gtk_action_group_get_action (project->priv->project_group, "Burn");
-	gtk_action_set_sensitive (action, sensitive);
-	gtk_widget_set_sensitive (project->priv->burn, sensitive);
+	gtk_statusbar_push (GTK_STATUSBAR (status), project->priv->status_ctx, size);
+	g_free (size);
 }
 
 static void
@@ -661,43 +573,14 @@
 			         BraseroProject *project)
 {
 	project->priv->sectors = sectors;
-
-	brasero_project_size_set_sectors (BRASERO_PROJECT_SIZE (project->priv->size_display),
-					  sectors);
-
-	brasero_project_check_size (project);
+	brasero_project_update_project_size (project, sectors);
 }
 
 static void
 brasero_project_flags_changed_cb (BraseroDisc *disc,
 				  BraseroBurnFlag flags,
 				  BraseroProject *project)
-{
-	brasero_project_size_set_multisession (BRASERO_PROJECT_SIZE (project->priv->size_display),
-					      (flags & BRASERO_BURN_FLAG_MERGE) != 0);
-}
-
-static void
-brasero_project_disc_changed_cb (BraseroProjectSize *size,
-				 BraseroProject *project)
-{
-	BraseroMedium *medium;
-	BraseroDrive *drive;
-
-	brasero_project_check_size (project);
-
-	/* get the current device name and set it for the disc project in
-	 * case that is a multisession disc and a data project */
-	medium = brasero_project_size_get_active_medium (size);
-	if (!medium) {
-		brasero_disc_set_current_drive (project->priv->current, NULL);
-		return;
-	}
-
-	drive = brasero_medium_get_drive (medium);
-	brasero_disc_set_current_drive (project->priv->current, drive);
-	g_object_unref (medium);
-}
+{ }
 
 /***************************** URIContainer ************************************/
 static void
@@ -988,23 +871,9 @@
 	BraseroDiscResult result;
 	GtkWidget *toplevel;
 	GtkWidget *dialog;
-	gboolean overburn;
 	gboolean destroy;
 	gboolean success;
 
-	overburn = FALSE;
-	result = brasero_project_size_check_status (BRASERO_PROJECT_SIZE (project->priv->size_display),
-						    &overburn);
-	if (result == FALSE) {
-		if (!overburn) {
-			brasero_project_error_size_dialog (project);
-			return;
-		}
-
-		if (!brasero_project_overburn_dialog (project))
-			return;
-	}
-
 	result = brasero_project_check_status (project, project->priv->current);
 	if (result == BRASERO_DISC_CANCELLED)
 		return;
@@ -1048,8 +917,8 @@
 	session = brasero_disc_option_dialog_get_session (BRASERO_DISC_OPTION_DIALOG (dialog));
 	gtk_widget_destroy (dialog);
 
-	if (overburn)
-		brasero_burn_session_add_flag (session, BRASERO_BURN_FLAG_OVERBURN);
+	/* set the label for the session */
+	brasero_burn_session_set_label (session, gtk_entry_get_text (GTK_ENTRY (project->priv->name_display)));
 
 	/* now setup the burn dialog */
 	dialog = brasero_burn_dialog_new ();
@@ -1108,8 +977,6 @@
     	project->priv->burnt = 0;
 	project->priv->modified = 0;
 
-	brasero_project_size_set_sectors (BRASERO_PROJECT_SIZE (project->priv->size_display), 0);
-
 	if (project->priv->current)
 		brasero_disc_reset (project->priv->current);
 
@@ -1120,7 +987,7 @@
 
 	client = gconf_client_get_default ();
 
-	/* rempove the buttons from the "toolbar" */
+	/* remove the buttons from the "toolbar" */
 	if (project->priv->merge_id)
 		gtk_ui_manager_remove_ui (project->priv->manager,
 					  project->priv->merge_id);
@@ -1132,7 +999,7 @@
 							       project->priv->message);
 
 		gtk_notebook_set_current_page (GTK_NOTEBOOK (project->priv->discs), 0);
-		brasero_project_size_set_context (BRASERO_PROJECT_SIZE (project->priv->size_display), BRASERO_PROJECT_TYPE_AUDIO);
+		brasero_project_update_project_size (project, 0);
 	}
 	else if (type == BRASERO_PROJECT_TYPE_DATA) {
 		project->priv->current = BRASERO_DISC (project->priv->data);
@@ -1141,7 +1008,7 @@
 							       project->priv->message);
 
 		gtk_notebook_set_current_page (GTK_NOTEBOOK (project->priv->discs), 1);
-		brasero_project_size_set_context (BRASERO_PROJECT_SIZE (project->priv->size_display), BRASERO_PROJECT_TYPE_DATA);
+		brasero_project_update_project_size (project, 0);
 	}
 	else if (type == BRASERO_PROJECT_TYPE_VIDEO) {
 		project->priv->current = BRASERO_DISC (project->priv->video);
@@ -1150,7 +1017,7 @@
 							       project->priv->message);
 
 		gtk_notebook_set_current_page (GTK_NOTEBOOK (project->priv->discs), 2);
-		brasero_project_size_set_context (BRASERO_PROJECT_SIZE (project->priv->size_display), BRASERO_PROJECT_TYPE_VIDEO);
+		brasero_project_update_project_size (project, 0);
 	}
 
 	brasero_notify_message_remove (BRASERO_NOTIFY (project->priv->message), BRASERO_NOTIFY_CONTEXT_SIZE);
@@ -1169,6 +1036,8 @@
 	gtk_action_set_sensitive (action, TRUE);
 	action = gtk_action_group_get_action (project->priv->project_group, "Save");
 	gtk_action_set_sensitive (action, FALSE);
+
+	brasero_project_name_set_type (BRASERO_PROJECT_NAME (project->priv->name_display), type);
 }
 
 void
@@ -1276,6 +1145,8 @@
 brasero_project_set_none (BraseroProject *project)
 {
 	GtkAction *action;
+	GtkWidget *status;
+	GtkWidget *toplevel;
 
 	if (project->priv->project) {
 		g_free (project->priv->project);
@@ -1307,6 +1178,12 @@
 	if (project->priv->merge_id)
 		gtk_ui_manager_remove_ui (project->priv->manager,
 					  project->priv->merge_id);
+
+	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
+	status = brasero_app_get_statusbar2 (BRASERO_APP (toplevel));
+
+	if (project->priv->status_ctx)
+		gtk_statusbar_pop (GTK_STATUSBAR (status), project->priv->status_ctx);
 }
 
 /********************* update the appearance of menus and buttons **************/
@@ -1762,7 +1639,7 @@
 		title = g_strdup_printf (_("Brasero - %s (Video Disc)"), name);
 	else
 		title = NULL;
-
+ 
 	g_free (name);
 
 	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
@@ -2156,8 +2033,7 @@
 	if (!brasero_project_open_project_xml (project, uri, &track, TRUE))
 		return BRASERO_PROJECT_TYPE_INVALID;
 
-	brasero_project_size_set_sectors (BRASERO_PROJECT_SIZE (project->priv->size_display),
-					  0);
+	brasero_project_update_project_size (project, 0);
 
 	if (track->type == BRASERO_DISC_TRACK_AUDIO)
 		type = BRASERO_PROJECT_TYPE_AUDIO;
@@ -2253,7 +2129,8 @@
 	if (!brasero_project_open_audio_playlist_project (project, uri, &track, TRUE))
 		return BRASERO_PROJECT_TYPE_INVALID;
 
-	brasero_project_size_set_sectors (BRASERO_PROJECT_SIZE (project->priv->size_display), 0);
+
+	brasero_project_update_project_size (project, 0);
 	brasero_project_switch (project, TRUE);
 	type = BRASERO_PROJECT_TYPE_AUDIO;
 

Modified: trunk/src/brasero-session-cfg.c
==============================================================================
--- trunk/src/brasero-session-cfg.c	(original)
+++ trunk/src/brasero-session-cfg.c	Wed Sep 24 19:52:26 2008
@@ -573,11 +573,26 @@
 
 	priv->configuring = FALSE;
 	result = brasero_burn_caps_is_session_supported (priv->caps, BRASERO_BURN_SESSION (self));
-	g_signal_emit (self,
-		       session_cfg_signals [IS_VALID_SIGNAL],
-		       0,
-		       (result == BRASERO_BURN_OK)? 
-		       BRASERO_SESSION_VALID:BRASERO_SESSION_NOT_SUPPORTED);
+
+	if (result != BRASERO_BURN_OK) {
+		g_signal_emit (self,
+			       session_cfg_signals [IS_VALID_SIGNAL],
+			       0,
+			       BRASERO_SESSION_NOT_SUPPORTED);
+		return;
+	}
+
+	if (brasero_burn_session_same_src_dest_drive (BRASERO_BURN_SESSION (self)))
+		g_signal_emit (self,
+			       session_cfg_signals [IS_VALID_SIGNAL],
+			       0,
+			       BRASERO_SESSION_VALID);
+
+	else
+		g_signal_emit (self,
+			       session_cfg_signals [IS_VALID_SIGNAL],
+			       0,
+			       brasero_session_cfg_check_size (self));
 }
 
 static void



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