brasero r1691 - in trunk: . src



Author: philippr
Date: Mon Jan  5 17:42:34 2009
New Revision: 1691
URL: http://svn.gnome.org/viewvc/brasero?rev=1691&view=rev

Log:
2009-01-05  Philippe Rouquier  <ykw localhost localdomain>

	Fixed problem with retry button not retrying in the blank/check windows
	Split BraseroApp from the main window.
	It allows not to create the whole main window when brasero is simply 
	started for blanking or copying or such small operations.
	Protect burning operations when the session manager announces he wants 
	to close itself by asking the user if he really wants to cancel it

	* src/brasero-app.c (brasero_app_load_window_state),
	(brasero_app_save_contents), (brasero_app_dialog),
	(brasero_app_alert), (on_destroy_cb), (on_delete_cb), (on_exit_cb),
	(brasero_app_is_running), (brasero_app_set_parent),
	(brasero_app_burn), (brasero_app_burn_image),
	(brasero_app_copy_disc), (brasero_app_blank), (on_eject_cb),
	(brasero_app_check), (brasero_app_current_toplevel_destroyed),
	(brasero_app_set_toplevel), (on_prefs_cb), (on_about_cb),
	(on_help_cb), (on_window_state_changed_cb),
	(on_configure_event_cb), (brasero_app_create_mainwin),
	(brasero_app_run_mainwin), (brasero_app_init), (brasero_app_new):
	* src/brasero-app.h:
	* src/brasero-audio-disc.c (brasero_audio_disc_short_track_dialog),
	(brasero_audio_disc_file_type_error_dialog),
	(brasero_audio_disc_video_file_dialog),
	(brasero_audio_disc_add_dir),
	(brasero_audio_disc_unreadable_dialog),
	(brasero_audio_disc_load_track), (brasero_audio_disc_split),
	(brasero_audio_disc_inotify_removal_warning):
	* src/brasero-burn-dialog.c (brasero_burn_dialog_cancel):
	* src/brasero-burn-dialog.h:
	* src/brasero-burn-options.c (brasero_burn_options_init):
	* src/brasero-data-disc.c
	(brasero_data_disc_import_failure_dialog),
	(brasero_data_disc_switch_to_image),
	(brasero_data_disc_image_uri_cb),
	(brasero_data_disc_unreadable_uri_cb),
	(brasero_data_disc_recursive_uri_cb),
	(brasero_data_disc_unknown_uri_cb),
	(brasero_data_disc_name_collision_cb),
	(brasero_data_disc_2G_file_cb),
	(brasero_data_disc_deep_directory_cb):
	* src/brasero-eject-dialog.c (brasero_eject_dialog_cancel):
	* src/brasero-playlist.c (brasero_playlist_dialog_error):
	* src/brasero-project-manager.c
	(brasero_project_manager_set_statusbar),
	(brasero_project_manager_selected_uris_changed),
	(brasero_project_manager_sidepane_changed),
	(brasero_project_manager_switch), (brasero_project_manager_copy),
	(brasero_project_manager_open_uri):
	* src/brasero-project.c (brasero_project_update_project_size),
	(brasero_project_check_status), (brasero_project_no_song_dialog),
	(brasero_project_no_file_dialog), (brasero_project_burn),
	(brasero_project_confirm_switch), (brasero_project_set_none),
	(brasero_project_empty_cb), (brasero_project_set_uri),
	(brasero_project_invalid_project_dialog),
	(brasero_project_not_saved_dialog),
	(brasero_project_save_project_dialog),
	(brasero_project_save_session):
	* src/brasero-search-beagle.c (brasero_search_beagle_error_dialog):
	* src/brasero-session.c (brasero_session_quit_requested_cb):
	* src/brasero-tool-dialog.c (brasero_tool_dialog_run),
	(brasero_tool_dialog_set_button), (brasero_tool_dialog_cancel),
	(brasero_tool_dialog_delete), (brasero_tool_dialog_response),
	(brasero_tool_dialog_init):
	* src/brasero-tool-dialog.h:
	* src/brasero-utils.c (brasero_utils_launch_app):
	* src/brasero-video-disc.c (brasero_video_disc_directory_dialog),
	(brasero_video_disc_unreadable_uri_dialog),
	(brasero_video_disc_not_video_dialog):
	* src/main.c (brasero_app_parse_options):

Modified:
   trunk/ChangeLog
   trunk/src/brasero-app.c
   trunk/src/brasero-app.h
   trunk/src/brasero-audio-disc.c
   trunk/src/brasero-burn-dialog.c
   trunk/src/brasero-burn-dialog.h
   trunk/src/brasero-burn-options.c
   trunk/src/brasero-data-disc.c
   trunk/src/brasero-eject-dialog.c
   trunk/src/brasero-playlist.c
   trunk/src/brasero-project-manager.c
   trunk/src/brasero-project.c
   trunk/src/brasero-search-beagle.c
   trunk/src/brasero-session.c
   trunk/src/brasero-tool-dialog.c
   trunk/src/brasero-tool-dialog.h
   trunk/src/brasero-utils.c
   trunk/src/brasero-video-disc.c
   trunk/src/main.c

Modified: trunk/src/brasero-app.c
==============================================================================
--- trunk/src/brasero-app.c	(original)
+++ trunk/src/brasero-app.c	Mon Jan  5 17:42:34 2009
@@ -41,6 +41,9 @@
 #include "brasero-session.h"
 #include "brasero-project-manager.h"
 #include "brasero-pref.h"
+#include "brasero-image-option-dialog.h"
+#include "brasero-disc-copy-dialog.h"
+#include "brasero-burn-dialog.h"
 #include "burn-debug.h"
 #include "burn-drive.h"
 #include "burn-caps.h"
@@ -52,6 +55,12 @@
 {
 	GdkWindow *parent;
 
+	GtkWidget *mainwin;
+
+	GtkWidget *burn_dialog;
+	GtkWidget *tool_dialog;
+
+	/* This is the toplevel window currently displayed */
 	GtkWidget *toplevel;
 
 	GtkWidget *projects;
@@ -67,13 +76,12 @@
 
 	gchar *saved_contents;
 	guint is_maximised:1;
-	guint is_running:1;
 };
 
 #define BRASERO_APP_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_APP, BraseroAppPrivate))
 
 
-G_DEFINE_TYPE (BraseroApp, brasero_app, GTK_TYPE_WINDOW);
+G_DEFINE_TYPE (BraseroApp, brasero_app, G_TYPE_OBJECT);
 
 
 #define SESSION_VERSION "0.1"
@@ -191,10 +199,14 @@
 	GdkRectangle rect;
 	gint monitor;
 
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
+
 	/* Make sure that on first run the window has a default size of at least
 	 * 85% of the screen (hardware not GTK+) */
-	screen = gtk_window_get_screen (GTK_WINDOW (app));
-	monitor = gdk_screen_get_monitor_at_window (screen, GTK_WIDGET (app)->window);
+	screen = gtk_window_get_screen (GTK_WINDOW (priv->mainwin));
+	monitor = gdk_screen_get_monitor_at_window (screen, GTK_WIDGET (priv->mainwin)->window);
 	gdk_screen_get_monitor_geometry (screen, monitor, &rect);
 	width = rect.width / 100 * 85;
 	height = rect.height / 100 * 85;
@@ -285,12 +297,12 @@
 	xmlFreeDoc (session);
 
 	if (width && height)
-		gtk_window_resize (GTK_WINDOW (app),
+		gtk_window_resize (GTK_WINDOW (priv->mainwin),
 				   width,
 				   height);
 
 	if (state)
-		gtk_window_maximize (GTK_WINDOW (app));
+		gtk_window_maximize (GTK_WINDOW (priv->mainwin));
 
 	return TRUE;
 }
@@ -375,6 +387,11 @@
 	g_free (session_path);
 }
 
+/**
+ * returns FALSE when nothing prevents the shutdown
+ * returns TRUE when shutdown should be delayed
+ */
+
 gboolean
 brasero_app_save_contents (BraseroApp *app,
 			   gboolean cancellable)
@@ -385,9 +402,24 @@
 
 	priv = BRASERO_APP_PRIVATE (app);
 
-	/* If we are not running the main window there is no point in using
-	 * the following. */
-	if (!priv->is_running)
+	if (priv->burn_dialog) {
+		if (cancellable)
+			return (brasero_burn_dialog_cancel (BRASERO_BURN_DIALOG (priv->burn_dialog)) == FALSE);
+
+		gtk_widget_destroy (priv->burn_dialog);
+		return FALSE;
+	}
+
+	if (priv->tool_dialog) {
+		if (cancellable)
+			return (brasero_tool_dialog_cancel (BRASERO_TOOL_DIALOG (priv->tool_dialog)) == FALSE);
+
+		gtk_widget_destroy (priv->tool_dialog);
+		return FALSE;
+	}
+
+	/* If we are not having a main window there is no point in going further */
+	if (!priv->mainwin)
 		return FALSE;
 
 	if (priv->saved_contents) {
@@ -443,8 +475,8 @@
 
 	priv = BRASERO_APP_PRIVATE (app);
 
-	if (priv->is_running)
-		toplevel = GTK_WINDOW (app);
+	if (priv->mainwin)
+		toplevel = GTK_WINDOW (priv->mainwin);
 	else if (!priv->toplevel) {
 		is_on_top = TRUE;
 		toplevel = NULL;
@@ -493,8 +525,8 @@
 	priv = BRASERO_APP_PRIVATE (app);
 
 	/* Whatever happens, they need a parent or must be in the taskbar */
-	if (priv->is_running) {
-		parent = GTK_WIDGET (app);
+	if (priv->mainwin) {
+		parent = GTK_WIDGET (priv->mainwin);
 		is_on_top = FALSE;
 	}
 	else if (priv->toplevel) {
@@ -569,7 +601,7 @@
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
-	if (priv->is_running)
+	if (priv->mainwin)
 		gtk_main_quit ();
 
 	return FALSE;
@@ -581,7 +613,7 @@
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
-	if (!priv->is_running)
+	if (!priv->mainwin)
 		return FALSE;
 
 	if (brasero_app_save_contents (app, TRUE))
@@ -597,14 +629,14 @@
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
-	if (!priv->is_running)
-		return;
 
 	if (brasero_app_save_contents (app, TRUE))
 		return;
 
-	brasero_app_save_window_state (app);
-	gtk_widget_destroy (GTK_WIDGET (app));
+	if (priv->mainwin) {
+		brasero_app_save_window_state (app);
+		gtk_widget_destroy (GTK_WIDGET (priv->mainwin));
+	}
 }
 
 gboolean
@@ -613,36 +645,122 @@
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
-	return priv->is_running;
+	return (priv->mainwin != NULL);
 }
 
 void
-brasero_app_run (BraseroApp *app)
+brasero_app_set_parent (BraseroApp *app,
+			guint parent_xid)
 {
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
 
-	priv->is_running = TRUE;
-	gtk_widget_realize (GTK_WIDGET (app));
+	priv->parent = gdk_window_foreign_new (parent_xid);
+}
 
-	if (priv->parent) {
-		gtk_window_set_modal (GTK_WINDOW (app), TRUE);
-		gdk_window_set_transient_for (GTK_WIDGET (app)->window, priv->parent);
+gboolean
+brasero_app_burn (BraseroApp *app,
+		  BraseroBurnSession *session)
+{
+	gboolean success;
+	GtkWidget *dialog;
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
+
+	/* now setup the burn dialog */
+	dialog = brasero_burn_dialog_new ();
+	priv->burn_dialog = dialog;
+
+	brasero_app_set_toplevel (app, GTK_WINDOW (dialog));
+	success = brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog), session);
+
+	priv->burn_dialog = NULL;
+
+	/* The destruction of the dialog will bring the main window forward */
+	gtk_widget_destroy (dialog);
+	return success;
+}
+
+void
+brasero_app_burn_image (BraseroApp *app,
+			const gchar *uri)
+{
+	BraseroBurnSession *session;
+	GtkResponseType result;
+	GtkWidget *dialog;
+
+	/* setup, show, and run options dialog */
+	dialog = brasero_image_option_dialog_new ();
+	brasero_image_option_dialog_set_image_uri (BRASERO_IMAGE_OPTION_DIALOG (dialog), uri);
+
+	brasero_app_set_toplevel (app, GTK_WINDOW (dialog));
+
+	result = gtk_dialog_run (GTK_DIALOG (dialog));
+	if (result != GTK_RESPONSE_OK) {
+		gtk_widget_destroy (dialog);
+		return;
 	}
 
-	brasero_app_load_window_state (app);
+	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
+	/* The destruction of the dialog will bring the main window forward */
+	gtk_widget_destroy (dialog);
+
+	brasero_app_burn (app, session);
+	g_object_unref (session);
 }
 
 void
-brasero_app_set_parent (BraseroApp *app,
-			guint parent_xid)
+brasero_app_copy_disc (BraseroApp *app,
+		       const gchar *device,
+		       const gchar *cover)
 {
-	BraseroAppPrivate *priv;
+	BraseroBurnSession *session;
+	GtkResponseType result;
+	GtkWidget *dialog;
 
-	priv = BRASERO_APP_PRIVATE (app);
+	dialog = brasero_disc_copy_dialog_new ();
+	brasero_app_set_toplevel (app, GTK_WINDOW (dialog));
 
-	priv->parent = gdk_window_foreign_new (parent_xid);
+	/* if a device is specified then get the corresponding medium */
+	if (device) {
+		BraseroDrive *drive;
+		BraseroMediumMonitor *monitor;
+
+		monitor = brasero_medium_monitor_get_default ();
+		drive = brasero_medium_monitor_get_drive (monitor, device);
+		g_object_unref (monitor);
+
+		brasero_disc_copy_dialog_set_drive (BRASERO_DISC_COPY_DIALOG (dialog), drive);
+		g_object_unref (drive);
+	}
+
+	result = gtk_dialog_run (GTK_DIALOG (dialog));
+	if (result != GTK_RESPONSE_OK) {
+		gtk_widget_destroy (dialog);
+		return;
+	}
+
+	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
+
+	/* The destruction of the dialog will bring the main window forward */
+	gtk_widget_destroy (dialog);
+
+	/* Set a cover if any. */
+	if (cover) {
+		GValue *value;
+
+		value = g_new0 (GValue, 1);
+		g_value_init (value, G_TYPE_STRING);
+		g_value_set_string (value, cover);
+		brasero_burn_session_tag_add (session,
+					      BRASERO_COVER_URI,
+					      value);
+	}
+
+	brasero_app_burn (app, session);
+	g_object_unref (session);
 }
 
 void
@@ -650,12 +768,10 @@
 		   const gchar *device)
 {
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
 	dialog = brasero_blank_dialog_new ();
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (app));
 
 	if (device) {
 		BraseroDrive *drive;
@@ -672,26 +788,29 @@
 		g_object_unref (drive);
 	}
 
-	if (!priv->is_running) {
+	priv->tool_dialog = dialog;
+	if (!priv->mainwin) {
 		gtk_widget_realize (dialog);
 
 		if (priv->parent) {
 			gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
 			gdk_window_set_transient_for (GTK_WIDGET (dialog)->window, priv->parent);
 		}
-
-		gtk_dialog_run (GTK_DIALOG (dialog));
-
-		/* brasero-tool-dialog auto destroys itself */
-		// gtk_widget_destroy (dialog);
 	}
 	else {
+		GtkWidget *toplevel;
+
+		/* FIXME! This is a bad idea and needs fixing */
+		toplevel = gtk_widget_get_toplevel (GTK_WIDGET (priv->mainwin));
+
 		gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
 		gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
 		gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
-		
-		gtk_widget_show (dialog);
 	}
+
+	gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
+	priv->tool_dialog = NULL;
 }
 
 static void
@@ -705,15 +824,24 @@
 {
 	GtkWidget *dialog;
 	GtkWidget *toplevel;
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
 
-	dialog = brasero_eject_dialog_new();
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (app));
+	dialog = brasero_eject_dialog_new ();
+
+	/* FIXME! This is a bad idea and needs fixing */
+	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (priv->mainwin));
 
 	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
 	gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
 	gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
 
-	gtk_widget_show (dialog);
+	priv->tool_dialog = dialog;
+	gtk_dialog_run (GTK_DIALOG (dialog));
+	priv->tool_dialog = NULL;
+
+	gtk_widget_destroy (dialog);
 }
 
 void
@@ -721,13 +849,12 @@
 		   const gchar *device)
 {
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
 
 	dialog = brasero_sum_dialog_new ();
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (app));
+	priv->tool_dialog = dialog;
 
 	if (device) {
 		BraseroDrive *drive;
@@ -744,27 +871,28 @@
 		g_object_unref (drive);
 	}
 
-	if (!priv->is_running) {
+	if (!priv->mainwin) {
 		gtk_widget_realize (dialog);
 
 		if (priv->parent) {
 			gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
 			gdk_window_set_transient_for (GTK_WIDGET (dialog)->window, priv->parent);
 		}
-
-		gtk_widget_show (dialog);
-		gtk_dialog_run (GTK_DIALOG (dialog));
-
-		/* brasero-tool-dialog auto destroys itself */
-		// gtk_widget_destroy (dialog);
 	}
 	else {
+		GtkWidget *toplevel;
+
+		/* FIXME! This is a bad idea and needs fixing */
+		toplevel = gtk_widget_get_toplevel (GTK_WIDGET (priv->mainwin));
+
 		gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
 		gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
 		gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
-		
-		gtk_widget_show (dialog);
 	}
+
+	gtk_dialog_run (GTK_DIALOG (dialog));
+	gtk_widget_destroy (dialog);
+	priv->tool_dialog = NULL;
 }
 
 static void
@@ -780,8 +908,8 @@
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
-	if (priv->is_running)
-		gtk_widget_show (GTK_WIDGET (app));
+	if (priv->mainwin)
+		gtk_widget_show (GTK_WIDGET (priv->mainwin));
 }
 
 void
@@ -791,7 +919,7 @@
 
 	priv = BRASERO_APP_PRIVATE (app);
 
-	if (!priv->is_running) {
+	if (!priv->mainwin) {
 		if (priv->parent) {
 			gtk_widget_realize (GTK_WIDGET (window));
 			gtk_window_set_modal (GTK_WINDOW (window), TRUE);
@@ -805,11 +933,11 @@
 		}
 	}
 	else {
-		gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (app));
+		gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (priv->mainwin));
 		gtk_window_set_modal (GTK_WINDOW (window), TRUE);
 
 		/* hide main dialog if it is shown */
-		gtk_widget_hide (GTK_WIDGET (app));
+		gtk_widget_hide (GTK_WIDGET (priv->mainwin));
 
 		gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), FALSE);
 		gtk_window_set_skip_pager_hint (GTK_WINDOW (window), FALSE);
@@ -829,9 +957,14 @@
 {
 	GtkWidget *dialog;
 	GtkWidget *toplevel;
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
 
 	dialog = brasero_pref_new ();
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (app));
+
+	/* FIXME! This is a bad idea and needs fixing */
+	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (priv->mainwin));
 
 	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
 	gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
@@ -876,6 +1009,9 @@
         };
 
 	gchar  *license, *comments;
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
 
 	comments = g_strdup (_("A simple to use CD/DVD burning application for GNOME"));
 
@@ -885,7 +1021,8 @@
                              _(license_part[2]),
 			     NULL);
 
-	gtk_show_about_dialog (GTK_WINDOW (GTK_WIDGET (app)),
+	/* This can only be shown from the main window so no need for toplevel */
+	gtk_show_about_dialog (GTK_WINDOW (GTK_WIDGET (priv->mainwin)),
 			       "program-name", "Brasero",
 			       "comments", comments,
 			       "version", VERSION,
@@ -916,12 +1053,15 @@
 on_help_cb (GtkAction *action, BraseroApp *app)
 {
 	GError *error = NULL;
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
 
  	gtk_show_uri (NULL, "ghelp:brasero", gtk_get_current_event_time (), &error);
    	if (error) {
 		GtkWidget *d;
         
-		d = gtk_message_dialog_new (GTK_WINDOW (app),
+		d = gtk_message_dialog_new (GTK_WINDOW (priv->mainwin),
 					    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
 					    GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
 					    "%s", error->message);
@@ -935,11 +1075,11 @@
 static gboolean
 on_window_state_changed_cb (GtkWidget *widget,
 			    GdkEventWindowState *event,
-			    gpointer *NULL_data)
+			    BraseroApp *app)
 {
 	BraseroAppPrivate *priv;
 
-	priv = BRASERO_APP_PRIVATE (widget);
+	priv = BRASERO_APP_PRIVATE (app);
 
 	if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED)
 		priv->is_maximised = 1;
@@ -952,11 +1092,11 @@
 static gboolean
 on_configure_event_cb (GtkWidget *widget,
 		       GdkEventConfigure *event,
-		       gpointer NULL_data)
+		       BraseroApp *app)
 {
 	BraseroAppPrivate *priv;
 
-	priv = BRASERO_APP_PRIVATE (widget);
+	priv = BRASERO_APP_PRIVATE (app);
 
 	if (!priv->is_maximised) {
 		priv->width = event->width;
@@ -1152,8 +1292,8 @@
 		gtk_widget_set_sensitive (widget, TRUE);
 }
 
-static void
-brasero_app_init (BraseroApp *object)
+void
+brasero_app_create_mainwin (BraseroApp *app)
 {
 	GtkWidget *hbox;
 	GtkWidget *menubar;
@@ -1163,49 +1303,48 @@
 	GtkActionGroup *action_group;
 	BraseroPluginManager *plugin_manager;
 
-	/* Connect to session */
-	brasero_session_connect (object);
+	priv = BRASERO_APP_PRIVATE (app);
 
 	/* New window */
-	priv = BRASERO_APP_PRIVATE (object);
-
-	g_set_application_name (_("Brasero Disc Burner"));
-	gtk_window_set_default_icon_name ("brasero");
+	priv->mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_icon_name (GTK_WINDOW (priv->mainwin), "brasero");
 
-	gtk_window_set_icon_name (GTK_WINDOW (object), "brasero");
-
-	g_signal_connect (G_OBJECT (object), "delete-event",
-			  G_CALLBACK (on_delete_cb), object);
-	g_signal_connect (G_OBJECT (object), "destroy",
-			  G_CALLBACK (on_destroy_cb), object);
+	g_signal_connect (G_OBJECT (priv->mainwin),
+			  "delete-event",
+			  G_CALLBACK (on_delete_cb),
+			  app);
+	g_signal_connect (G_OBJECT (priv->mainwin),
+			  "destroy",
+			  G_CALLBACK (on_destroy_cb),
+			  app);
 
 	/* contents */
 	priv->contents = gtk_vbox_new (FALSE, 0);
 	gtk_widget_show (priv->contents);
 
-	gtk_container_add (GTK_CONTAINER (object), priv->contents);
+	gtk_container_add (GTK_CONTAINER (priv->mainwin), priv->contents);
 
 	/* menu and toolbar */
 	priv->manager = gtk_ui_manager_new ();
 	g_signal_connect (priv->manager,
 			  "connect-proxy",
 			  G_CALLBACK (brasero_connect_ui_manager_proxy_cb),
-			  object);
+			  app);
 	g_signal_connect (priv->manager,
 			  "disconnect-proxy",
 			  G_CALLBACK (brasero_disconnect_ui_manager_proxy_cb),
-			  object);
+			  app);
 
 	action_group = gtk_action_group_new ("MenuActions");
 	gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
 	gtk_action_group_add_actions (action_group,
 				      entries,
 				      G_N_ELEMENTS (entries),
-				      object);
+				      app);
 
 	gtk_ui_manager_insert_action_group (priv->manager, action_group, 0);
 
-	brasero_app_add_recent (object, action_group);
+	brasero_app_add_recent (app, action_group);
 
 	if (!gtk_ui_manager_add_ui_from_string (priv->manager, description, -1, &error)) {
 		g_message ("building menus failed: %s", error->message);
@@ -1254,23 +1393,58 @@
 	g_signal_connect (plugin_manager,
 			  "caps-changed",
 			  G_CALLBACK (brasero_caps_changed_cb),
-			  object);
+			  app);
 
 	/* add accelerators */
 	accel_group = gtk_ui_manager_get_accel_group (priv->manager);
-	gtk_window_add_accel_group (GTK_WINDOW (object), accel_group);
+	gtk_window_add_accel_group (GTK_WINDOW (priv->mainwin), accel_group);
 
 	/* set up the window geometry */
-	gtk_window_set_position (GTK_WINDOW (object), GTK_WIN_POS_CENTER);
+	gtk_window_set_position (GTK_WINDOW (priv->mainwin),
+				 GTK_WIN_POS_CENTER);
 
-	g_signal_connect (object,
+	g_signal_connect (priv->mainwin,
 			  "window-state-event",
 			  G_CALLBACK (on_window_state_changed_cb),
-			  NULL);
-	g_signal_connect (object,
+			  app);
+	g_signal_connect (priv->mainwin,
 			  "configure-event",
 			  G_CALLBACK (on_configure_event_cb),
-			  NULL);
+			  app);
+
+	gtk_widget_realize (GTK_WIDGET (priv->mainwin));
+
+	if (priv->parent) {
+		gtk_window_set_modal (GTK_WINDOW (priv->mainwin), TRUE);
+		gdk_window_set_transient_for (GTK_WIDGET (priv->mainwin)->window, priv->parent);
+	}
+
+	brasero_app_load_window_state (app);
+}
+
+void
+brasero_app_run_mainwin (BraseroApp *app)
+{
+	BraseroAppPrivate *priv;
+
+	priv = BRASERO_APP_PRIVATE (app);
+
+	gtk_widget_show (GTK_WIDGET (priv->mainwin));
+	gtk_main ();
+}
+
+static void
+brasero_app_init (BraseroApp *object)
+{
+	BraseroAppPrivate *priv;
+
+	/* Connect to session */
+	brasero_session_connect (object);
+
+	priv = BRASERO_APP_PRIVATE (object);
+
+	g_set_application_name (_("Brasero Disc Burner"));
+	gtk_window_set_default_icon_name ("brasero");
 }
 
 static void
@@ -1303,7 +1477,5 @@
 BraseroApp *
 brasero_app_new (void)
 {
-	return g_object_new (BRASERO_TYPE_APP,
-			     "type", GTK_WINDOW_TOPLEVEL,
-			     NULL);
+	return g_object_new (BRASERO_TYPE_APP, NULL);
 }

Modified: trunk/src/brasero-app.h
==============================================================================
--- trunk/src/brasero-app.h	(original)
+++ trunk/src/brasero-app.h	Mon Jan  5 17:42:34 2009
@@ -21,9 +21,11 @@
 #define _BRASERO_APP_H_
 
 #include <glib-object.h>
-
 #include <gtk/gtk.h>
 
+#include "burn-session.h"
+
+
 G_BEGIN_DECLS
 
 #define BRASERO_TYPE_APP             (brasero_app_get_type ())
@@ -62,7 +64,10 @@
 brasero_app_set_toplevel (BraseroApp *app, GtkWindow *window);
 
 void
-brasero_app_run (BraseroApp *app);
+brasero_app_create_mainwin (BraseroApp *app);
+
+void
+brasero_app_run_mainwin (BraseroApp *app);
 
 gboolean
 brasero_app_is_running (BraseroApp *app);
@@ -79,6 +84,19 @@
 		   const gchar *secondary_message,
 		   GtkMessageType type);
 
+gboolean
+brasero_app_burn (BraseroApp *app,
+		  BraseroBurnSession *session);
+
+void
+brasero_app_burn_image (BraseroApp *app,
+			const gchar *uri);
+
+void
+brasero_app_copy_disc (BraseroApp *app,
+		       const gchar *device,
+		       const gchar *cover);
+
 void
 brasero_app_blank (BraseroApp *app,
 		   const gchar *device);

Modified: trunk/src/brasero-audio-disc.c
==============================================================================
--- trunk/src/brasero-audio-disc.c	(original)
+++ trunk/src/brasero-audio-disc.c	Mon Jan  5 17:42:34 2009
@@ -1148,7 +1148,7 @@
 static void
 brasero_audio_disc_short_track_dialog (BraseroAudioDisc *disc)
 {
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (disc))),
+	brasero_app_alert (brasero_app_get_default (),
 			   _("The track will be padded at its end."),
 			   _("The track is shorter than 6 seconds"),
 			   GTK_MESSAGE_WARNING);
@@ -1349,19 +1349,12 @@
 brasero_audio_disc_file_type_error_dialog (BraseroAudioDisc *disc,
 					   const gchar *uri)
 {
-	GtkWidget *toplevel;
 	gchar *primary;
 	gchar *name;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (disc));
-	if (toplevel == NULL) {
-		g_warning ("Content widget error : can't handle \"%s\".\n", uri);
-		return ;
-	}
-
     	BRASERO_GET_BASENAME_FOR_DISPLAY (uri, name);
 	primary = g_strdup_printf (_("\"%s\" could not be handled by gstreamer."), name);
-	brasero_app_alert (BRASERO_APP (toplevel),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   _("Make sure the appropriate codec is installed"),
 			   GTK_MESSAGE_ERROR);
@@ -1373,20 +1366,14 @@
 brasero_audio_disc_video_file_dialog (BraseroAudioDisc *disc,
 				      const gchar *uri)
 {
-	GtkWidget *dialog, *toplevel;
+	GtkWidget *dialog;
 	GtkResponseType answer;
 	gchar *string;
 	gchar *name;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (disc));
-	if (toplevel == NULL) {
-		g_warning ("Video file \"%s\".\n", uri);
-		return FALSE;
-	}
-
     	BRASERO_GET_BASENAME_FOR_DISPLAY (uri, name);
 	string = g_strdup_printf (_("Do you want to add \"%s\" which is a video file?"), name);
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     string,
 				     GTK_BUTTONS_NONE,
 				     GTK_MESSAGE_QUESTION);
@@ -1518,10 +1505,8 @@
 {
 	gint answer;
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (disc));
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     _("Do you want to search for audio files inside the directory?"),
 				     GTK_BUTTONS_NONE,
 				     GTK_MESSAGE_WARNING);
@@ -1582,21 +1567,11 @@
 				      const gchar *uri,
 				      GError *error)
 {
-	GtkWidget *toplevel;
 	gchar *primary;
 	gchar *name;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (disc));
-	if (toplevel == NULL) {
-		g_warning ("Can't open file %s : %s\n",
-			   uri,
-			   error->message);
-
-		return;
-	}
-
 	primary = g_strdup_printf (_("\"%s\" could not be opened."), name);
-	brasero_app_alert (BRASERO_APP (toplevel),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   error->message,
 			   GTK_MESSAGE_ERROR);
@@ -2212,14 +2187,12 @@
 			       BraseroDiscTrack *track)
 {
 	GSList *iter;
-	GtkWidget *toplevel;
 
 	g_return_val_if_fail (track->type == BRASERO_DISC_TRACK_AUDIO, FALSE);
 
 	if (track->contents.tracks == NULL)
 		return BRASERO_DISC_ERROR_EMPTY_SELECTION;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (disc));
 	for (iter = track->contents.tracks; iter; iter = iter->next) {
 		BraseroDiscSong *song;
 		BraseroSongInfo *info;
@@ -2227,7 +2200,7 @@
 		song = iter->data;
 		info = song->info;
 
-		if (song->end > 0 && !brasero_app_is_running (BRASERO_APP (toplevel))) {
+		if (song->end > 0 && !brasero_app_is_running (brasero_app_get_default ())) {
 			/* Set the minimum information */
 			brasero_audio_disc_add_track (BRASERO_AUDIO_DISC (disc), song);
 		}
@@ -2922,11 +2895,9 @@
 	model = gtk_tree_view_get_model (GTK_TREE_VIEW (disc->priv->tree));
 	selected = gtk_tree_selection_get_selected_rows (selection, &model);
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (disc));
-
 	/* don't check g_slist_length == 0 since then the button is greyed */
 	if (g_list_length (selected) > 1) {
-		brasero_app_alert (BRASERO_APP (toplevel),
+		brasero_app_alert (brasero_app_get_default (),
 				   _("Select one song only please."),
 				   _("Impossible to split more than one song at a time"),
 				   GTK_MESSAGE_ERROR);
@@ -2953,6 +2924,7 @@
 			    -1);
 
 	dialog = brasero_split_dialog_new ();
+	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (disc));
 	gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
 	gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
 	gtk_window_set_position (GTK_WINDOW (toplevel), GTK_WIN_POS_CENTER_ON_PARENT);
@@ -3864,7 +3836,7 @@
 	BRASERO_GET_BASENAME_FOR_DISPLAY (uri, name);
 
 	primary = g_strdup_printf (_("\"%s\" was removed from the file system."), name);
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (disc))),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   _("It will be removed from the project"),
 			   GTK_MESSAGE_WARNING);

Modified: trunk/src/brasero-burn-dialog.c
==============================================================================
--- trunk/src/brasero-burn-dialog.c	(original)
+++ trunk/src/brasero-burn-dialog.c	Mon Jan  5 17:42:34 2009
@@ -2102,20 +2102,17 @@
 	return (result != GTK_RESPONSE_OK);
 }
 
-static gboolean
+gboolean
 brasero_burn_dialog_cancel (BraseroBurnDialog *dialog)
 {
-	if (dialog->priv->burn) {
-		BraseroBurnResult result;
+	if (!dialog->priv->burn)
+		return TRUE;
 
-		result = brasero_burn_cancel (dialog->priv->burn, TRUE);
+	if (brasero_burn_cancel (dialog->priv->burn, TRUE) == BRASERO_BURN_DANGEROUS) {
+		if (!brasero_burn_dialog_cancel_dialog (GTK_WIDGET (dialog)))
+			return FALSE;
 
-		if (result == BRASERO_BURN_DANGEROUS) {
-			if (brasero_burn_dialog_cancel_dialog (GTK_WIDGET (dialog)))
-				brasero_burn_cancel (dialog->priv->burn, FALSE);
-			else
-				return FALSE;
-		}
+		brasero_burn_cancel (dialog->priv->burn, FALSE);
 	}
 
 	return TRUE;

Modified: trunk/src/brasero-burn-dialog.h
==============================================================================
--- trunk/src/brasero-burn-dialog.h	(original)
+++ trunk/src/brasero-burn-dialog.h	Mon Jan  5 17:42:34 2009
@@ -59,5 +59,7 @@
 gboolean
 brasero_burn_dialog_run (BraseroBurnDialog *dialog,
 			 BraseroBurnSession *session);
+gboolean
+brasero_burn_dialog_cancel (BraseroBurnDialog *dialog);
 
 #endif				/* BURN_DIALOG_H */

Modified: trunk/src/brasero-burn-options.c
==============================================================================
--- trunk/src/brasero-burn-options.c	(original)
+++ trunk/src/brasero-burn-options.c	Mon Jan  5 17:42:34 2009
@@ -375,7 +375,6 @@
 	BraseroBurnOptionsPrivate *priv;
 	GtkWidget *selection;
 	GtkWidget *alignment;
-	GtkWidget *button;
 	gchar *string;
 
 	priv = BRASERO_BURN_OPTIONS_PRIVATE (object);
@@ -391,11 +390,8 @@
 				       BRASERO_BURN_FLAG_CHECK_SIZE);
 
 	/* Create a cancel button */
-	button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
-	gtk_widget_show (button);
-	gtk_dialog_add_action_widget (GTK_DIALOG (object),
-				      button, 
-				      GTK_RESPONSE_CANCEL);
+	gtk_dialog_add_button (GTK_DIALOG (object),
+			       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
 
 	/* Create a default Burn button */
 	priv->button = brasero_utils_make_button (_("_Burn"),

Modified: trunk/src/brasero-data-disc.c
==============================================================================
--- trunk/src/brasero-data-disc.c	(original)
+++ trunk/src/brasero-data-disc.c	Mon Jan  5 17:42:34 2009
@@ -203,7 +203,7 @@
 brasero_data_disc_import_failure_dialog (BraseroDataDisc *disc,
 					 GError *error)
 {
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (disc))),
+	brasero_app_alert (brasero_app_get_default (),
 			   _("The session could not be imported."),
 			   error?error->message:_("An unknown error occured"),
 			   GTK_MESSAGE_WARNING);
@@ -742,21 +742,16 @@
 brasero_data_disc_switch_to_image (gpointer data)
 {
 	GtkWidget *manager;
-	GtkWidget *toplevel;
 	BraseroDataDiscPrivate *priv;
 	BraseroDataDiscProjectSwitch *callback_data = data;
 
 	priv = BRASERO_DATA_DISC_PRIVATE (callback_data->disc);
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (callback_data->disc));
-	if (!BRASERO_IS_APP (toplevel))
-		return BRASERO_BURN_OK;
-
 	/* Clean up everything to avoid warning dialog */
 	brasero_data_project_reset (priv->project);
 
 	/* Tell project manager to switch */
-	manager = brasero_app_get_project_manager (BRASERO_APP (toplevel));
+	manager = brasero_app_get_project_manager (brasero_app_get_default ());
 	brasero_project_manager_iso (BRASERO_PROJECT_MANAGER (manager),
 				     callback_data->uri);
 
@@ -773,7 +768,6 @@
 	gchar *string;
 	GtkWidget *button;
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 	BraseroDataDiscPrivate *priv;
 	BraseroDataDiscProjectSwitch *callback_data;
 
@@ -782,13 +776,9 @@
 	if (priv->loading)
 		return BRASERO_BURN_OK;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-	if (!BRASERO_IS_APP (toplevel))
-		return BRASERO_BURN_OK;
-
 	name = brasero_file_node_get_uri_name (uri);
 	string = g_strdup_printf (_("Do you want to burn \"%s\" to a disc or add it in to the data project?"), name);
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     string,
 				     GTK_BUTTONS_NONE,
 				     GTK_MESSAGE_QUESTION);
@@ -884,7 +874,7 @@
 	}
 
 	primary = g_strdup_printf (_("\"%s\" cannot be added to the selection."), name);
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (self))),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   error->message,
 			   GTK_MESSAGE_ERROR);
@@ -915,7 +905,7 @@
 	}
 
 	primary = g_strdup_printf (_("\"%s\" cannot be added to the selection."), name);
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (self))),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   _("It is a recursive symlink"),
 			   GTK_MESSAGE_ERROR);
@@ -946,7 +936,7 @@
 	}
 
 	primary = g_strdup_printf (_("\"%s\" cannot be added to the selection."), name);
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (self))),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   _("It does not exist at the specified location"),
 			   GTK_MESSAGE_ERROR);
@@ -962,7 +952,6 @@
 	gint answer;
 	gchar *string;
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 	BraseroDataDiscPrivate *priv;
 
 	priv = BRASERO_DATA_DISC_PRIVATE (self);
@@ -972,9 +961,8 @@
 		return FALSE;
 	}
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
 	string = g_strdup_printf (_("Do you really want to replace \"%s\"?"), name);
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     string,
 				     GTK_BUTTONS_NONE,
 				     GTK_MESSAGE_WARNING);
@@ -1003,7 +991,6 @@
 	gint answer;
 	gchar *string;
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 	BraseroDataDiscPrivate *priv;
 
 	priv = BRASERO_DATA_DISC_PRIVATE (self);
@@ -1017,9 +1004,8 @@
 		return FALSE;
 	}
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
 	string = g_strdup_printf (_("Do you really want to add \"%s\" to the selection and use the third version of ISO9660 standard to support it?"), name);
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     string,
 				     GTK_BUTTONS_NONE,
 				     GTK_MESSAGE_WARNING);
@@ -1049,7 +1035,6 @@
 	gint answer;
 	gchar *string;
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 	BraseroDataDiscPrivate *priv;
 
 	priv = BRASERO_DATA_DISC_PRIVATE (self);
@@ -1063,10 +1048,8 @@
 		return FALSE;
 	}
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-
 	string = g_strdup_printf (_("Do you really want to add \"%s\" to the selection?"), name);
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     string,
 				     GTK_BUTTONS_NONE,
 				     GTK_MESSAGE_WARNING);

Modified: trunk/src/brasero-eject-dialog.c
==============================================================================
--- trunk/src/brasero-eject-dialog.c	(original)
+++ trunk/src/brasero-eject-dialog.c	Mon Jan  5 17:42:34 2009
@@ -100,7 +100,7 @@
 	return TRUE;
 }
 
-static void
+static gboolean
 brasero_eject_dialog_cancel (BraseroToolDialog *dialog)
 {
 	BraseroMedium *medium;
@@ -111,6 +111,8 @@
 		brasero_volume_cancel_current_operation (BRASERO_VOLUME (medium));
 		g_object_unref (medium);
 	}
+
+	return TRUE;
 }
 
 static void

Modified: trunk/src/brasero-playlist.c
==============================================================================
--- trunk/src/brasero-playlist.c	(original)
+++ trunk/src/brasero-playlist.c	Mon Jan  5 17:42:34 2009
@@ -801,18 +801,11 @@
 {
 	gchar *name;
 	gchar *primary;
-	GtkWidget *toplevel;
-
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (playlist));
-	if (!GTK_WIDGET_TOPLEVEL (toplevel)) {
-		g_warning ("Error parsing playlist %s\n", uri);
-		return;
-	}
 
 	BRASERO_GET_BASENAME_FOR_DISPLAY (uri, name);
 
 	primary = g_strdup_printf (_("Error parsing playlist \"%s\"."), name);
-	brasero_app_alert (BRASERO_APP (toplevel),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   _("An unknown error occured"),
 			   GTK_MESSAGE_ERROR);

Modified: trunk/src/brasero-project-manager.c
==============================================================================
--- trunk/src/brasero-project-manager.c	(original)
+++ trunk/src/brasero-project-manager.c	Mon Jan  5 17:42:34 2009
@@ -43,10 +43,7 @@
 #include "brasero-project-manager.h"
 #include "brasero-file-chooser.h"
 #include "brasero-uri-container.h"
-#include "brasero-image-option-dialog.h"
-#include "brasero-burn-dialog.h"
 #include "brasero-project-type-chooser.h"
-#include "brasero-disc-copy-dialog.h"
 #include "brasero-io.h"
 #include "burn-caps.h"
 #include "burn-medium-monitor.h"
@@ -234,12 +231,10 @@
 				       gint files_num)
 {
 	gchar *status_string = NULL;
-	GtkWidget *toplevel;
 	GtkWidget *status;
 	gint valid_num;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
-	status = brasero_app_get_statusbar1 (BRASERO_APP (toplevel));
+	status = brasero_app_get_statusbar1 (brasero_app_get_default ());
 
 	if (!manager->priv->status_ctx)
 		manager->priv->status_ctx = gtk_statusbar_get_context_id (GTK_STATUSBAR (status),
@@ -444,11 +439,9 @@
 
 	manager->priv->selected = uris;
 	if (!manager->priv->selected) {
-		GtkWidget *toplevel;
  		GtkWidget *status;
  
- 		toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
- 		status = brasero_app_get_statusbar1 (BRASERO_APP (toplevel));
+ 		status = brasero_app_get_statusbar1 (brasero_app_get_default ());
  
  		if (!manager->priv->status_ctx)
  			manager->priv->status_ctx = gtk_statusbar_get_context_id (GTK_STATUSBAR (status),
@@ -472,7 +465,6 @@
 					  BraseroProjectManager *manager)
 {
 	if (!visible) {
-		GtkWidget *toplevel;
  		GtkWidget *status;
  
 		/* If sidepane is disabled, remove any text about selection */
@@ -480,8 +472,7 @@
 			brasero_io_cancel_by_base (manager->priv->io,
 						   manager->priv->size_preview);
 
- 		toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
- 		status = brasero_app_get_statusbar1 (BRASERO_APP (toplevel));
+ 		status = brasero_app_get_statusbar1 (brasero_app_get_default ());
 
  		gtk_statusbar_pop (GTK_STATUSBAR (status), manager->priv->status_ctx);
 
@@ -514,143 +505,6 @@
 }
 
 static void
-brasero_project_manager_burn (BraseroProjectManager *manager,
-			      BraseroBurnSession *session)
-{
-	GtkWidget *dialog;
-
-	/* now setup the burn dialog */
-	dialog = brasero_burn_dialog_new ();
-	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
-	gtk_widget_show (dialog);
-
-	brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog), session);
-
-	brasero_project_manager_switch (manager,
-					BRASERO_PROJECT_TYPE_INVALID,
-					NULL,
-					NULL,
-					TRUE);
-
-	/* The destruction of the dialog will bring the main window forward */
-	gtk_widget_destroy (dialog);
-}
-
-static void
-brasero_project_manager_burn_iso_dialog (BraseroProjectManager *manager,
-					 const gchar *uri)
-{
-	BraseroBurnSession *session;
-	GtkResponseType result;
-	GtkWidget *dialog;
-
-	/* setup, show, and run options dialog */
-	dialog = brasero_image_option_dialog_new ();
-	brasero_image_option_dialog_set_image_uri (BRASERO_IMAGE_OPTION_DIALOG (dialog), uri);
-
-	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
-
-	result = gtk_dialog_run (GTK_DIALOG (dialog));
-	if (result != GTK_RESPONSE_OK) {
-		gtk_widget_destroy (dialog);
-
-		/* Here we may have to close brasero altogether */
-		if (manager->priv->oneshot) {
-			GtkWidget *toplevel;
-
-			toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
-			gtk_widget_destroy (toplevel);
-		}
-
-		return;
-	}
-
-	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
-	/* The destruction of the dialog will bring the main window forward */
-	gtk_widget_destroy (dialog);
-
-	brasero_project_manager_burn (manager, session);
-	g_object_unref (session);
-
-	/* Here we may have to close brasero altogether */
-	if (manager->priv->oneshot) {
-		GtkWidget *toplevel;
-
-		toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
-		gtk_widget_destroy (toplevel);
-	}
-}
-
-static void
-brasero_project_manager_copy_disc (BraseroProjectManager *manager,
-				   const gchar *device,
-				   const gchar *cover)
-{
-	BraseroBurnSession *session;
-	GtkResponseType result;
-	GtkWidget *dialog;
-
-	dialog = brasero_disc_copy_dialog_new ();
-	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
-
-	/* if a device is specified then get the corresponding medium */
-	if (device) {
-		BraseroDrive *drive;
-		BraseroMediumMonitor *monitor;
-
-		monitor = brasero_medium_monitor_get_default ();
-		drive = brasero_medium_monitor_get_drive (monitor, device);
-		g_object_unref (monitor);
-
-		brasero_disc_copy_dialog_set_drive (BRASERO_DISC_COPY_DIALOG (dialog), drive);
-		g_object_unref (drive);
-	}
-
-	result = gtk_dialog_run (GTK_DIALOG (dialog));
-	if (result != GTK_RESPONSE_OK) {
-		gtk_widget_destroy (dialog);
-
-		/* Here we may have to close brasero altogether */
-		if (manager->priv->oneshot) {
-			GtkWidget *toplevel;
-
-			toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
-			gtk_widget_destroy (toplevel);
-		}
-
-		return;
-	}
-
-	session = brasero_burn_options_get_session (BRASERO_BURN_OPTIONS (dialog));
-
-	/* The destruction of the dialog will bring the main window forward */
-	gtk_widget_destroy (dialog);
-
-	/* Set a cover if any. */
-	if (cover) {
-		GValue *value;
-
-		value = g_new0 (GValue, 1);
-		g_value_init (value, G_TYPE_STRING);
-		g_value_set_string (value, cover);
-		brasero_burn_session_tag_add (session,
-					      BRASERO_COVER_URI,
-					      value);
-	}
-
-	brasero_project_manager_burn (manager, session);
-	g_object_unref (session);
-
-	/* Here we may have to close brasero altogether */
-	if (manager->priv->oneshot) {
-		GtkWidget *toplevel;
-
-		toplevel = gtk_widget_get_toplevel (GTK_WIDGET (manager));
-		gtk_widget_destroy (toplevel);
-	}
-}
-
-static void
 brasero_project_manager_switch (BraseroProjectManager *manager,
 				BraseroProjectType type,
 				GSList *uris,
@@ -678,7 +532,7 @@
 	if (manager->priv->status_ctx) {
 		GtkWidget *status;
 
-		status = brasero_app_get_statusbar1 (BRASERO_APP (toplevel));
+		status = brasero_app_get_statusbar1 (brasero_app_get_default ());
 		gtk_statusbar_pop (GTK_STATUSBAR (status), manager->priv->status_ctx);
 	}
 
@@ -747,7 +601,13 @@
 
 		if (toplevel)
 			gtk_window_set_title (GTK_WINDOW (toplevel), _("Brasero - New Image File"));
-		brasero_project_manager_burn_iso_dialog (manager, uri);
+
+		brasero_app_burn_image (brasero_app_get_default (), uri);
+		brasero_project_manager_switch (manager,
+						BRASERO_PROJECT_TYPE_INVALID,
+						NULL,
+						NULL,
+						TRUE);
 	}
 	else if (type == BRASERO_PROJECT_TYPE_COPY) {
 		brasero_layout_load (BRASERO_LAYOUT (manager->priv->layout), BRASERO_LAYOUT_NONE);
@@ -759,7 +619,12 @@
 		if (toplevel)
 			gtk_window_set_title (GTK_WINDOW (toplevel), _("Brasero - Disc Copy"));
 
-		brasero_project_manager_copy_disc (manager, uri, NULL);
+		brasero_app_copy_disc (brasero_app_get_default (), uri, NULL);
+		brasero_project_manager_switch (manager,
+						BRASERO_PROJECT_TYPE_INVALID,
+						NULL,
+						NULL,
+						TRUE);
 	}
 }
 
@@ -871,14 +736,11 @@
 			      const gchar *device,
 			      const gchar *cover)
 {
-	if (manager->priv->oneshot)
-		brasero_project_manager_copy_disc (manager, device, cover);
-	else
-		brasero_project_manager_switch (manager,
-						BRASERO_PROJECT_TYPE_COPY,
-						NULL,
-						device,
-						TRUE);
+	brasero_project_manager_switch (manager,
+					BRASERO_PROJECT_TYPE_COPY,
+					NULL,
+					device,
+					TRUE);
 }
 
 void
@@ -1068,7 +930,7 @@
 		gchar *string;
 
 		string = g_strdup_printf (_("The project \"%s\" does not exist"), uri);
-		brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (manager))),
+		brasero_app_alert (brasero_app_get_default (),
 				   _("Error while loading the project."),
 				   string,
 				   GTK_MESSAGE_ERROR);

Modified: trunk/src/brasero-project.c
==============================================================================
--- trunk/src/brasero-project.c	(original)
+++ trunk/src/brasero-project.c	Mon Jan  5 17:42:34 2009
@@ -67,7 +67,6 @@
 #include "brasero-audio-disc.h"
 #include "brasero-video-disc.h"
 #include "brasero-disc-option-dialog.h"
-#include "brasero-burn-dialog.h"
 #include "brasero-utils.h"
 #include "brasero-uri-container.h"
 #include "brasero-layout-object.h"
@@ -578,13 +577,11 @@
 brasero_project_update_project_size (BraseroProject *project,
 				     guint64 sectors)
 {
-	GtkWidget *toplevel;
 	GtkWidget *status;
 	gchar *string;
 	gchar *size;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
-	status = brasero_app_get_statusbar2 (BRASERO_APP (toplevel));
+	status = brasero_app_get_statusbar2 (brasero_app_get_default ());
 
 	if (!project->priv->status_ctx)
 		project->priv->status_ctx = gtk_statusbar_get_context_id (GTK_STATUSBAR (status),
@@ -765,7 +762,6 @@
 	GtkWidget *dialog;
 	gchar *current_task;
 	GtkWidget *progress;
-	GtkWidget *toplevel;
 	gint remaining = -1;
 	BraseroDiscResult result;
 	GtkWidget *current_action;
@@ -778,11 +774,10 @@
 	/* we are not ready to create tracks presumably because
 	 * data or audio has not finished to explore a directory
 	 * or get the metadata of a song or a film */
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
 
 	/* This dialog can run as a standalone window when run from nautilus
 	 * to burn burn:// URI contents. */
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     _("Please, wait until the estimation of the project size is completed."),
 				     GTK_BUTTONS_CANCEL,
 				     GTK_MESSAGE_OTHER);
@@ -876,7 +871,7 @@
 static void
 brasero_project_no_song_dialog (BraseroProject *project)
 {
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (project))),
+	brasero_app_alert (brasero_app_get_default (),
 			   _("Please add songs to the project."),
 			   _("The project is empty"),
 			   GTK_MESSAGE_WARNING);
@@ -885,7 +880,7 @@
 static void
 brasero_project_no_file_dialog (BraseroProject *project)
 {
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (project))),
+	brasero_app_alert (brasero_app_get_default (),
 			   _("Please add files to the project."),
 			   _("The project is empty"),
 			   GTK_MESSAGE_WARNING);
@@ -931,8 +926,10 @@
 	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
 
 	result = gtk_dialog_run (GTK_DIALOG (dialog));
-	if (result != GTK_RESPONSE_OK)
+	if (result != GTK_RESPONSE_OK) {
+		gtk_widget_destroy (dialog);
 		goto end;
+	}
 
 	session = brasero_disc_option_dialog_get_session (BRASERO_DISC_OPTION_DIALOG (dialog));
 	gtk_widget_destroy (dialog);
@@ -952,19 +949,13 @@
 	}
 
 	/* now setup the burn dialog */
-	dialog = brasero_burn_dialog_new ();
-	brasero_app_set_toplevel (brasero_app_get_default (), GTK_WINDOW (dialog));
-	success = brasero_burn_dialog_run (BRASERO_BURN_DIALOG (dialog), session);
-	g_object_unref (session);
+	success = brasero_app_burn (brasero_app_get_default (), session);
 
     	project->priv->burnt = success;
 
 end:
 
 	project->priv->is_burning = 0;
-
-	/* The destruction of the dialog will bring the main window forward */
-	gtk_widget_destroy (dialog);
 }
 
 /********************************     ******************************************/
@@ -1096,16 +1087,13 @@
 brasero_project_confirm_switch (BraseroProject *project)
 {
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 	GtkResponseType answer;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
-
 	if (project->priv->project) {
 		if (!project->priv->modified)
 			return TRUE;
 
-		dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+		dialog = brasero_app_dialog (brasero_app_get_default (),
 					     _("Do you really want to create a new project and discard the changes to current one?"),
 					     GTK_BUTTONS_CANCEL,
 					     GTK_MESSAGE_WARNING);
@@ -1120,8 +1108,7 @@
 		if (project->priv->empty)
 			return TRUE;
 
-		toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
-		dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+		dialog = brasero_app_dialog (brasero_app_get_default (),
 					     _("Do you really want to create a new project and discard the current one?"),
 					     GTK_BUTTONS_CANCEL,
 					     GTK_MESSAGE_WARNING);
@@ -1149,7 +1136,6 @@
 {
 	GtkAction *action;
 	GtkWidget *status;
-	GtkWidget *toplevel;
 
 	if (project->priv->project) {
 		g_free (project->priv->project);
@@ -1187,8 +1173,7 @@
 		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));
+	status = brasero_app_get_statusbar2 (brasero_app_get_default ());
 
 	if (project->priv->status_ctx)
 		gtk_statusbar_pop (GTK_STATUSBAR (status), project->priv->status_ctx);
@@ -1501,11 +1486,9 @@
 {
 	if (!project->priv->empty) {
 		GtkWidget *dialog;
-		GtkWidget *toplevel;
 		GtkResponseType answer;
 
-		toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
-		dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+		dialog = brasero_app_dialog (brasero_app_get_default (),
 					      _("Do you really want to empty the current project?"),
 					     GTK_BUTTONS_CANCEL,
 					     GTK_MESSAGE_WARNING);
@@ -1638,7 +1621,7 @@
 
 	/* add it to recent manager */
 	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
-	if (brasero_app_is_running (BRASERO_APP (toplevel)))
+	if (brasero_app_is_running (brasero_app_get_default ()))
 		brasero_project_add_to_recents (project, uri, TRUE);
 
 	/* update the name of the main window */
@@ -1667,7 +1650,7 @@
 brasero_project_invalid_project_dialog (BraseroProject *project,
 					const char *reason)
 {
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (project))),
+	brasero_app_alert (brasero_app_get_default (),
 			   _("Error while loading the project."),
 			   reason,
 			   GTK_MESSAGE_ERROR);
@@ -2328,7 +2311,7 @@
 	xmlError *error;
 
 	error = xmlGetLastError ();
-	brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (project))),
+	brasero_app_alert (brasero_app_get_default (),
 			   _("Your project has not been saved."),
 			   error? error->message:_("An unknown error occured"),
 			   GTK_MESSAGE_ERROR);
@@ -2340,11 +2323,9 @@
 				     gboolean show_cancel)
 {
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 	GtkResponseType result;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     _("Save the changes of current project before closing?"),
 				     GTK_BUTTONS_NONE,
 				     GTK_MESSAGE_WARNING);
@@ -3098,11 +3079,15 @@
 		/* ask the user if he wants to save the changes */
 		answer = brasero_project_save_project_dialog (project, show_cancel);
 		if (answer == GTK_RESPONSE_CANCEL)
-			return FALSE;
-
-		if (answer != GTK_RESPONSE_YES)
 			return TRUE;
 
+		if (answer != GTK_RESPONSE_YES) {
+			if (saved_uri)
+				*saved_uri = NULL;
+
+			return FALSE;
+		}
+
 		if (!brasero_project_save_project_real (project, NULL, BRASERO_PROJECT_SAVE_XML))
 			return TRUE;
 
@@ -3127,16 +3112,16 @@
 		/* the project wasn't saved but burnt ask if the user wants to
 		 * keep it for another time by saving it */
 		answer = brasero_project_save_project_dialog (project, show_cancel);
-		if (answer == GTK_RESPONSE_CANCEL) {
+		if (answer == GTK_RESPONSE_CANCEL)
+			return TRUE;
+
+		if (answer != GTK_RESPONSE_YES) {
 			if (saved_uri)
 				*saved_uri = NULL;
 
 			return FALSE;
 		}
 
-		if (answer != GTK_RESPONSE_YES)
-			return TRUE;
-
 		if (!brasero_project_save_project_as (project))
 			return TRUE;
 

Modified: trunk/src/brasero-search-beagle.c
==============================================================================
--- trunk/src/brasero-search-beagle.c	(original)
+++ trunk/src/brasero-search-beagle.c	Mon Jan  5 17:42:34 2009
@@ -1026,15 +1026,7 @@
 static void
 brasero_search_beagle_error_dialog (BraseroSearch *search, GError *error)
 {
-	GtkWidget *toplevel;
-
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (search));
-	if (!GTK_WIDGET_TOPLEVEL (toplevel)) {
-		g_warning ("Error querying beagle : %s\n", error->message);
-		return;
-	}
-
-	brasero_app_alert (BRASERO_APP (toplevel),
+	brasero_app_alert (brasero_app_get_default (),
 			   _("Error querying beagle."),
 			   error->message,
 			   GTK_MESSAGE_ERROR);

Modified: trunk/src/brasero-session.c
==============================================================================
--- trunk/src/brasero-session.c	(original)
+++ trunk/src/brasero-session.c	Mon Jan  5 17:42:34 2009
@@ -57,9 +57,9 @@
 				   BraseroApp *app)
 {
 	/* See if we can quit */
-	egg_sm_client_will_quit (client, brasero_app_save_contents (app, TRUE));
+	egg_sm_client_will_quit (client, (brasero_app_save_contents (app, TRUE) == FALSE));
 }
- 
+
 static void
 brasero_session_save_state_cb (EggSMClient *client,
 			       GKeyFile *key_file,

Modified: trunk/src/brasero-tool-dialog.c
==============================================================================
--- trunk/src/brasero-tool-dialog.c	(original)
+++ trunk/src/brasero-tool-dialog.c	Mon Jan  5 17:42:34 2009
@@ -56,7 +56,6 @@
 	BraseroBurn *burn;
 
 	gboolean running;
-	gboolean close;
 };
 
 static GtkDialogClass *parent_class = NULL;
@@ -172,7 +171,7 @@
 	return self->priv->burn;
 }
 
-static void
+static gboolean
 brasero_tool_dialog_run (BraseroToolDialog *self)
 {
 	BraseroToolDialogClass *klass;
@@ -214,18 +213,18 @@
 	}
 
 	self->priv->running = TRUE;
+
 	klass = BRASERO_TOOL_DIALOG_GET_CLASS (self);
 	if (klass->activate)
 		close = klass->activate (self, medium);
+
 	self->priv->running = FALSE;
 
-	if (close || self->priv->close) {
-		gtk_widget_destroy (GTK_WIDGET (self));
+	if (medium)
+		g_object_unref (medium);
 
-		if (medium)
-			g_object_unref (medium);
-		return;
-	}
+	if (close)
+		return TRUE;
 
 end:
 
@@ -237,17 +236,7 @@
 
 	brasero_burn_progress_reset (BRASERO_BURN_PROGRESS (self->priv->progress));
 
-	if (medium)
-		g_object_unref (medium);
-
-	g_signal_stop_emission_by_name (self, "response");
-}
-
-static void
-brasero_tool_dialog_button_clicked (GtkButton *button,
-				    BraseroToolDialog *self)
-{
-	brasero_tool_dialog_run (self);
+	return FALSE;
 }
 
 void
@@ -294,10 +283,6 @@
 					    theme,
 					    GTK_ICON_SIZE_BUTTON);
 	gtk_widget_show_all (button);
-	g_signal_connect (G_OBJECT (button), "clicked",
-			  G_CALLBACK (brasero_tool_dialog_button_clicked),
-			  self);
-
 	gtk_dialog_add_action_widget (GTK_DIALOG (self),
 				      button,
 				      GTK_RESPONSE_OK);
@@ -390,41 +375,37 @@
 	return FALSE;
 }
 
-static gboolean
+/**
+ * returns TRUE when cancellation went well
+ * returns FALSE when it couldn't be done
+ */
+
+gboolean
 brasero_tool_dialog_cancel (BraseroToolDialog *self)
 {
 	BraseroBurnResult result = BRASERO_BURN_OK;
 	BraseroToolDialogClass *klass;
 
 	klass = BRASERO_TOOL_DIALOG_GET_CLASS (self);
-	if (klass->cancel)
-		klass->cancel (self);
-
-	if (self->priv->burn)
-		result = brasero_burn_cancel (self->priv->burn, TRUE);
+	if (klass->cancel) {
+		gboolean res;
 
-	if (result == BRASERO_BURN_DANGEROUS) {
-		if (brasero_tool_dialog_cancel_dialog (GTK_WIDGET (self))) {
-			if (self->priv->burn)
-				brasero_burn_cancel (self->priv->burn, FALSE);
-		}
-		else
+		res = klass->cancel (self);
+		if (!res)
 			return FALSE;
 	}
 
-	self->priv->close = TRUE;
+	if (!self->priv->burn)
+		return TRUE;
 
-	if (!self->priv->running)
-		gtk_widget_destroy (GTK_WIDGET (self));
+	if (brasero_burn_cancel (self->priv->burn, TRUE) == BRASERO_BURN_DANGEROUS) {
+		if (!brasero_tool_dialog_cancel_dialog (GTK_WIDGET (self)))
+			return FALSE;
 
-	return TRUE;
-}
+		brasero_burn_cancel (self->priv->burn, FALSE);
+	}
 
-static void
-brasero_tool_dialog_cancel_clicked_cb (GtkWidget *button,
-				       BraseroToolDialog *dialog)
-{
-	brasero_tool_dialog_cancel (dialog);
+	return TRUE;
 }
 
 static gboolean
@@ -434,8 +415,22 @@
 
 	self = BRASERO_TOOL_DIALOG (widget);
 
-	brasero_tool_dialog_cancel (self);
-	return FALSE;
+	return (brasero_tool_dialog_cancel (self) != TRUE);
+}
+
+static void
+brasero_tool_dialog_response (GtkDialog *dialog,
+			      GtkResponseType response,
+			      gpointer NULL_data)
+{
+	if (response == GTK_RESPONSE_CANCEL) {
+		if (!brasero_tool_dialog_cancel (BRASERO_TOOL_DIALOG (dialog)))
+			g_signal_stop_emission_by_name (dialog, "response");
+	}
+	else if (response == GTK_RESPONSE_OK) {
+		if (!brasero_tool_dialog_run (BRASERO_TOOL_DIALOG (dialog)))
+			g_signal_stop_emission_by_name (dialog, "response");
+	}
 }
 
 static void
@@ -538,9 +533,6 @@
 	/* buttons */
 	obj->priv->cancel = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
 	gtk_widget_show (obj->priv->cancel);
-	g_signal_connect (G_OBJECT (obj->priv->cancel), "clicked",
-			  G_CALLBACK (brasero_tool_dialog_cancel_clicked_cb),
-			  obj);
 	gtk_dialog_add_action_widget (GTK_DIALOG (obj),
 				      obj->priv->cancel,
 				      GTK_RESPONSE_CANCEL);
@@ -550,5 +542,10 @@
 			  G_CALLBACK (brasero_tool_dialog_drive_changed_cb),
 			  obj);
 
+	g_signal_connect (obj,
+			  "response",
+			  G_CALLBACK (brasero_tool_dialog_response),
+			  NULL);
+
 	gtk_window_resize (GTK_WINDOW (obj), 10, 10);
 }

Modified: trunk/src/brasero-tool-dialog.h
==============================================================================
--- trunk/src/brasero-tool-dialog.h	(original)
+++ trunk/src/brasero-tool-dialog.h	Mon Jan  5 17:42:34 2009
@@ -62,13 +62,16 @@
 
 	gboolean	(*activate)		(BraseroToolDialog *dialog,
 						 BraseroMedium *medium);
-	void		(*cancel)		(BraseroToolDialog *dialog);
+	gboolean	(*cancel)		(BraseroToolDialog *dialog);
 	void		(*drive_changed)	(BraseroToolDialog *dialog,
 						 BraseroMedium *medium);
 };
 
 GType brasero_tool_dialog_get_type ();
 
+gboolean
+brasero_tool_dialog_cancel (BraseroToolDialog *self);
+
 void
 brasero_tool_dialog_pack_options (BraseroToolDialog *dialog, ...);
 

Modified: trunk/src/brasero-utils.c
==============================================================================
--- trunk/src/brasero-utils.c	(original)
+++ trunk/src/brasero-utils.c	Mon Jan  5 17:42:34 2009
@@ -472,7 +472,7 @@
 			gchar *string;
 
 			string = g_strdup_printf ("\"%s\" could not be opened", uri);
-			brasero_app_alert (BRASERO_APP (gtk_widget_get_toplevel (GTK_WIDGET (widget))),
+			brasero_app_alert (brasero_app_get_default (),
 					   string,
 					   error->message,
 					   GTK_MESSAGE_ERROR);

Modified: trunk/src/brasero-video-disc.c
==============================================================================
--- trunk/src/brasero-video-disc.c	(original)
+++ trunk/src/brasero-video-disc.c	Mon Jan  5 17:42:34 2009
@@ -235,10 +235,8 @@
 {
 	gint answer;
 	GtkWidget *dialog;
-	GtkWidget *toplevel;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-	dialog = brasero_app_dialog (BRASERO_APP (toplevel),
+	dialog = brasero_app_dialog (brasero_app_get_default (),
 				     _("Do you want to search for video files inside the directory?"),
 				     GTK_BUTTONS_NONE,
 				     GTK_MESSAGE_WARNING);
@@ -267,21 +265,12 @@
 					  const gchar *uri,
 					  BraseroVideoDisc *self)
 {
-	GtkWidget *toplevel;
 	gchar *primary;
 	gchar *name;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-	if (toplevel == NULL) {
-		g_warning ("Can't open file %s : %s\n",
-			   uri,
-			   error->message);
-		return;
-	}
-
 	name = g_filename_display_basename (uri);
 	primary = g_strdup_printf (_("\"%s\" could not be opened."), name);
-	brasero_app_alert (BRASERO_APP (toplevel),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   error->message,
 			   GTK_MESSAGE_ERROR);
@@ -294,19 +283,12 @@
 				     const gchar *uri,
 				     BraseroVideoDisc *self)
 {
-	GtkWidget *toplevel;
 	gchar *primary;
 	gchar *name;
 
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self));
-	if (toplevel == NULL) {
-		g_warning ("Content widget error : can't handle \"%s\".\n", uri);
-		return ;
-	}
-
 	BRASERO_GET_BASENAME_FOR_DISPLAY (uri, name);
 	primary = g_strdup_printf (_("\"%s\" does not have a suitable type for video projects."), name);
-	brasero_app_alert (BRASERO_APP (toplevel),
+	brasero_app_alert (brasero_app_get_default (),
 			   primary,
 			   _("Please only add files with video contents"),
 			   GTK_MESSAGE_ERROR);

Modified: trunk/src/main.c
==============================================================================
--- trunk/src/main.c	(original)
+++ trunk/src/main.c	Mon Jan  5 17:42:34 2009
@@ -187,16 +187,15 @@
 brasero_app_parse_options (BraseroApp *app)
 {
 	gint nb = 0;
-	GtkWidget *manager;
-
-	manager = brasero_app_get_project_manager (app);
+	GtkWidget *manager = NULL;
 
 	if (parent_window)
 		brasero_app_set_parent (app, parent_window);
 
     	if (empty_project) {
+	    	brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 		brasero_project_manager_empty (BRASERO_PROJECT_MANAGER (manager));
-	    	brasero_app_run (app);
 		return;
 	}
 
@@ -224,13 +223,14 @@
 		nb ++;
 
 	if (nb > 1) {
-		brasero_app_run (app);
+		brasero_app_create_mainwin (app);
 
 		brasero_app_alert (app,
 				   _("Incompatible command line options used."),
 				   _("Only one option can be given at a time"),
 				   GTK_MESSAGE_ERROR);
 
+		manager = brasero_app_get_project_manager (app);
 		brasero_project_manager_empty (BRASERO_PROJECT_MANAGER (manager));
 	}
 	else if (copy_project) {
@@ -244,21 +244,29 @@
 		&&  files [1] == NULL)
 			device = files [0]; 
 
-		brasero_project_manager_set_oneshot (BRASERO_PROJECT_MANAGER (manager), TRUE);
-		brasero_project_manager_copy (BRASERO_PROJECT_MANAGER (manager), device, cover_project);
+		brasero_app_copy_disc (app, device, cover_project);
 		return;
 	}
 	else if (iso_uri) {
-		brasero_project_manager_set_oneshot (BRASERO_PROJECT_MANAGER (manager), TRUE);
-		BRASERO_PROJECT_OPEN_URI (manager, brasero_project_manager_iso, iso_uri);
+		GFile *file;
+		gchar *uri;
+
+		file = g_file_new_for_commandline_arg (iso_uri);
+		uri = g_file_get_uri (file);
+		g_object_unref (file);
+
+		brasero_app_burn_image (app, uri);
 		return;
 	}
 	else if (project_uri) {
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 		brasero_project_manager_set_oneshot (BRASERO_PROJECT_MANAGER (manager), TRUE);
-		brasero_app_run (app);
 		BRASERO_PROJECT_OPEN_URI (manager, brasero_project_manager_open_project, project_uri);
 	}
 	else if (burn_project_uri) {
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 		brasero_project_manager_set_oneshot (BRASERO_PROJECT_MANAGER (manager), TRUE);
 		BRASERO_PROJECT_OPEN_URI (manager, brasero_project_manager_burn_project, burn_project_uri);
 		if (g_remove (burn_project_uri) != 0) {
@@ -347,6 +355,8 @@
 
 		/* reverse to keep the order of files */
 		list = g_slist_reverse (list);
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 		brasero_project_manager_set_oneshot (BRASERO_PROJECT_MANAGER (manager), TRUE);
 		brasero_project_manager_data (BRASERO_PROJECT_MANAGER (manager), list);
 
@@ -358,22 +368,26 @@
 #ifdef BUILD_PLAYLIST
 
 	else if (playlist_uri) {
-		brasero_app_run (app);
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 		BRASERO_PROJECT_OPEN_URI (manager, brasero_project_manager_open_playlist, playlist_uri);
 	}
 
 #endif
 
 	else if (audio_project) {
-		brasero_app_run (app);
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 		BRASERO_PROJECT_OPEN_LIST (manager, brasero_project_manager_audio, files);
 	}
 	else if (data_project) {
-		brasero_app_run (app);
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 		BRASERO_PROJECT_OPEN_LIST (manager, brasero_project_manager_data, files);
 	}
 	else if (video_project) {
-		brasero_app_run (app);
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 	    	BRASERO_PROJECT_OPEN_LIST (manager, brasero_project_manager_video, files);
 	}
 	else if (disc_blank) {
@@ -405,7 +419,8 @@
 		return;
 	}
 	else if (files) {
-		brasero_app_run (app);
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 
 		if (g_strv_length (files) == 1) {
 			BraseroProjectType type;
@@ -423,12 +438,12 @@
 		}
 	}
 	else {
+		brasero_app_create_mainwin (app);
+		manager = brasero_app_get_project_manager (app);
 		brasero_project_manager_empty (BRASERO_PROJECT_MANAGER (manager));
-		brasero_app_run (app);
 	}
 
-	gtk_widget_show (GTK_WIDGET (app));
-	gtk_main ();
+	brasero_app_run_mainwin (app);
 }
 
 static BraseroApp *current_app = NULL;



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