brasero r1748 - in trunk: . libbrasero-media nautilus src src/plugins/libburnia



Author: philippr
Date: Wed Jan 14 15:44:38 2009
New Revision: 1748
URL: http://svn.gnome.org/viewvc/brasero?rev=1748&view=rev

Log:
2009-01-14  Philippe Rouquier  <bonfire-app wanadoo fr>

	Lots of update in one patch to address issues raised during discussion on ML

	Nautilus extension:
	- use libbrasero-media
	- add an icon to the button
	- make it modal to nautilus

	Brasero:
	Fix and respect parenting from commandline xid
	Fix a warning and a title incorrectly set for video projects
	Fixed a unknown symbol for libisofs
	Fixed a recursive signal leading to crash in burn-session.c

	Libbrasero-media:
	Some more documentation
	Added some compile information to be available for apps linking against it
	(version, install path)
	Rewrote brasero-drive-selection because of licencing issues
	Simplified signals for brasero-medium-selection
	For both widgets now, signal and properties match

	Misc:
	Fix bogus name (ykw) for licencing
	Fix a crash when removing the GConf key for a plugin
	
	* configure.in:
	* libbrasero-media/brasero-drive-selection.c
	(brasero_drive_selection_set_current_drive),
	(brasero_drive_selection_changed),
	(brasero_drive_selection_set_active),
	(brasero_drive_selection_get_active),
	(brasero_drive_selection_update_no_disc_entry),
	(brasero_drive_selection_add_no_disc_entry),
	(brasero_drive_selection_show_type),
	(brasero_drive_selection_drive_added_cb),
	(brasero_drive_selection_drive_removed_cb),
	(brasero_drive_selection_init), (brasero_drive_selection_finalize),
	(brasero_drive_selection_set_property),
	(brasero_drive_selection_get_property),
	(brasero_drive_selection_class_init),
	(brasero_drive_selection_new):
	* libbrasero-media/brasero-drive-selection.h:
	* libbrasero-media/brasero-drive.c:
	* libbrasero-media/brasero-media-private.h:
	* libbrasero-media/brasero-media.c:
	* libbrasero-media/brasero-media.h:
	* libbrasero-media/brasero-media.h.in:
	* libbrasero-media/brasero-medium-monitor.h:
	* libbrasero-media/brasero-medium-selection.c
	(brasero_medium_selection_set_current_medium),
	(brasero_medium_selection_changed),
	(brasero_medium_selection_set_active),
	(brasero_medium_selection_get_active),
	(brasero_medium_selection_update_no_disc_entry),
	(brasero_medium_selection_show_media_type),
	(brasero_medium_selection_medium_added_cb),
	(brasero_medium_selection_medium_removed_cb),
	(brasero_medium_selection_class_init):
	* libbrasero-media/brasero-medium-selection.h:
	* libbrasero-media/brasero-medium.c (brasero_medium_get_tooltip):
	* libbrasero-media/brasero-volume.h:
	* nautilus/Makefile.am:
	* nautilus/nautilus-burn-bar.c (nautilus_disc_burn_bar_init):
	* nautilus/nautilus-burn-extension.c (launch_process),
	(launch_brasero_on_window), (write_iso_activate_cb),
	(copy_disc_activate_cb), (blank_disc_activate_cb),
	(check_disc_activate_cb), (volume_is_blank), (drive_is_cd_device),
	(nautilus_module_initialize), (nautilus_module_shutdown):
	* src/brasero-app.c (brasero_app_current_toplevel_destroyed),
	(brasero_app_set_toplevel), (brasero_app_run_mainwin):
	* src/brasero-burn-options.c (brasero_burn_options_init):
	* src/brasero-dest-selection.c
	(brasero_dest_selection_medium_changed),
	(brasero_dest_selection_class_init):
	* src/brasero-disc.c (brasero_disc_get_use_info_notebook):
	* src/brasero-project.c (brasero_project_set_uri):
	* src/brasero-src-selection.c
	(brasero_src_selection_medium_changed),
	(brasero_src_selection_set_property),
	(brasero_src_selection_class_init):
	* src/brasero-tool-dialog.c (brasero_tool_dialog_init):
	* src/burn-plugin.c (brasero_plugin_priority_changed):
	* src/burn-session.c (brasero_burn_session_set_input_type):
	* src/plugins/libburnia/burn-libisofs.c
	(brasero_libisofs_create_volume_thread):


Added:
   trunk/libbrasero-media/brasero-media.h.in
      - copied, changed from r1747, /trunk/libbrasero-media/brasero-media.h
Removed:
   trunk/libbrasero-media/brasero-media.h
Modified:
   trunk/ChangeLog
   trunk/configure.in
   trunk/libbrasero-media/brasero-drive-selection.c
   trunk/libbrasero-media/brasero-drive-selection.h
   trunk/libbrasero-media/brasero-drive.c
   trunk/libbrasero-media/brasero-media-private.h
   trunk/libbrasero-media/brasero-media.c
   trunk/libbrasero-media/brasero-medium-monitor.h
   trunk/libbrasero-media/brasero-medium-selection.c
   trunk/libbrasero-media/brasero-medium-selection.h
   trunk/libbrasero-media/brasero-medium.c
   trunk/libbrasero-media/brasero-volume.h
   trunk/nautilus/Makefile.am
   trunk/nautilus/nautilus-burn-bar.c
   trunk/nautilus/nautilus-burn-extension.c
   trunk/src/brasero-app.c
   trunk/src/brasero-burn-options.c
   trunk/src/brasero-dest-selection.c
   trunk/src/brasero-disc.c
   trunk/src/brasero-project.c
   trunk/src/brasero-src-selection.c
   trunk/src/brasero-tool-dialog.c
   trunk/src/burn-plugin.c
   trunk/src/burn-session.c
   trunk/src/plugins/libburnia/burn-libisofs.c

Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in	(original)
+++ trunk/configure.in	Wed Jan 14 15:44:38 2009
@@ -20,7 +20,7 @@
 AC_SUBST(LT_REVISION)
 AC_SUBST(LT_AGE)
 
-LIBBRASERO_LT_VERSION=0:0:0
+LIBBRASERO_LT_VERSION=$LT_CURRENT:$LT_REVISION:$LT_AGE
 AC_SUBST(LIBBRASERO_LT_VERSION) 
 
 AC_DEFINE_UNQUOTED(BRASERO_MAJOR_VERSION, $BRASERO_MAJOR_VERSION, [major version])
@@ -420,6 +420,7 @@
 help/Makefile
 nautilus/Makefile
 libbrasero-media/Makefile
+libbrasero-media/brasero-media.h
 src/plugins/Makefile
 src/plugins/cdrdao/Makefile
 src/plugins/cdrkit/Makefile

Modified: trunk/libbrasero-media/brasero-drive-selection.c
==============================================================================
--- trunk/libbrasero-media/brasero-drive-selection.c	(original)
+++ trunk/libbrasero-media/brasero-drive-selection.c	Wed Jan 14 15:44:38 2009
@@ -1,524 +1,640 @@
-/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*-
- *
- * brasero-drive-selection.c
- *
- * Copyright (C) 2002-2004 Bastien Nocera <hadess hadess net>
- * Copyright (C) 2005-2006 William Jon McCann <mccann jhu edu>
- * Copyright (C) 2009      Philippe Rouquier <bonfire-app wanadoo fr>
- *
- * This program 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 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * Authors: Bastien Nocera <hadess hadess net>
- *          William Jon McCann <mccann jhu edu>
- *
- */
-
-#include "config.h"
-
-#include <string.h>
-
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2005-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 2 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 brasero.  If not, write to:
+ * 	The Free Software Foundation, Inc.,
+ * 	51 Franklin Street, Fifth Floor
+ * 	Boston, MA  02110-1301, USA.
+   */
+  
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+  
 #include <glib.h>
-#include <glib/gi18n.h>
+#include <glib-object.h>
+#include <glib/gi18n-lib.h>
+  
 #include <gtk/gtk.h>
-
-#include "brasero-medium-monitor.h"
+  
 #include "brasero-drive-selection.h"
-
-/* Signals */
-enum {
-        DRIVE_CHANGED,
-        LAST_SIGNAL
+#include "brasero-medium-monitor.h"
+#include "brasero-drive.h"
+#include "brasero-units.h"
+  
+typedef struct _BraseroDriveSelectionPrivate BraseroDriveSelectionPrivate;
+struct _BraseroDriveSelectionPrivate
+{
+	BraseroDrive *active;
+
+	BraseroDriveType type;
+	gulong added_sig;
+	gulong removed_sig;
 };
+  
+#define BRASERO_DRIVE_SELECTION_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_DRIVE_SELECTION, BraseroDriveSelectionPrivate))
 
-/* Arguments */
-enum {
-        PROP_0,
-        PROP_DRIVE,
-        PROP_DRIVE_TYPE,
-        PROP_RECORDERS_ONLY,
-};
+typedef enum {
+	CHANGED_SIGNAL,
+	LAST_SIGNAL
+} BraseroDriveSelectionSignalType;
+
+static guint brasero_drive_selection_signals [LAST_SIGNAL] = { 0 };
 
 enum {
-        DISPLAY_NAME_COLUMN,
-        DRIVE_COLUMN,
-        N_COLUMNS
+	PROP_0,
+	PROP_DRIVE,
+	PROP_DRIVE_TYPE
 };
-
-#define BRASERO_DRIVE_SELECTION_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_DRIVE_SELECTION, BraseroDriveSelectionPrivate))
-
-typedef struct BraseroDriveSelectionPrivate BraseroDriveSelectionPrivate;
-
-struct BraseroDriveSelectionPrivate {
-        BraseroMediumMonitor *monitor;
-
-        BraseroDrive        *selected_drive;
-        BraseroDriveType     type;
+  
+enum {
+	DRIVE_COL,
+	NAME_COL,
+	ICON_COL,
+	NUM_COL
 };
-
-#define BRASERO_DRIVE_SELECTION_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_DRIVE_SELECTION, BraseroDriveSelectionPrivate))
-
-static void brasero_drive_selection_init         (BraseroDriveSelection *selection);
-
-static void brasero_drive_selection_set_property (GObject      *object,
-                                                  guint         property_id,
-                                                  const GValue *value,
-                                                  GParamSpec   *pspec);
-static void brasero_drive_selection_get_property (GObject      *object,
-                                                  guint         property_id,
-                                                  GValue       *value,
-                                                  GParamSpec   *pspec);
-
-static void brasero_drive_selection_finalize     (GObject      *object);
-
-static int brasero_drive_selection_table_signals [LAST_SIGNAL] = { 0 };
-
+  
 G_DEFINE_TYPE (BraseroDriveSelection, brasero_drive_selection, GTK_TYPE_COMBO_BOX);
-
-static void
-brasero_drive_selection_class_init (BraseroDriveSelectionClass *klass)
-{
-        GObjectClass *object_class;
-        GtkWidgetClass *widget_class;
-
-        object_class = (GObjectClass *) klass;
-        widget_class = (GtkWidgetClass *) klass;
-
-        /* GObject */
-        object_class->set_property = brasero_drive_selection_set_property;
-        object_class->get_property = brasero_drive_selection_get_property;
-        object_class->finalize = brasero_drive_selection_finalize;
-
-        g_type_class_add_private (klass, sizeof (BraseroDriveSelectionPrivate));
-
-        /* Properties */
-        g_object_class_install_property (object_class, PROP_DRIVE,
-                                         g_param_spec_object ("drive",
-                                                              _("Drive"),
-                                                              "The drive currently selected",
-                                                              BRASERO_TYPE_DRIVE,
-                                                              G_PARAM_READWRITE));
-        
-        g_object_class_install_property (object_class, PROP_DRIVE_TYPE,
-                                         g_param_spec_uint ("drive-type",
-                                                            "Drive type",
-                                                            "The drive types used to filter",
-                                                            0, 255, BRASERO_DRIVE_TYPE_ALL_BUT_FILE,
-                                                            G_PARAM_READWRITE));
-
-	/**
- 	* BraseroDriveSelection::drive_changed:
- 	* @selection: the object which received the signal
-  	* @drive: the new drive which is selected
-	*
- 	* This signal gets emitted when the selected drive has changed
- 	*
- 	*/
-        brasero_drive_selection_table_signals [DRIVE_CHANGED] =
-                g_signal_new ("drive_changed",
-                              G_TYPE_FROM_CLASS (object_class),
-                              G_SIGNAL_RUN_LAST,
-                              G_STRUCT_OFFSET (BraseroDriveSelectionClass,
-                                               drive_changed),
-                              NULL, NULL,
-                              g_cclosure_marshal_VOID__OBJECT,
-                              G_TYPE_NONE, 1,
-                              BRASERO_TYPE_DRIVE);
-}
-
-static void
-brasero_drive_selection_set_drive_internal (BraseroDriveSelection *selection,
-                                            BraseroDrive          *drive)
-{
-        BraseroDriveSelectionPrivate *priv;
-
-        priv = BRASERO_DRIVE_SELECTION_PRIVATE (selection);
-        priv->selected_drive = g_object_ref (drive);
-
-        g_signal_emit (G_OBJECT (selection),
-                       brasero_drive_selection_table_signals [DRIVE_CHANGED],
-                       0, drive);
-
-        g_object_notify (G_OBJECT (selection), "drive");
-}
-
-static void
-combo_changed (GtkComboBox                *combo,
-               BraseroDriveSelection *selection)
-{
-        BraseroDrive      *drive;
-        GtkTreeModel      *model;
-        GtkTreeIter        iter;
-
-        if (! gtk_combo_box_get_active_iter (GTK_COMBO_BOX (selection), &iter)) {
-                return;
-        }
-
-        model = gtk_combo_box_get_model (GTK_COMBO_BOX (selection));
-        gtk_tree_model_get (model, &iter, DRIVE_COLUMN, &drive, -1);
-
-        if (drive == NULL) {
-                return;
-        }
-
-        brasero_drive_selection_set_drive_internal (selection, drive);
-}
-
+  
+  
 static void
-selection_update_sensitivity (BraseroDriveSelection *selection)
+brasero_drive_selection_set_current_drive (BraseroDriveSelection *self,
+					   GtkTreeIter *iter)
 {
-        GtkTreeModel *model;
-        int           num_drives;
-
-        model = gtk_combo_box_get_model (GTK_COMBO_BOX (selection));
-        num_drives = gtk_tree_model_iter_n_children (model, NULL);
-
-        gtk_widget_set_sensitive (GTK_WIDGET (selection), (num_drives > 0));
+	BraseroDriveSelectionPrivate *priv;
+	BraseroDrive *drive;
+	GtkTreeModel *model;
+
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (self);
+
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (self));
+	gtk_tree_model_get (model, iter,
+			    DRIVE_COL, &drive,
+			    -1);
+  
+	if (priv->active == drive)
+		return;
+  
+	if (priv->active)
+		g_object_unref (priv->active);
+  
+	priv->active = drive;
+  
+	if (priv->active) {
+		gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
+		g_object_ref (priv->active);
+	}
+	else
+		gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
+  
+	g_signal_emit (self,
+		       brasero_drive_selection_signals [CHANGED_SIGNAL],
+		       0,
+		       priv->active);
+}
+  
+static void
+brasero_drive_selection_changed (GtkComboBox *combo)
+{
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+  
+	model = gtk_combo_box_get_model (combo);
+	if (!gtk_combo_box_get_active_iter (combo, &iter))
+		return;
+  
+	brasero_drive_selection_set_current_drive (BRASERO_DRIVE_SELECTION (combo), &iter);
 }
+  
+/**
+ * brasero_drive_selection_set_active:
+ * @selector: a #BraseroDriveSelection
+ * @drive: a #BraseroDrive to set as the active one in the selector
+ *
+ * Sets the active drive. Emits the ::drive-changed signal.
+ *
+ * Return value: a #gboolean. TRUE if it succeeded, FALSE otherwise.
+ **/
+gboolean
+brasero_drive_selection_set_active (BraseroDriveSelection *selector,
+				     BraseroDrive *drive)
+{
+	BraseroDriveSelectionPrivate *priv;
+	gboolean result = FALSE;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+
+	g_return_val_if_fail (selector != NULL, FALSE);
+	g_return_val_if_fail (BRASERO_IS_DRIVE_SELECTION (selector), FALSE);
+
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (selector);
+  
+	if (priv->active == drive)
+		return TRUE;
+  
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (selector));
+	if (!gtk_tree_model_get_iter_first (model, &iter))
+		return FALSE;
+  
+	do {
+		BraseroDrive *iter_drive;
+  
+		gtk_tree_model_get (model, &iter,
+				    DRIVE_COL, &iter_drive,
+				    -1);
+  
+		if (drive == iter_drive) {
+			if (iter_drive)
+				g_object_unref (iter_drive);
+
+			gtk_combo_box_set_active_iter (GTK_COMBO_BOX (selector), &iter);
+			brasero_drive_selection_set_current_drive (selector, &iter);
+			result = TRUE;
+			break;
+		}
 
-static gboolean
-get_iter_for_drive (BraseroDriveSelection *selection,
-                    BraseroDrive          *drive,
-                    GtkTreeIter           *iter)
-{
-        GtkTreeModel      *model;
-        gboolean           found;
-
-        found = FALSE;
-
-        model = gtk_combo_box_get_model (GTK_COMBO_BOX (selection));
-        if (! gtk_tree_model_get_iter_first (model, iter)) {
-                goto out;
-        }
-
-        do {
-                BraseroDrive *drive2;
-
-                gtk_tree_model_get (model, iter, DRIVE_COLUMN, &drive2, -1);
-
-                if (drive == drive2) {
-                        found = TRUE;
-                        break;
-                }
-
-        } while (gtk_tree_model_iter_next (model, iter));
- out:
-        return found;
-}
-
-static void
-selection_append_drive (BraseroDriveSelection *selection,
-                        BraseroDrive          *drive)
-{
-        char         *display_name;
-        GtkTreeIter   iter;
-        GtkTreeModel *model;
-
-        display_name = brasero_drive_get_display_name (drive);
-
-        model = gtk_combo_box_get_model (GTK_COMBO_BOX (selection));
-        gtk_list_store_append (GTK_LIST_STORE (model), &iter);
-        gtk_list_store_set (GTK_LIST_STORE (model), &iter,
-                            DISPLAY_NAME_COLUMN, display_name ? display_name : _("Unnamed CD/DVD Drive"),
-                            DRIVE_COLUMN, drive,
-                            -1);
-
-        g_free (display_name);
-}
-
-static void
-selection_remove_drive (BraseroDriveSelection *selection,
-                        BraseroDrive          *drive)
-{
-        gboolean                      found;
-        GtkTreeIter                   iter;
-        GtkTreeModel                 *model;
-        BraseroDriveSelectionPrivate *priv;
-
-        priv = BRASERO_DRIVE_SELECTION_PRIVATE (selection);
-        found = get_iter_for_drive (selection, drive, &iter);
-        if (! found) {
-                return;
-        }
-
-        model = gtk_combo_box_get_model (GTK_COMBO_BOX (selection));
-        gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
-
-        if (priv->selected_drive != NULL
-        && (drive == priv->selected_drive)) {
-                if (gtk_tree_model_get_iter_first (model, &iter)) {
-                        gtk_combo_box_set_active_iter (GTK_COMBO_BOX (selection), &iter);
-                }
-        }
-}
-
-static void
-populate_model (BraseroDriveSelection *selection,
-                GtkListStore          *store)
-{
-        GSList                       *drives;
-        BraseroDrive                 *drive;
-        BraseroMediumMonitor         *monitor;
-        BraseroDriveSelectionPrivate *priv;
-
-        priv = BRASERO_DRIVE_SELECTION_PRIVATE (selection);
-        monitor = brasero_medium_monitor_get_default ();
-        drives = brasero_medium_monitor_get_drives (monitor, priv->type);
-        while (drives != NULL) {
-                drive = drives->data;
-
-                selection_append_drive (selection, drive);
-
-                if (drive != NULL) {
-                        g_object_unref (drive);
-                }
-                drives = g_slist_delete_link (drives, drives);
-        }
+		g_object_unref (iter_drive);
+	} while (gtk_tree_model_iter_next (model, &iter));
 
-        gtk_combo_box_set_active (GTK_COMBO_BOX (selection), 0);
+	return result;
 }
-
-static void
-drive_connected_cb (BraseroMediumMonitor   *monitor,
-                    BraseroDrive          *drive,
-                    BraseroDriveSelection *selection)
+  
+/**
+ * brasero_drive_selection_get_active:
+ * @selector: a #BraseroDriveSelection
+ *
+ * Gets the active drive.
+ *
+ * Return value: a #BraseroDrive or NULL. Unref when it is not needed anymore.
+ **/
+BraseroDrive *
+brasero_drive_selection_get_active (BraseroDriveSelection *selector)
 {
-        selection_append_drive (selection, drive);
+	BraseroDriveSelectionPrivate *priv;
 
-        selection_update_sensitivity (selection);
-}
+	g_return_val_if_fail (selector != NULL, NULL);
+	g_return_val_if_fail (BRASERO_IS_DRIVE_SELECTION (selector), NULL);
 
-static void
-drive_disconnected_cb (BraseroMediumMonitor   *monitor,
-                       BraseroDrive          *drive,
-                       BraseroDriveSelection *selection)
-{
-        selection_remove_drive (selection, drive);
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (selector);
+	if (!priv->active)
+		return NULL;
 
-        selection_update_sensitivity (selection);
+	return g_object_ref (priv->active);
 }
 
 static void
-brasero_drive_selection_init (BraseroDriveSelection *selection)
+brasero_drive_selection_update_no_disc_entry (BraseroDriveSelection *self,
+					      GtkTreeModel *model,
+					      GtkTreeIter *iter)
 {
-        GtkCellRenderer              *cell;
-        GtkListStore                 *store;
-        BraseroDriveSelectionPrivate *priv;
-
-        priv = BRASERO_DRIVE_SELECTION_PRIVATE (selection);
-
-        priv->monitor = brasero_medium_monitor_get_default ();
-
-        g_signal_connect (priv->monitor, "drive-added", G_CALLBACK (drive_connected_cb), selection);
-        g_signal_connect (priv->monitor, "drive-removed", G_CALLBACK (drive_disconnected_cb), selection);
-
-        store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, BRASERO_TYPE_DRIVE);
-        gtk_combo_box_set_model (GTK_COMBO_BOX (selection),
-                                 GTK_TREE_MODEL (store));
-
-        cell = gtk_cell_renderer_text_new ();
-        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (selection), cell, TRUE);
-        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (selection), cell,
-                                        "text", DISPLAY_NAME_COLUMN,
-                                        NULL);
+	GIcon *icon;
 
-        priv->type = BRASERO_DRIVE_TYPE_ALL_BUT_FILE;
-        populate_model (selection, store);
+	icon = g_themed_icon_new_with_default_fallbacks ("drive-optical");
 
-        selection_update_sensitivity (selection);
+	/* FIXME: that needs a string */
+	gtk_list_store_set (GTK_LIST_STORE (model), iter,
+			    NAME_COL, NULL,
+			    ICON_COL, NULL,
+			    -1);
 
-        g_signal_connect (G_OBJECT (selection), "changed",
-                          G_CALLBACK (combo_changed), selection);
+	g_object_unref (icon);
 
+	gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), iter);
+	brasero_drive_selection_set_current_drive (self, iter);
 }
-
+  
 static void
-brasero_drive_selection_finalize (GObject *object)
+brasero_drive_selection_add_no_disc_entry (BraseroDriveSelection *self)
 {
-        BraseroDriveSelection *selection = (BraseroDriveSelection *) object;
-        BraseroDriveSelectionPrivate *priv;
-
-        g_return_if_fail (selection != NULL);
-        g_return_if_fail (BRASERO_IS_DRIVE_SELECTION (selection));
-
-        priv = BRASERO_DRIVE_SELECTION_PRIVATE (selection);
-
-        g_signal_handlers_disconnect_by_func (priv->monitor, G_CALLBACK (drive_connected_cb), selection);
-        g_signal_handlers_disconnect_by_func (priv->monitor, G_CALLBACK (drive_disconnected_cb), selection);
-
-        if (priv->selected_drive != NULL) {
-                g_object_unref (priv->selected_drive);
-        }
-
-        if (G_OBJECT_CLASS (brasero_drive_selection_parent_class)->finalize != NULL) {
-                (* G_OBJECT_CLASS (brasero_drive_selection_parent_class)->finalize) (object);
-        }
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+	BraseroDriveSelectionPrivate *priv;
+  
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (self);
+  
+	/* Nothing's available. Say it. Two cases here, either we're
+	 * still probing drives or there isn't actually any available
+	 * drive. */
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (self));
+	gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+	brasero_drive_selection_update_no_disc_entry (self, model, &iter);
 }
-
+  
 /**
- * brasero_drive_selection_new:
- *
- * Create a new drive selector.
+ * brasero_drive_selection_show_type:
+ * @selector: a #BraseroDriveSelection
+ * @type: a #BraseroDriveType
  *
- * Return value: Newly allocated #BraseroDriveSelection widget
+ * Filters and displays drive corresponding to @type.
  *
  **/
-GtkWidget *
-brasero_drive_selection_new (void)
-{
-        GtkWidget *widget;
-
-        widget = GTK_WIDGET
-                (g_object_new (BRASERO_TYPE_DRIVE_SELECTION, NULL));
-
-        return widget;
-}
-
-static void
-repopulate_model (BraseroDriveSelection *selection)
-{
-        GtkTreeModel *model;
-
-        /* block the combo changed signal handler until we're done */
-        g_signal_handlers_block_by_func (G_OBJECT (selection),
-                                         combo_changed, selection);
-
-        model = gtk_combo_box_get_model (GTK_COMBO_BOX (selection));
-        gtk_list_store_clear (GTK_LIST_STORE (model));
-        populate_model (selection, GTK_LIST_STORE (model));
-
-        g_signal_handlers_unblock_by_func (G_OBJECT (selection),
-                                           combo_changed, selection);
-
-        /* Force a signal out */
-        combo_changed (GTK_COMBO_BOX (selection), (gpointer) selection);
-}
-
 void
-brasero_drive_selection_show_type (BraseroDriveSelection          *selection,
-                                   BraseroDriveType                type)
+brasero_drive_selection_show_type (BraseroDriveSelection *selector,
+				   BraseroDriveType type)
 {
-        BraseroDriveSelectionPrivate *priv;
-
-        g_return_if_fail (selection != NULL);
-        g_return_if_fail (BRASERO_IS_DRIVE_SELECTION (selection));
-
-        priv = BRASERO_DRIVE_SELECTION_PRIVATE (selection);
-        priv->type = type;
-
-        repopulate_model (selection);
-        selection_update_sensitivity (selection);
+	BraseroDriveSelectionPrivate *priv;
+	BraseroMediumMonitor *monitor;
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	GSList *list;
+	GSList *item;
+
+	g_return_if_fail (selector != NULL);
+	g_return_if_fail (BRASERO_IS_DRIVE_SELECTION (selector));
+
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (selector);
+
+	priv->type = type;
+
+	monitor = brasero_medium_monitor_get_default ();
+	list = brasero_medium_monitor_get_drives (monitor, type);
+	g_object_unref (monitor);
+  
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (selector));
+	if (gtk_tree_model_get_iter_first (model, &iter)) {
+		/* First filter */
+		do {
+			GSList *node;
+			BraseroDrive *drive;
+  
+			gtk_tree_model_get (model, &iter,
+					    DRIVE_COL, &drive,
+					    -1);
+  
+			if (!drive) {
+				/* That's the dummy line saying there isn't any
+				 * available drive for whatever action it is */
+				gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+				break;
+			}
+  
+			node = g_slist_find (list, drive);
+			g_object_unref (drive);
+  
+			if (!node) {
+				if (gtk_list_store_remove (GTK_LIST_STORE (model), &iter))
+					continue;
+  
+				/* no more iter in the tree get out */
+				break;
+			}
+  
+			g_object_unref (node->data);
+			list = g_slist_delete_link (list, node);
+		} while (gtk_tree_model_iter_next (model, &iter));
+	}
+  
+	if (list) {
+		/* add remaining drive */
+		for (item = list; item; item = item->next) {
+			gchar *drive_name;
+			BraseroDrive *drive;
+  			GIcon *drive_icon = NULL;
+
+			drive = item->data;
+
+			drive_name =  brasero_drive_get_display_name (drive);
+
+			if (!brasero_drive_is_fake (drive)) {
+				GDrive *gdrive;
+
+				gdrive = brasero_drive_get_gdrive (drive);
+				if (gdrive) {
+					drive_icon = g_drive_get_icon (gdrive);
+					g_object_unref (gdrive);
+				}
+				else
+					drive_icon = g_themed_icon_new_with_default_fallbacks ("drive-optical");
+			}
+			else
+				drive_icon = g_themed_icon_new_with_default_fallbacks ("iso-image-new");
+  
+			gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+			gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+					    DRIVE_COL, drive,
+					    NAME_COL, drive_name?drive_name:_("Unnamed CD/DVD Drive"),
+					    ICON_COL, drive_icon,
+					    -1);
+			g_free (drive_name);
+		}
+		g_slist_foreach (list, (GFunc) g_object_unref, NULL);
+		g_slist_free (list);
+	}
+  
+	if (!gtk_tree_model_get_iter_first (model, &iter)) {
+		brasero_drive_selection_add_no_disc_entry (selector);
+		return;
+	}
+
+	gtk_widget_set_sensitive (GTK_WIDGET (selector), TRUE);
+	if (gtk_combo_box_get_active (GTK_COMBO_BOX (selector)) == -1) {
+		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (selector), &iter);
+		brasero_drive_selection_set_current_drive (selector, &iter);
+	}
+}
+
+static void
+brasero_drive_selection_drive_added_cb (BraseroMediumMonitor *monitor,
+					BraseroDrive *drive,
+					BraseroDriveSelection *self)
+{
+	BraseroDriveSelectionPrivate *priv;
+	gboolean add = FALSE;
+	GtkTreeModel *model;
+	gchar *drive_name;
+	GIcon *drive_icon;
+	GtkTreeIter iter;
+
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (self);
+
+	if ((priv->type & BRASERO_DRIVE_TYPE_WRITER)
+	&&  (brasero_drive_can_write (drive)))
+		add = TRUE;
+	else if (priv->type & BRASERO_DRIVE_TYPE_READER)
+		add = TRUE;
+
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (self));
+
+	if (!add) {
+		/* Try to get the first iter (it shouldn't fail) */
+		if (!gtk_tree_model_get_iter_first (model, &iter)) {
+			brasero_drive_selection_add_no_disc_entry (self);
+			return;
+		}
+  
+		/* See if that's a real drive or not; if so, return. */
+		drive = NULL;
+		gtk_tree_model_get (model, &iter,
+				    DRIVE_COL, &drive,
+				    -1);
+		if (drive)
+			return;
+  
+		brasero_drive_selection_update_no_disc_entry (self, model, &iter);
+		return;
+	}
+  
+	/* remove warning message */
+	if (gtk_tree_model_get_iter_first (model, &iter)) {
+		BraseroDrive *tmp;
+  
+		gtk_tree_model_get (model, &iter,
+				    DRIVE_COL, &tmp,
+				    -1);
+		if (!tmp)
+			gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+		else
+			g_object_unref (tmp);
+	}
+
+	if (!brasero_drive_is_fake (drive)) {
+		GDrive *gdrive;
+
+		gdrive = brasero_drive_get_gdrive (drive);
+		if (gdrive) {
+			drive_icon = g_drive_get_icon (gdrive);
+			g_object_unref (gdrive);
+		}
+		else
+			drive_icon = g_themed_icon_new_with_default_fallbacks ("drive-optical");
+	}
+	else
+		drive_icon = g_themed_icon_new_with_default_fallbacks ("iso-image-new");
+
+	drive_name = brasero_drive_get_display_name (drive);
+
+	gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+	gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+			    DRIVE_COL, drive,
+			    NAME_COL, drive_name?drive_name:_("Unnamed CD/DVD Drive"),
+			    ICON_COL, drive_icon,
+			    -1);
+	g_free (drive_name);
+
+	gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
+	if (gtk_combo_box_get_active (GTK_COMBO_BOX (self)) == -1) {
+		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), &iter);
+		brasero_drive_selection_set_current_drive (self, &iter);
+	}
+}
+  
+static void
+brasero_drive_selection_drive_removed_cb (BraseroMediumMonitor *monitor,
+					    BraseroDrive *drive,
+					    BraseroDriveSelection *self)
+  {
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+  
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (self));
+	if (!gtk_tree_model_get_iter_first (model, &iter))
+		return;
+  
+	do {
+		BraseroDrive *iter_drive;
+  
+		gtk_tree_model_get (model, &iter,
+				    DRIVE_COL, &iter_drive,
+				    -1);
+  
+		if (drive == iter_drive) {
+			g_object_unref (iter_drive);
+			gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+			break;
+		}
+  
+		/* Could be NULL if a message "there is no drive ..." is on */
+		if (iter_drive)
+			g_object_unref (iter_drive);
+  
+	} while (gtk_tree_model_iter_next (model, &iter));
+
+	if (!gtk_tree_model_get_iter_first (model, &iter)) {
+		brasero_drive_selection_add_no_disc_entry (self);
+		return;
+	}
+
+	if (gtk_combo_box_get_active (GTK_COMBO_BOX (self)) == -1) {
+		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), &iter);
+		brasero_drive_selection_set_current_drive (self, &iter);
+	}
+}
+  
+static void
+brasero_drive_selection_init (BraseroDriveSelection *object)
+{
+	GtkListStore *model;
+	GtkCellRenderer *renderer;
+	BraseroMediumMonitor *monitor;
+	BraseroDriveSelectionPrivate *priv;
+
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (object);
+
+	monitor = brasero_medium_monitor_get_default ();
+	priv->added_sig = g_signal_connect (monitor,
+					    "drive-added",
+					    G_CALLBACK (brasero_drive_selection_drive_added_cb),
+					    object);
+	priv->removed_sig = g_signal_connect (monitor,
+					      "drive-removed",
+					      G_CALLBACK (brasero_drive_selection_drive_removed_cb),
+					      object);
+
+	g_object_unref (monitor);
+
+	/* get the list and fill the model */
+	model = gtk_list_store_new (NUM_COL,
+				    G_TYPE_OBJECT,
+				    G_TYPE_STRING,
+				    G_TYPE_ICON);
+
+	gtk_combo_box_set_model (GTK_COMBO_BOX (object), GTK_TREE_MODEL (model));
+	g_object_unref (model);
+
+	renderer = gtk_cell_renderer_pixbuf_new ();
+	g_object_set (renderer, "follow-state", TRUE, NULL);
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (object), renderer, FALSE);
+	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (object), renderer,
+					"gicon", ICON_COL,
+					NULL);
+
+	renderer = gtk_cell_renderer_text_new ();
+	g_object_set (renderer, "xpad", 8, NULL);
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (object), renderer, TRUE);
+	gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (object), renderer,
+					"markup", NAME_COL,
+					NULL);
+
+	brasero_drive_selection_show_type (BRASERO_DRIVE_SELECTION (object),
+					   BRASERO_DRIVE_TYPE_ALL_BUT_FILE);
+						 
 }
-
+  
 static void
-brasero_drive_selection_set_property (GObject      *object,
-                                      guint         property_id,
-                                      const GValue *value,
-                                      GParamSpec   *pspec)
+brasero_drive_selection_finalize (GObject *object)
 {
-        BraseroDriveSelection *selection;
-
-        g_return_if_fail (BRASERO_IS_DRIVE_SELECTION (object));
-
-        selection = BRASERO_DRIVE_SELECTION (object);
-
-        switch (property_id) {
-        case PROP_DRIVE:
-                brasero_drive_selection_set_active (selection, g_value_get_object (value));
-                break;
-        case PROP_DRIVE_TYPE:
-                brasero_drive_selection_show_type (selection, g_value_get_uint (value));
-                break;
-        default:
-                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-        }
+	BraseroDriveSelectionPrivate *priv;
+	BraseroMediumMonitor *monitor;
+  
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (object);
+  
+	monitor = brasero_medium_monitor_get_default ();
+  
+	g_signal_handler_disconnect (monitor, priv->added_sig);
+	g_signal_handler_disconnect (monitor, priv->removed_sig);
+	priv->removed_sig = 0;
+	priv->added_sig = 0;
+
+	g_object_unref (monitor);
+
+	G_OBJECT_CLASS (brasero_drive_selection_parent_class)->finalize (object);
+  }
+  
+static void
+brasero_drive_selection_set_property (GObject *object,
+				       guint prop_id,
+				       const GValue *value,
+				       GParamSpec *pspec)
+{
+	BraseroDriveSelectionPrivate *priv;
+  
+	g_return_if_fail (BRASERO_IS_DRIVE_SELECTION (object));
+  
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (object);
+  
+	switch (prop_id)
+	{
+	case PROP_DRIVE_TYPE:
+		brasero_drive_selection_show_type (BRASERO_DRIVE_SELECTION (object),
+						   g_value_get_uint (value));
+		break;
+	case PROP_DRIVE:
+		brasero_drive_selection_set_active (BRASERO_DRIVE_SELECTION (object),
+						     BRASERO_DRIVE (g_value_get_object (value)));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+  }
+  
+static void
+brasero_drive_selection_get_property (GObject *object,
+				       guint prop_id,
+				       GValue *value,
+				       GParamSpec *pspec)
+{
+	BraseroDriveSelectionPrivate *priv;
+  
+	g_return_if_fail (BRASERO_IS_DRIVE_SELECTION (object));
+  
+	priv = BRASERO_DRIVE_SELECTION_PRIVATE (object);
+  
+	switch (prop_id)
+	{
+	case PROP_DRIVE_TYPE:
+		g_value_set_uint (value, priv->type);
+		break;
+	case PROP_DRIVE:
+		g_value_set_object (value, brasero_drive_selection_get_active (BRASERO_DRIVE_SELECTION (object)));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
 }
-
+  
 static void
-brasero_drive_selection_get_property (GObject    *object,
-                                      guint       property_id,
-                                      GValue     *value,
-                                      GParamSpec *pspec)
-{
-        BraseroDriveSelectionPrivate *priv;
-
-        g_return_if_fail (BRASERO_IS_DRIVE_SELECTION (object));
-
-        priv = BRASERO_DRIVE_SELECTION_PRIVATE (object);
-
-        switch (property_id) {
-        case PROP_DRIVE:
-                g_value_set_object (value, priv->selected_drive);
-                break;
-        case PROP_DRIVE_TYPE:
-                g_value_set_uint (value, priv->type);
-                break;
-        default:
-                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-        }
-}
-
-/**
- * brasero_drive_selection_set_active:
- * @selection: #BraseroDriveSelection
- * @drive: #BraseroDrive
- *
- * Set the current selected drive to that which corresponds to the
- * specified drive.
- *
- **/
-void
-brasero_drive_selection_set_active (BraseroDriveSelection *selection,
-                                          BraseroDrive          *drive)
+brasero_drive_selection_class_init (BraseroDriveSelectionClass *klass)
 {
-        GtkTreeIter        iter;
-        gboolean           found;
-
-        g_return_if_fail (selection != NULL);
-        g_return_if_fail (BRASERO_IS_DRIVE_SELECTION (selection));
-
-        found = get_iter_for_drive (selection, drive, &iter);
-        if (! found) {
-                return;
-        }
-
-        gtk_combo_box_set_active_iter (GTK_COMBO_BOX (selection), &iter);
+	GObjectClass* object_class = G_OBJECT_CLASS (klass);
+	GtkComboBoxClass *combo_class = GTK_COMBO_BOX_CLASS (klass);
+  
+	g_type_class_add_private (klass, sizeof (BraseroDriveSelectionPrivate));
+  
+	object_class->finalize = brasero_drive_selection_finalize;
+	object_class->set_property = brasero_drive_selection_set_property;
+	object_class->get_property = brasero_drive_selection_get_property;
+  
+	combo_class->changed = brasero_drive_selection_changed;
+
+	g_object_class_install_property (object_class, PROP_DRIVE,
+					 g_param_spec_object (_("drive"), NULL, NULL,
+							      BRASERO_TYPE_DRIVE, G_PARAM_READWRITE));
+
+	g_object_class_install_property (object_class, PROP_DRIVE_TYPE,
+					 g_param_spec_uint ("drive-type", NULL, NULL,
+							    0, BRASERO_DRIVE_TYPE_ALL,
+							    BRASERO_DRIVE_TYPE_ALL_BUT_FILE,
+							    G_PARAM_READWRITE));
+	brasero_drive_selection_signals [CHANGED_SIGNAL] =
+	    g_signal_new ("drive_changed",
+			  BRASERO_TYPE_DRIVE_SELECTION,
+			  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
+			  G_STRUCT_OFFSET (BraseroDriveSelectionClass, drive_changed),
+			  NULL,
+			  NULL,
+			  g_cclosure_marshal_VOID__OBJECT,
+			  G_TYPE_NONE,
+			  1,
+			  BRASERO_TYPE_DRIVE);
 }
-
-/**
- * brasero_drive_selection_get_active:
- * @selection: #BraseroDriveSelection
- *
- * Get the currently selected drive
- *
- * Return value: currently selected #BraseroDrive.  The drive must be
- * unreffed using nautilus_burn_drive_unref after use.
- *
- **/
-BraseroDrive *
-brasero_drive_selection_get_active (BraseroDriveSelection *selection)
+  
+GtkWidget *
+brasero_drive_selection_new (void)
 {
-        BraseroDriveSelectionPrivate *priv;
-
-        g_return_val_if_fail (selection != NULL, NULL);
-        g_return_val_if_fail (BRASERO_IS_DRIVE_SELECTION (selection), NULL);
-
-        priv = BRASERO_DRIVE_SELECTION_PRIVATE (selection);
-        if (priv->selected_drive != NULL) {
-                g_object_ref (priv->selected_drive);
-        }
-
-        return priv->selected_drive;
+	return g_object_new (BRASERO_TYPE_DRIVE_SELECTION, NULL);
 }
-

Modified: trunk/libbrasero-media/brasero-drive-selection.h
==============================================================================
--- trunk/libbrasero-media/brasero-drive-selection.h	(original)
+++ trunk/libbrasero-media/brasero-drive-selection.h	Wed Jan 14 15:44:38 2009
@@ -1,66 +1,74 @@
-/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*-
- *
- * brasero-drive-selection.h
- *
- * Copyright (C) 2002-2004 Bastien Nocera <hadess hadess net>
- * Copyright (C) 2005-2006 William Jon McCann <mccann jhu edu>
- * Copyright (C) 2009      Philippe Rouquier <bonfire-app wanadoo fr>
- *
- * This program 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 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * brasero
+ * Copyright (C) Philippe Rouquier 2005-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 2 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.
- *
+ * 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, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * Authors: Bastien Nocera <hadess hadess net>
- *          William Jon McCann <mccann jhu edu>
+ * along with brasero.  If not, write to:
+ * 	The Free Software Foundation, Inc.,
+ * 	51 Franklin Street, Fifth Floor
+ * 	Boston, MA  02110-1301, USA.
  */
 
 #ifndef _BRASERO_DRIVE_SELECTION_H_
 #define _BRASERO_DRIVE_SELECTION_H_
 
+#include <glib-object.h>
+
 #include <gtk/gtk.h>
 
-#include <brasero-drive.h>
 #include <brasero-medium-monitor.h>
+#include <brasero-drive.h>
 
 G_BEGIN_DECLS
 
-#define BRASERO_TYPE_DRIVE_SELECTION              (brasero_drive_selection_get_type ())
-#define BRASERO_DRIVE_SELECTION(obj)              (G_TYPE_CHECK_INSTANCE_CAST ((obj), BRASERO_TYPE_DRIVE_SELECTION, BraseroDriveSelection))
-#define BRASERO_DRIVE_SELECTION_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST ((klass), BRASERO_TYPE_DRIVE_SELECTION, BraseroDriveSelectionClass))
-#define BRASERO_IS_DRIVE_SELECTION(obj)           (G_TYPE_CHECK_INSTANCE_TYPE (obj, BRASERO_TYPE_DRIVE_SELECTION))
-#define BRASERO_IS_DRIVE_SELECTION_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), BRASERO_TYPE_DRIVE_SELECTION))
-
-
-typedef struct {
-        GtkComboBox                        widget;
-} BraseroDriveSelection;
-
-typedef struct {
-        GtkComboBoxClass parent_class;
-
-        void (* drive_changed)  (GtkWidget         *selection,
-                                 BraseroDrive      *drive);
-} BraseroDriveSelectionClass;
-
-GType                    brasero_drive_selection_get_type           (void) G_GNUC_CONST;
-GtkWidget               *brasero_drive_selection_new                (void);
-
-void                     brasero_drive_selection_set_active         (BraseroDriveSelection *selection,
-                                                                     BraseroDrive          *drive);
-BraseroDrive            *brasero_drive_selection_get_active         (BraseroDriveSelection *selection);
-
-void                     brasero_drive_selection_show_type          (BraseroDriveSelection *drive,
-                                                                     BraseroDriveType       type);
+#define BRASERO_TYPE_DRIVE_SELECTION             (brasero_drive_selection_get_type ())
+#define BRASERO_DRIVE_SELECTION(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BRASERO_TYPE_DRIVE_SELECTION, BraseroDriveSelection))
+#define BRASERO_DRIVE_SELECTION_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BRASERO_TYPE_DRIVE_SELECTION, BraseroDriveSelectionClass))
+#define BRASERO_IS_DRIVE_SELECTION(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BRASERO_TYPE_DRIVE_SELECTION))
+#define BRASERO_IS_DRIVE_SELECTION_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BRASERO_TYPE_DRIVE_SELECTION))
+#define BRASERO_DRIVE_SELECTION_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BRASERO_TYPE_DRIVE_SELECTION, BraseroDriveSelectionClass))
+
+typedef struct _BraseroDriveSelectionClass BraseroDriveSelectionClass;
+typedef struct _BraseroDriveSelection BraseroDriveSelection;
+
+struct _BraseroDriveSelectionClass
+{
+	GtkComboBoxClass parent_class;
+
+	/* Signals */
+	void		(* drive_changed)		(BraseroDriveSelection *selection,
+							 BraseroDrive *drive);
+};
+
+struct _BraseroDriveSelection
+{
+	GtkComboBox parent_instance;
+};
+
+GType brasero_drive_selection_get_type (void) G_GNUC_CONST;
+GtkWidget* brasero_drive_selection_new (void);
+
+BraseroDrive *
+brasero_drive_selection_get_active (BraseroDriveSelection *selection);
+
+gboolean
+brasero_drive_selection_set_active (BraseroDriveSelection *selection,
+				    BraseroDrive *drive);
+
+void
+brasero_drive_selection_show_type (BraseroDriveSelection *selection,
+				   BraseroDriveType type);
 
 G_END_DECLS
 

Modified: trunk/libbrasero-media/brasero-drive.c
==============================================================================
--- trunk/libbrasero-media/brasero-drive.c	(original)
+++ trunk/libbrasero-media/brasero-drive.c	Wed Jan 14 15:44:38 2009
@@ -98,7 +98,7 @@
  *
  * Returns the #GDrive corresponding to this #BraseroDrive
  *
- * Return value: a #GDrive or NULL.
+ * Return value: a #GDrive or NULL. Unref after use.
  **/
 GDrive *
 brasero_drive_get_gdrive (BraseroDrive *drive)

Modified: trunk/libbrasero-media/brasero-media-private.h
==============================================================================
--- trunk/libbrasero-media/brasero-media-private.h	(original)
+++ trunk/libbrasero-media/brasero-media-private.h	Wed Jan 14 15:44:38 2009
@@ -2,8 +2,8 @@
  *            burn-media-private.h
  *
  *  Wed Oct  8 16:42:17 2008
- *  Copyright  2008  ykw
- *  <ykw localhost localdomain>
+ *  Copyright  2008  Rouquier Philippe
+ *  <bonfire-app wanadoo fr>
  ****************************************************************************/
 
 /*

Modified: trunk/libbrasero-media/brasero-media.c
==============================================================================
--- trunk/libbrasero-media/brasero-media.c	(original)
+++ trunk/libbrasero-media/brasero-media.c	Wed Jan 14 15:44:38 2009
@@ -2,8 +2,8 @@
  *            burn-media.c
  *
  *  Wed Oct  8 16:40:48 2008
- *  Copyright  2008  ykw
- *  <ykw localhost localdomain>
+ *  Copyright  2008  Rouquier Philippe
+ *  <bonfire-app wanadoo fr>
  ****************************************************************************/
 
 /*

Copied: trunk/libbrasero-media/brasero-media.h.in (from r1747, /trunk/libbrasero-media/brasero-media.h)
==============================================================================
--- /trunk/libbrasero-media/brasero-media.h	(original)
+++ trunk/libbrasero-media/brasero-media.h.in	Wed Jan 14 15:44:38 2009
@@ -2,8 +2,8 @@
  *            burn-media.h
  *
  *  Wed Oct  8 16:42:17 2008
- *  Copyright  2008  ykw
- *  <ykw localhost localdomain>
+ *  Copyright  2008  Philippe Rouquier
+ *  <bonfire-app wanadoo fr>
  ****************************************************************************/
 
 /*
@@ -19,7 +19,7 @@
  * 
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 021101301,  USA
  */
  
 #ifndef _BURN_MEDIA_H
@@ -30,6 +30,21 @@
 G_BEGIN_DECLS
 
 /**
+ * Some needed information about the library
+ */
+
+#define LIBBRASERO_MEDIA_VERSION_MAJOR						\
+	@BRASERO_MAJOR_VERSION@
+#define LIBBRASERO_MEDIA_VERSION_MINOR						\
+	@BRASERO_MINOR_VERSION@
+#define LIBBRASERO_MEDIA_VERSION_MICRO						\
+	@BRASERO_SUB@
+#define LIBBRASERO_MEDIA_AGE							\
+	@LT_CURRENT@@LT_REVISION@@LT_AGE@
+#define LIBBRASERO_MEDIA_INSTALL							\
+	"@prefix@"
+
+/**
  * To start and stop the library
  */
 
@@ -216,3 +231,4 @@
 #endif /* _BURN_MEDIA_H */
 
  
+

Modified: trunk/libbrasero-media/brasero-medium-monitor.h
==============================================================================
--- trunk/libbrasero-media/brasero-medium-monitor.h	(original)
+++ trunk/libbrasero-media/brasero-medium-monitor.h	Wed Jan 14 15:44:38 2009
@@ -25,6 +25,7 @@
 
 #include <glib-object.h>
 
+#include <brasero-medium.h>
 #include <brasero-drive.h>
 
 G_BEGIN_DECLS
@@ -46,10 +47,10 @@
 
 	/* Signals */
 	void		(*drive_added)		(BraseroMediumMonitor *monitor,
-						 BraseroDrive *medium);
+						 BraseroDrive *drive);
 
 	void		(*drive_removed)	(BraseroMediumMonitor *monitor,
-						 BraseroDrive*medium);
+						 BraseroDrive *drive);
 
 	void		(*medium_added)		(BraseroMediumMonitor *monitor,
 						 BraseroMedium *medium);

Modified: trunk/libbrasero-media/brasero-medium-selection.c
==============================================================================
--- trunk/libbrasero-media/brasero-medium-selection.c	(original)
+++ trunk/libbrasero-media/brasero-medium-selection.c	Wed Jan 14 15:44:38 2009
@@ -40,6 +40,8 @@
 typedef struct _BraseroMediumSelectionPrivate BraseroMediumSelectionPrivate;
 struct _BraseroMediumSelectionPrivate
 {
+	BraseroMedium *active;
+
 	BraseroMediaType type;
 	gulong added_sig;
 	gulong removed_sig;
@@ -48,8 +50,7 @@
 #define BRASERO_MEDIUM_SELECTION_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_MEDIUM_SELECTION, BraseroMediumSelectionPrivate))
 
 typedef enum {
-	ADDED_SIGNAL,
-	REMOVED_SIGNAL,
+	CHANGED_SIGNAL,
 	LAST_SIGNAL
 } BraseroMediumSelectionSignalType;
 
@@ -201,6 +202,42 @@
 }
 
 static void
+brasero_medium_selection_set_current_medium (BraseroMediumSelection *self,
+					     GtkTreeIter *iter)
+{
+	BraseroMediumSelectionPrivate *priv;
+	BraseroMedium *medium = NULL;
+	GtkTreeModel *model;
+
+	priv = BRASERO_MEDIUM_SELECTION_PRIVATE (self);
+
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (self));
+	gtk_tree_model_get (model, iter,
+			    MEDIUM_COL, &medium,
+			    -1);
+
+	if (priv->active == medium)
+		return;
+
+	if (priv->active)
+		g_object_unref (priv->active);
+
+	priv->active = medium;
+
+	if (priv->active) {
+		gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
+		g_object_ref (priv->active);
+	}
+	else
+		gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
+
+	g_signal_emit (self,
+		       brasero_medium_selection_signals [CHANGED_SIGNAL],
+		       0,
+		       priv->active);
+}
+
+static void
 brasero_drive_selection_set_tooltip (BraseroMediumSelection *self)
 {
 	BraseroMediumSelectionPrivate *priv;
@@ -222,9 +259,17 @@
 }
 
 static void
-brasero_medium_selection_changed (GtkComboBox *box)
+brasero_medium_selection_changed (GtkComboBox *combo)
 {
-	brasero_drive_selection_set_tooltip (BRASERO_MEDIUM_SELECTION (box));
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+
+	model = gtk_combo_box_get_model (combo);
+	if (!gtk_combo_box_get_active_iter (combo, &iter))
+		return;
+
+	brasero_medium_selection_set_current_medium (BRASERO_MEDIUM_SELECTION (combo), &iter);
+	brasero_drive_selection_set_tooltip (BRASERO_MEDIUM_SELECTION (combo));
 }
 
 /**
@@ -232,7 +277,7 @@
  * @selector: a #BraseroMediumSelection
  * @medium: a #BraseroMedium to set as the active one in the selector
  *
- * Sets the active medium.
+ * Sets the active medium. Emits the ::medium-changed signal.
  *
  * Return value: a #gboolean. TRUE if it succeeded, FALSE otherwise.
  **/
@@ -240,10 +285,19 @@
 brasero_medium_selection_set_active (BraseroMediumSelection *selector,
 				     BraseroMedium *medium)
 {
+	BraseroMediumSelectionPrivate *priv;
 	gboolean result = FALSE;
 	GtkTreeModel *model;
 	GtkTreeIter iter;
 
+	g_return_val_if_fail (selector != NULL, FALSE);
+	g_return_val_if_fail (BRASERO_IS_MEDIUM_SELECTION (selector), FALSE);
+
+	priv = BRASERO_MEDIUM_SELECTION_PRIVATE (selector);
+
+	if (priv->active == medium)
+		return TRUE;
+
 	model = gtk_combo_box_get_model (GTK_COMBO_BOX (selector));
 	if (!gtk_tree_model_get_iter_first (model, &iter))
 		return FALSE;
@@ -260,6 +314,7 @@
 				g_object_unref (iter_medium);
 
 			gtk_combo_box_set_active_iter (GTK_COMBO_BOX (selector), &iter);
+			brasero_medium_selection_set_current_medium (selector, &iter);
 			result = TRUE;
 			break;
 		}
@@ -281,18 +336,16 @@
 BraseroMedium *
 brasero_medium_selection_get_active (BraseroMediumSelection *selector)
 {
-	BraseroMedium *medium;
-	GtkTreeModel *model;
-	GtkTreeIter iter;
+	BraseroMediumSelectionPrivate *priv;
 
-	model = gtk_combo_box_get_model (GTK_COMBO_BOX (selector));
-	if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (selector), &iter))
+	g_return_val_if_fail (selector != NULL, NULL);
+	g_return_val_if_fail (BRASERO_IS_MEDIUM_SELECTION (selector), NULL);
+
+	priv = BRASERO_MEDIUM_SELECTION_PRIVATE (selector);
+	if (!priv->active)
 		return NULL;
 
-	gtk_tree_model_get (model, &iter,
-			    MEDIUM_COL, &medium,
-			    -1);
-	return medium;
+	return g_object_ref (priv->active);
 }
 
 static void
@@ -322,8 +375,8 @@
 	g_object_unref (icon);
 	g_object_unref (monitor);
 
-	gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE);
 	gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), iter);
+	brasero_medium_selection_set_current_medium (self, iter);
 }
 
 static void
@@ -362,6 +415,9 @@
 	GSList *list;
 	GSList *item;
 
+	g_return_if_fail (selector != NULL);
+	g_return_if_fail (BRASERO_IS_MEDIUM_SELECTION (selector));
+
 	priv = BRASERO_MEDIUM_SELECTION_PRIVATE (selector);
 
 	priv->type = type;
@@ -392,17 +448,10 @@
 			g_object_unref (medium);
 
 			if (!node) {
-				if (gtk_list_store_remove (GTK_LIST_STORE (model), &iter)) {
-					g_signal_emit (selector,
-						       brasero_medium_selection_signals [REMOVED_SIGNAL],
-						       0);
+				if (gtk_list_store_remove (GTK_LIST_STORE (model), &iter))
 					continue;
-				}
 
-				/* no more iter in the tree  get out */
-				g_signal_emit (selector,
-					       brasero_medium_selection_signals [REMOVED_SIGNAL],
-					       0);
+				/* no more iter in the tree get out */
 				break;
 			}
 
@@ -430,9 +479,6 @@
 					    ICON_COL, medium_icon,
 					    -1);
 			g_free (medium_name);
-			g_signal_emit (selector,
-				       brasero_medium_selection_signals [ADDED_SIGNAL],
-				       0);
 		}
 		g_slist_foreach (list, (GFunc) g_object_unref, NULL);
 		g_slist_free (list);
@@ -444,8 +490,10 @@
 	}
 
 	gtk_widget_set_sensitive (GTK_WIDGET (selector), TRUE);
-	if (gtk_combo_box_get_active (GTK_COMBO_BOX (selector)) == -1)
+	if (gtk_combo_box_get_active (GTK_COMBO_BOX (selector)) == -1) {
 		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (selector), &iter);
+		brasero_medium_selection_set_current_medium (selector, &iter);
+	}
 }
 
 /**
@@ -569,12 +617,10 @@
 	g_free (medium_name);
 
 	gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE);
-	if (gtk_combo_box_get_active (GTK_COMBO_BOX (self)) == -1)
+	if (gtk_combo_box_get_active (GTK_COMBO_BOX (self)) == -1) {
 		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), &iter);
-
-	g_signal_emit (self,
-		       brasero_medium_selection_signals [ADDED_SIGNAL],
-		       0);
+		brasero_medium_selection_set_current_medium (self, &iter);
+	}
 }
 
 static void
@@ -599,9 +645,6 @@
 		if (medium == iter_medium) {
 			g_object_unref (iter_medium);
 			gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
-			g_signal_emit (self,
-				       brasero_medium_selection_signals [REMOVED_SIGNAL],
-				       0);
 			break;
 		}
 
@@ -616,8 +659,10 @@
 		return;
 	}
 
-	if (gtk_combo_box_get_active (GTK_COMBO_BOX (self)) == -1)
+	if (gtk_combo_box_get_active (GTK_COMBO_BOX (self)) == -1) {
 		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), &iter);
+		brasero_medium_selection_set_current_medium (self, &iter);
+	}
 }
 
 static void
@@ -743,7 +788,7 @@
 static void
 brasero_medium_selection_class_init (BraseroMediumSelectionClass *klass)
 {
-	GObjectClass* object_class = G_OBJECT_CLASS (klass);
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	GtkComboBoxClass *combo_class = GTK_COMBO_BOX_CLASS (klass);
 
 	g_type_class_add_private (klass, sizeof (BraseroMediumSelectionPrivate));
@@ -763,27 +808,17 @@
 							    0, BRASERO_MEDIA_TYPE_ALL,
 							    BRASERO_MEDIA_TYPE_NONE,
 							    G_PARAM_READWRITE));
-
-	brasero_medium_selection_signals [ADDED_SIGNAL] =
-	    g_signal_new ("medium_added",
-			  BRASERO_TYPE_MEDIUM_SELECTION,
-			  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
-			  0,
-			  NULL,
-			  NULL,
-			  g_cclosure_marshal_VOID__VOID,
-			  G_TYPE_NONE,
-			  0);
-	brasero_medium_selection_signals [REMOVED_SIGNAL] =
-	    g_signal_new ("medium_removed",
+	brasero_medium_selection_signals [CHANGED_SIGNAL] =
+	    g_signal_new ("medium_changed",
 			  BRASERO_TYPE_MEDIUM_SELECTION,
 			  G_SIGNAL_RUN_FIRST|G_SIGNAL_ACTION|G_SIGNAL_NO_RECURSE,
-			  0,
+			  G_STRUCT_OFFSET (BraseroMediumSelectionClass, medium_changed),
 			  NULL,
 			  NULL,
-			  g_cclosure_marshal_VOID__VOID,
+			  g_cclosure_marshal_VOID__OBJECT,
 			  G_TYPE_NONE,
-			  0);
+			  1,
+			  BRASERO_TYPE_MEDIUM);
 }
 
 GtkWidget *

Modified: trunk/libbrasero-media/brasero-medium-selection.h
==============================================================================
--- trunk/libbrasero-media/brasero-medium-selection.h	(original)
+++ trunk/libbrasero-media/brasero-medium-selection.h	Wed Jan 14 15:44:38 2009
@@ -47,6 +47,10 @@
 {
 	GtkComboBoxClass parent_class;
 
+	/* Signals */
+	void		(* medium_changed)		(BraseroMediumSelection *selection,
+							 BraseroMedium *medium);
+
 	/* virtual function */
 	gchar *		(*format_medium_string)		(BraseroMediumSelection *selection,
 							 BraseroMedium *medium);

Modified: trunk/libbrasero-media/brasero-medium.c
==============================================================================
--- trunk/libbrasero-media/brasero-medium.c	(original)
+++ trunk/libbrasero-media/brasero-medium.c	Wed Jan 14 15:44:38 2009
@@ -243,6 +243,9 @@
 	gchar *label;
 	gchar *name;
 
+	g_return_val_if_fail (self != NULL, NULL);
+	g_return_val_if_fail (BRASERO_IS_MEDIUM (self), NULL);
+
 	priv = BRASERO_MEDIUM_PRIVATE (self);
 
 	media = brasero_medium_get_status (BRASERO_MEDIUM (self));

Modified: trunk/libbrasero-media/brasero-volume.h
==============================================================================
--- trunk/libbrasero-media/brasero-volume.h	(original)
+++ trunk/libbrasero-media/brasero-volume.h	Wed Jan 14 15:44:38 2009
@@ -26,7 +26,7 @@
 #include <glib-object.h>
 #include <gio/gio.h>
 
-#include <brasero-drive.h>
+#include <brasero/brasero-drive.h>
 
 G_BEGIN_DECLS
 

Modified: trunk/nautilus/Makefile.am
==============================================================================
--- trunk/nautilus/Makefile.am	(original)
+++ trunk/nautilus/Makefile.am	Wed Jan 14 15:44:38 2009
@@ -1,9 +1,8 @@
 module_flags = -avoid-version -module
 
 INCLUDES =					\
+	-I$(top_srcdir)/libbrasero-media/	\
 	$(NAUTILUS_EXTENSION_CFLAGS)		\
-	$(BRASERO_DBUS_CFLAGS)			\
-	$(BRASERO_HAL_CFLAGS)			\
 	$(WERROR)				\
 	-D_FILE_OFFSET_BITS=64			\
 	-D_GNU_SOURCE				\
@@ -36,8 +35,6 @@
 	$(NULL)
 
 libnautilus_brasero_extension_la_LIBADD =	\
-	$(NAUTILUS_EXTENSION_LIBS)		\
-	$(BRASERO_DBUS_LIBS)			\
-	$(BRASERO_HAL_LIBS)
+	$(NAUTILUS_EXTENSION_LIBS) ../libbrasero-media/libbrasero-media.la
 
 libnautilus_brasero_extension_la_LDFLAGS = $(module_flags)

Modified: trunk/nautilus/nautilus-burn-bar.c
==============================================================================
--- trunk/nautilus/nautilus-burn-bar.c	(original)
+++ trunk/nautilus/nautilus-burn-bar.c	Wed Jan 14 15:44:38 2009
@@ -126,6 +126,7 @@
 {
         GtkWidget   *label;
         GtkWidget   *hbox;
+        GtkWidget   *image;
 
         bar->priv = NAUTILUS_DISC_BURN_BAR_GET_PRIVATE (bar);
 
@@ -139,6 +140,10 @@
         gtk_widget_show (bar->priv->button);
         gtk_box_pack_end (GTK_BOX (hbox), bar->priv->button, FALSE, FALSE, 0);
 
+        image = gtk_image_new_from_icon_name ("media-optical-burn", GTK_ICON_SIZE_BUTTON);
+        gtk_widget_show (image);
+        gtk_button_set_image (GTK_BUTTON (bar->priv->button), image);
+
         g_signal_connect (bar->priv->button, "clicked",
                           G_CALLBACK (button_clicked_cb),
                           bar);

Modified: trunk/nautilus/nautilus-burn-extension.c
==============================================================================
--- trunk/nautilus/nautilus-burn-extension.c	(original)
+++ trunk/nautilus/nautilus-burn-extension.c	Wed Jan 14 15:44:38 2009
@@ -27,11 +27,15 @@
 #include <stdlib.h>
 #include <string.h>
 #include <glib/gi18n-lib.h>
+#include <gdk/gdkx.h>
 #include <gtk/gtk.h>
-#include <libhal.h>
 #include <libnautilus-extension/nautilus-menu-provider.h>
 #include <libnautilus-extension/nautilus-location-widget-provider.h>
 
+#include "brasero-media.h"
+#include "brasero-medium-monitor.h"
+#include "brasero-drive.h"
+#include "brasero-medium.h"
 #include "nautilus-burn-bar.h"
 
 #define BURN_URI "burn:///"
@@ -115,11 +119,21 @@
 #endif
 
 static void
-launch_process (char **argv, GtkWindow *parent)
+launch_process (char **argv, gint next_arg, GtkWindow *parent)
 {
         GtkWidget *dialog;
         GError *error;
 
+        if (parent && GTK_WIDGET (parent)->window) {
+                guint xid;
+
+		xid = gdk_x11_drawable_get_xid (GDK_DRAWABLE (GTK_WIDGET (parent)->window));
+                if (xid > 0) {
+                        argv [next_arg++] = g_strdup ("-x");
+                        argv [next_arg] = g_strdup_printf ("%d", xid);
+                }
+        }
+
         error = NULL;
         if (!g_spawn_async (NULL,
                             argv, NULL,
@@ -149,16 +163,15 @@
 static void
 launch_brasero_on_window (GtkWindow *window)
 {
-        char *argv [3];
+        int i;
+        char *argv [5] = { NULL, };
 
         argv [0] = g_build_filename (BINDIR, "brasero", NULL);
         argv [1] = g_strdup ("-n");
-        argv [2] = NULL;
-
-        launch_process (argv, window);
 
-        g_free (argv [0]);
-        g_free (argv [1]);
+        launch_process (argv, 2, window);
+	for (i = 0; argv [i]; i++)
+		g_free (argv [i]);
 }
 
 static void
@@ -185,9 +198,10 @@
                        gpointer          user_data)
 {
         NautilusFileInfo *file_info;
-        char             *argv [4];
+        char             *argv [6] = { NULL, };
         char             *uri;
         char             *image_name;
+        int               i;
 
         file_info = g_object_get_data (G_OBJECT (item), "file_info");
 
@@ -205,20 +219,19 @@
         argv [0] = g_build_filename (BINDIR, "brasero", NULL);
         argv [1] = g_strdup ("-i");
         argv [2] = image_name;
-        argv [3] = NULL;
 
-        launch_process (argv, GTK_WINDOW (user_data));
+        launch_process (argv, 3, GTK_WINDOW (user_data));
 
-        g_free (argv [1]);
-        g_free (argv [0]);
-        g_free (image_name);
+	for (i = 0; argv [i]; i++)
+		g_free (argv [i]);
 }
 
 static void
 copy_disc_activate_cb (NautilusMenuItem *item,
                        gpointer          user_data)
 {
-        char             *argv [4];
+        int               i;
+        char             *argv [6] = { NULL, };
         char             *device_path;
 
         device_path = g_object_get_data (G_OBJECT (item), "drive_device_path");
@@ -231,19 +244,19 @@
         argv [0] = g_build_filename (BINDIR, "brasero", NULL);
         argv [1] = g_strdup ("-c");
         argv [2] = device_path;
-        argv [3] = NULL;
 
-        launch_process (argv, GTK_WINDOW (user_data));
+        launch_process (argv, 3, GTK_WINDOW (user_data));
 
-        g_free (argv [1]);
-        g_free (argv [0]);
+	for (i = 0; argv [i]; i++)
+		g_free (argv [i]);
 }
 
 static void
 blank_disc_activate_cb (NautilusMenuItem *item,
                         gpointer          user_data)
 {
-        char             *argv [4];
+        int               i;
+        char             *argv [6]= { NULL, };
         char             *device_path;
 
         device_path = g_object_get_data (G_OBJECT (item), "drive_device_path");
@@ -256,19 +269,19 @@
         argv [0] = g_build_filename (BINDIR, "brasero", NULL);
         argv [1] = g_strdup ("-b");
         argv [2] = device_path;
-        argv [3] = NULL;
 
-        launch_process (argv, GTK_WINDOW (user_data));
+        launch_process (argv, 3, GTK_WINDOW (user_data));
 
-        g_free (argv [1]);
-        g_free (argv [0]);
+	for (i = 0; argv [i]; i++)
+		g_free (argv [i]);
 }
 
 static void
 check_disc_activate_cb (NautilusMenuItem *item,
                         gpointer          user_data)
 {
-        char             *argv [4];
+        int               i;
+        char             *argv [6] = { NULL, };
         char             *device_path;
 
         device_path = g_object_get_data (G_OBJECT (item), "drive_device_path");
@@ -281,78 +294,42 @@
         argv [0] = g_build_filename (BINDIR, "brasero", NULL);
         argv [1] = g_strdup ("-k");
         argv [2] = device_path;
-        argv [3] = NULL;
 
-        launch_process (argv, GTK_WINDOW (user_data));
+        launch_process (argv, 3, GTK_WINDOW (user_data));
 
-        g_free (argv [1]);
-        g_free (argv [0]);
+	for (i = 0; argv [i]; i++)
+		g_free (argv [i]);
 }
 
-static LibHalContext *
-get_hal_context (void)
+static gboolean
+volume_is_blank (GVolume *volume)
 {
-        static LibHalContext *ctx = NULL;
-        DBusError             error;
-        DBusConnection       *dbus_conn;
-
-        if (ctx == NULL) {
-                ctx = libhal_ctx_new ();
-                if (ctx == NULL) {
-                        g_warning ("Could not create a HAL context");
-                } else {
-                        dbus_error_init (&error);
-                        dbus_conn = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
-
-                        if (dbus_error_is_set (&error)) {
-                                g_warning ("Could not connect to system bus: %s", error.message);
-                                dbus_error_free (&error);
-                                return NULL;
-                        }
+        BraseroMediumMonitor *monitor;
+        BraseroMedium        *medium;
+        BraseroDrive         *drive;
+        gchar                *device;
+        gboolean              is_blank;
 
-                        libhal_ctx_set_dbus_connection (ctx, dbus_conn);
-
-                        if (! libhal_ctx_init (ctx, &error)) {
-                                g_warning ("Could not initalize the HAL context: %s",
-                                           error.message);
+        is_blank = FALSE;
 
-                                if (dbus_error_is_set (&error))
-                                        dbus_error_free (&error);
+        device = g_volume_get_identifier (volume, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE);
+        if (!device)
+                return FALSE;
 
-                                libhal_ctx_free (ctx);
-                                ctx = NULL;
-                        }
-                }
-        }
+        DEBUG_PRINT ("Got device: %s\n", device);
 
-        return ctx;
-}
+        monitor = brasero_medium_monitor_get_default ();
+        drive = brasero_medium_monitor_get_drive (monitor, device);
+        g_object_unref (monitor);
+        g_free (device);
 
-static gboolean
-volume_is_blank (GVolume *volume)
-{
-        LibHalContext *ctx;
-        char          *udi;
-        gboolean       is_blank;
-
-        ctx = get_hal_context ();
-        if (ctx == NULL) {
+        if (drive == NULL)
                 return FALSE;
-        }
-
-        is_blank = FALSE;
 
-        udi = g_volume_get_identifier (volume, G_VOLUME_IDENTIFIER_KIND_HAL_UDI);
-        DEBUG_PRINT ("Got udi: %s\n", udi);
-        if (udi != NULL) {
-                is_blank = libhal_device_get_property_bool (ctx,
-                                                            udi,
-                                                            "volume.disc.is_blank",
-                                                            NULL);
-        }
-        g_free (udi);
+        medium = brasero_drive_get_medium (drive);
+        is_blank = (brasero_medium_get_status (medium) & BRASERO_MEDIUM_BLANK);
+        g_object_unref (drive);
 
-        DEBUG_PRINT ("is-blank: %d\n", is_blank);
         return is_blank;
 }
 
@@ -377,39 +354,28 @@
 }
 
 static gboolean
-drive_is_cd_device (GDrive *drive)
+drive_is_cd_device (GDrive *gdrive)
 {
-        LibHalContext *ctx;
-        char          *udi;
-        gboolean       is_cd;
+        BraseroMediumMonitor *monitor;
+        BraseroDrive         *drive;
+        gchar                *device;
 
-        ctx = get_hal_context ();
-        if (ctx == NULL) {
+        device = g_drive_get_identifier (gdrive, G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE);
+        if (!device)
                 return FALSE;
-        }
-
-        is_cd = FALSE;
 
-        udi = g_drive_get_identifier (drive, G_VOLUME_IDENTIFIER_KIND_HAL_UDI);
-        DEBUG_PRINT ("Got udi: %s\n", udi);
+        DEBUG_PRINT ("Got device: %s\n", device);
 
-        if (udi != NULL) {
-                char *drive_type;
-                drive_type = libhal_device_get_property_string (ctx,
-                                                                udi,
-                                                                "storage.drive_type",
-                                                                NULL);
-                DEBUG_PRINT ("Got drive type: '%s'\n", drive_type);
-                if (drive_type != NULL && strcmp (drive_type, "cdrom") == 0) {
-                        is_cd = TRUE;
-                }
-                g_free (drive_type);
-        }
-        g_free (udi);
+        monitor = brasero_medium_monitor_get_default ();
+        drive = brasero_medium_monitor_get_drive (monitor, device);
+        g_object_unref (monitor);
+        g_free (device);
 
-        DEBUG_PRINT ("is-cdrom: %d\n", is_cd);
-
-        return is_cd;
+        if (drive == NULL)
+                return FALSE;
+        
+        g_object_unref (drive);
+        return TRUE;
 }
 
 static GList *
@@ -468,7 +434,7 @@
                 g_object_set_data (G_OBJECT (item), "file_info", file_info);
                 g_object_set_data (G_OBJECT (item), "window", window);
                 g_signal_connect (item, "activate",
-                                  G_CALLBACK (write_iso_activate_cb), NULL);
+                                  G_CALLBACK (write_iso_activate_cb), window);
                 items = g_list_append (items, item);
         }
 
@@ -522,7 +488,7 @@
                 g_object_set_data (G_OBJECT (item), "window", window);
                 g_object_set_data_full (G_OBJECT (item), "drive_device_path", g_strdup (device_path), g_free);
                 g_signal_connect (item, "activate",
-                                  G_CALLBACK (copy_disc_activate_cb), NULL);
+                                  G_CALLBACK (copy_disc_activate_cb), window);
                 items = g_list_append (items, item);
 
                 /* ... or if it's a rewritable medium to blank it ... */
@@ -534,7 +500,7 @@
                 g_object_set_data (G_OBJECT (item), "window", window);
                 g_object_set_data_full (G_OBJECT (item), "drive_device_path", g_strdup (device_path), g_free);
                 g_signal_connect (item, "activate",
-                                  G_CALLBACK (blank_disc_activate_cb), NULL);
+                                  G_CALLBACK (blank_disc_activate_cb), window);
                 items = g_list_append (items, item);
 
                 /* ... or verify medium. */
@@ -546,7 +512,7 @@
                 g_object_set_data (G_OBJECT (item), "window", window);
                 g_object_set_data_full (G_OBJECT (item), "drive_device_path", g_strdup (device_path), g_free);
                 g_signal_connect (item, "activate",
-                                  G_CALLBACK (check_disc_activate_cb), NULL);
+                                  G_CALLBACK (check_disc_activate_cb), window);
                 items = g_list_append (items, item);
 
                 g_free (device_path);
@@ -584,7 +550,8 @@
                                                _("Write contents to a CD or DVD disc"),
                                                "brasero");
                 g_signal_connect (item, "activate",
-                                  G_CALLBACK (write_activate_cb), window);
+                                  G_CALLBACK (write_activate_cb),
+                                  window);
                 items = g_list_append (items, item);
 
                 g_object_set (item, "sensitive", ! NAUTILUS_DISC_BURN (provider)->priv->empty, NULL);
@@ -934,25 +901,16 @@
 void
 nautilus_module_initialize (GTypeModule *module)
 {
-        nautilus_disc_burn_register_type (module);
-        bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
-        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+        brasero_media_library_start ();
 
-	/* As long as it's not a library I don't see how to do it differently */
-	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
-					   "/usr/share/brasero/icons");
-	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
-					   "/usr/local/share/brasero/icons");
+        nautilus_disc_burn_register_type (module);
 }
 
 void
 nautilus_module_shutdown (void)
 {
-        LibHalContext *ctx;
-        ctx = get_hal_context ();
-        if (ctx != NULL) {
-                libhal_ctx_free (ctx);
-        }
+        /* Don't do that in case another module would need the library */
+        //brasero_media_library_stop ();
 }
 
 void

Modified: trunk/src/brasero-app.c
==============================================================================
--- trunk/src/brasero-app.c	(original)
+++ trunk/src/brasero-app.c	Wed Jan 14 15:44:38 2009
@@ -75,7 +75,9 @@
 	gint height;
 
 	gchar *saved_contents;
+
 	guint is_maximised:1;
+	guint mainwin_running:1;
 };
 
 #define BRASERO_APP_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), BRASERO_TYPE_APP, BraseroAppPrivate))
@@ -908,7 +910,7 @@
 	BraseroAppPrivate *priv;
 
 	priv = BRASERO_APP_PRIVATE (app);
-	if (priv->mainwin)
+	if (priv->mainwin_running)
 		gtk_widget_show (GTK_WIDGET (priv->mainwin));
 }
 
@@ -919,8 +921,10 @@
 
 	priv = BRASERO_APP_PRIVATE (app);
 
-	if (!priv->mainwin) {
+	if (!priv->mainwin_running) {
 		if (priv->parent) {
+			gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), TRUE);
+			gtk_window_set_skip_pager_hint (GTK_WINDOW (window), TRUE);
 			gtk_widget_realize (GTK_WIDGET (window));
 			gtk_window_set_modal (GTK_WINDOW (window), TRUE);
 			gdk_window_set_transient_for (GTK_WIDGET (window)->window, priv->parent);
@@ -1429,6 +1433,7 @@
 
 	priv = BRASERO_APP_PRIVATE (app);
 
+	priv->mainwin_running = 1;
 	gtk_widget_show (GTK_WIDGET (priv->mainwin));
 	gtk_main ();
 }

Modified: trunk/src/brasero-burn-options.c
==============================================================================
--- trunk/src/brasero-burn-options.c	(original)
+++ trunk/src/brasero-burn-options.c	Wed Jan 14 15:44:38 2009
@@ -363,14 +363,6 @@
 }
 
 static void
-brasero_burn_options_medium_num_changed (BraseroMediumSelection *selection,
-					 BraseroBurnOptions *self)
-{
-	brasero_burn_options_update_no_medium_warning (self);
-	gtk_window_resize (GTK_WINDOW (self), 10, 10);
-}
-
-static void
 brasero_burn_options_init (BraseroBurnOptions *object)
 {
 	BraseroBurnOptionsPrivate *priv;
@@ -470,15 +462,6 @@
 					    "is-valid",
 					    G_CALLBACK (brasero_burn_options_valid_media_cb),
 					    object);
-
-	g_signal_connect (priv->selection,
-			  "medium-added",
-			  G_CALLBACK (brasero_burn_options_medium_num_changed),
-			  object);
-	g_signal_connect (priv->selection,
-			  "medium-removed",
-			  G_CALLBACK (brasero_burn_options_medium_num_changed),
-			  object);
 }
 
 static void

Modified: trunk/src/brasero-dest-selection.c
==============================================================================
--- trunk/src/brasero-dest-selection.c	(original)
+++ trunk/src/brasero-dest-selection.c	Wed Jan 14 15:44:38 2009
@@ -126,41 +126,36 @@
 }
 
 static void
-brasero_dest_selection_medium_changed (GtkComboBox *combo)
+brasero_dest_selection_medium_changed (BraseroMediumSelection *selection,
+				       BraseroMedium *medium)
 {
 	BraseroDestSelectionPrivate *priv;
-	BraseroMedium *medium;
 
-	priv = BRASERO_DEST_SELECTION_PRIVATE (combo);
+	priv = BRASERO_DEST_SELECTION_PRIVATE (selection);
 
 	if (!priv->session)
 		goto chain;
 
-	medium = brasero_medium_selection_get_active (BRASERO_MEDIUM_SELECTION (combo));
 	if (!medium) {
-	    	gtk_widget_set_sensitive (GTK_WIDGET (combo), FALSE);
+	    	gtk_widget_set_sensitive (GTK_WIDGET (selection), FALSE);
 		goto chain;
 	}
 
-	if (brasero_medium_get_drive (medium) == brasero_burn_session_get_burner (priv->session)) {
-		g_object_unref (medium);
+	if (brasero_medium_get_drive (medium) == brasero_burn_session_get_burner (priv->session))
 		goto chain;
-	}
 
 	if (priv->locked_drive && priv->locked_drive != brasero_medium_get_drive (medium)) {
-		brasero_medium_selection_set_active (BRASERO_MEDIUM_SELECTION (combo), medium);
-		g_object_unref (medium);
+		brasero_medium_selection_set_active (selection, medium);
 		goto chain;
 	}
 
 	brasero_burn_session_set_burner (priv->session, brasero_medium_get_drive (medium));
-	gtk_widget_set_sensitive (GTK_WIDGET (combo), (priv->locked_drive == NULL));
-	g_object_unref (medium);
+	gtk_widget_set_sensitive (GTK_WIDGET (selection), (priv->locked_drive == NULL));
 
 chain:
 
-	if (GTK_COMBO_BOX_CLASS (brasero_dest_selection_parent_class)->changed)
-		GTK_COMBO_BOX_CLASS (brasero_dest_selection_parent_class)->changed (combo);
+	if (BRASERO_MEDIUM_SELECTION_CLASS (brasero_dest_selection_parent_class)->medium_changed)
+		BRASERO_MEDIUM_SELECTION_CLASS (brasero_dest_selection_parent_class)->medium_changed (selection, medium);
 }
 
 static void
@@ -497,7 +492,6 @@
 brasero_dest_selection_class_init (BraseroDestSelectionClass *klass)
 {
 	GObjectClass* object_class = G_OBJECT_CLASS (klass);
-	GtkComboBoxClass *combo_box_class = GTK_COMBO_BOX_CLASS (klass);
 	BraseroMediumSelectionClass *medium_selection_class = BRASERO_MEDIUM_SELECTION_CLASS (klass);
 
 	g_type_class_add_private (klass, sizeof (BraseroDestSelectionPrivate));
@@ -506,14 +500,12 @@
 	object_class->set_property = brasero_dest_selection_set_property;
 	object_class->get_property = brasero_dest_selection_get_property;
 
-	combo_box_class->changed = brasero_dest_selection_medium_changed;
-
 	medium_selection_class->format_medium_string = brasero_dest_selection_format_medium_string;
-
+	medium_selection_class->medium_changed = brasero_dest_selection_medium_changed;
 	g_object_class_install_property (object_class,
 					 PROP_SESSION,
 					 g_param_spec_object ("session",
-							      "The session to work with",
+							      "The session",
 							      "The session to work with",
 							      BRASERO_TYPE_BURN_SESSION,
 							      G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));

Modified: trunk/src/brasero-disc.c
==============================================================================
--- trunk/src/brasero-disc.c	(original)
+++ trunk/src/brasero-disc.c	Wed Jan 14 15:44:38 2009
@@ -654,7 +654,6 @@
 				   "\t* ", _("select files in the selection pane and click the \"Add\" button"), "\n",
 				   "\t* ", _("drag files in this area from the selection pane or from the file manager"), "\n",
 				   "\t* ", _("double click on files in the selection pane"), "\n",
-
 				   "\t* ", _("copy files (from file manager for example) and paste in this area"), "\n",
 				   NULL);
 

Modified: trunk/src/brasero-project.c
==============================================================================
--- trunk/src/brasero-project.c	(original)
+++ trunk/src/brasero-project.c	Wed Jan 14 15:44:38 2009
@@ -1620,7 +1620,6 @@
 	uri = uri ? uri : project->priv->project;
 
 	/* add it to recent manager */
-	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
 	if (brasero_app_is_running (brasero_app_get_default ()))
 		brasero_project_add_to_recents (project, uri, TRUE);
 
@@ -1630,14 +1629,16 @@
 		title = g_strdup_printf (_("Brasero - %s (Data Disc)"), name);
 	else if (type == BRASERO_PROJECT_TYPE_AUDIO)
 		title = g_strdup_printf (_("Brasero - %s (Audio Disc)"), name);
-	else if (type == BRASERO_PROJECT_TYPE_AUDIO)
+	else if (type == BRASERO_PROJECT_TYPE_VIDEO)
 		title = g_strdup_printf (_("Brasero - %s (Video Disc)"), name);
 	else
 		title = NULL;
  
 	g_free (name);
 
-	gtk_window_set_title (GTK_WINDOW (toplevel), title);
+	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (project));
+	if (toplevel)
+		gtk_window_set_title (GTK_WINDOW (toplevel), title);
 	g_free (title);
 
 	/* update the menus */

Modified: trunk/src/brasero-src-selection.c
==============================================================================
--- trunk/src/brasero-src-selection.c	(original)
+++ trunk/src/brasero-src-selection.c	Wed Jan 14 15:44:38 2009
@@ -54,18 +54,17 @@
 G_DEFINE_TYPE (BraseroSrcSelection, brasero_src_selection, BRASERO_TYPE_MEDIUM_SELECTION);
 
 static void
-brasero_src_selection_medium_changed (GtkComboBox *combo_box)
+brasero_src_selection_medium_changed (BraseroMediumSelection *selection,
+				      BraseroMedium *medium)
 {
 	BraseroSrcSelectionPrivate *priv;
-	BraseroMedium *medium = NULL;
 	BraseroDrive *drive = NULL;
 
-	priv = BRASERO_SRC_SELECTION_PRIVATE (combo_box);
+	priv = BRASERO_SRC_SELECTION_PRIVATE (selection);
 
 	if (!priv->session)
 		goto chain;
 
-	medium = brasero_medium_selection_get_active (BRASERO_MEDIUM_SELECTION (combo_box));
 	drive = brasero_medium_get_drive (medium);
 
 	/* NOTE: don't check for drive == NULL to set the session input type */
@@ -86,13 +85,10 @@
 
 chain:
 
-	if (medium)
-		g_object_unref (medium);
+	gtk_widget_set_sensitive (GTK_WIDGET (selection), drive != NULL);
 
-	gtk_widget_set_sensitive (GTK_WIDGET (combo_box), drive != NULL);
-
-	if (GTK_COMBO_BOX_CLASS (brasero_src_selection_parent_class)->changed)
-		GTK_COMBO_BOX_CLASS (brasero_src_selection_parent_class)->changed (combo_box);
+	if (BRASERO_MEDIUM_SELECTION_CLASS (brasero_src_selection_parent_class)->medium_changed)
+		BRASERO_MEDIUM_SELECTION_CLASS (brasero_src_selection_parent_class)->medium_changed (selection, medium);
 }
 
 GtkWidget *
@@ -146,6 +142,9 @@
 
 	switch (property_id) {
 	case PROP_SESSION:
+	{
+		BraseroMedium *medium;
+
 		session = g_value_get_object (value);
 
 		priv->session = session;
@@ -154,8 +153,10 @@
 		if (priv->track)
 			brasero_track_unref (priv->track);
 
-		brasero_src_selection_medium_changed (GTK_COMBO_BOX (object));
+		medium = brasero_burn_session_get_src_medium (session);
+		brasero_src_selection_medium_changed (BRASERO_MEDIUM_SELECTION (object), medium);
 		break;
+	}
 
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -186,7 +187,7 @@
 brasero_src_selection_class_init (BraseroSrcSelectionClass *klass)
 {
 	GObjectClass* object_class = G_OBJECT_CLASS (klass);
-	GtkComboBoxClass *combo_box_class = GTK_COMBO_BOX_CLASS (klass);
+	BraseroMediumSelectionClass *medium_selection_class = BRASERO_MEDIUM_SELECTION_CLASS (klass);
 
 	g_type_class_add_private (klass, sizeof (BraseroSrcSelectionPrivate));
 
@@ -194,7 +195,7 @@
 	object_class->set_property = brasero_src_selection_set_property;
 	object_class->get_property = brasero_src_selection_get_property;
 
-	combo_box_class->changed = brasero_src_selection_medium_changed;
+	medium_selection_class->medium_changed = brasero_src_selection_medium_changed;
 
 	g_object_class_install_property (object_class,
 					 PROP_SESSION,

Modified: trunk/src/brasero-tool-dialog.c
==============================================================================
--- trunk/src/brasero-tool-dialog.c	(original)
+++ trunk/src/brasero-tool-dialog.c	Wed Jan 14 15:44:38 2009
@@ -538,7 +538,7 @@
 				      GTK_RESPONSE_CANCEL);
 
 	g_signal_connect (G_OBJECT (obj->priv->selector),
-			  "changed",
+			  "medium-changed",
 			  G_CALLBACK (brasero_tool_dialog_drive_changed_cb),
 			  obj);
 

Modified: trunk/src/burn-plugin.c
==============================================================================
--- trunk/src/burn-plugin.c	(original)
+++ trunk/src/burn-plugin.c	Wed Jan 14 15:44:38 2009
@@ -950,13 +950,14 @@
 	priv = BRASERO_PLUGIN_PRIVATE (self);
 
 	value = gconf_entry_get_value (entry);
-	if (value->type != GCONF_VALUE_INT)
+	if (!value)
+		priv->priority = 0;
+	else if (value->type != GCONF_VALUE_INT)
 		return;
-
-	self = BRASERO_PLUGIN (data);
+	else
+		priv->priority = gconf_value_get_int (value);
 
 	is_active = brasero_plugin_get_active (self);
-	priv->priority = gconf_value_get_int (value);
 
 	g_object_notify (G_OBJECT (self), "priority");
 	if (is_active != brasero_plugin_get_active (self))

Modified: trunk/src/burn-session.c
==============================================================================
--- trunk/src/burn-session.c	(original)
+++ trunk/src/burn-session.c	Wed Jan 14 15:44:38 2009
@@ -327,14 +327,19 @@
 				     BraseroTrackType *type)
 {
 	BraseroBurnSessionPrivate *priv;
+	BraseroTrackType input = { 0, };
 
 	g_return_if_fail (BRASERO_IS_BURN_SESSION (self));
 	g_return_if_fail (type != NULL);
 
 	priv = BRASERO_BURN_SESSION_PRIVATE (self);
 
+	brasero_burn_session_get_input_type (self, &input);
 	memcpy (&priv->input, type, sizeof (BraseroTrackType));
 
+	if (brasero_track_type_equal (&input, type))
+		return;
+
 	if (!priv->tracks)
 		g_signal_emit (self,
 			       brasero_burn_session_signals [INPUT_CHANGED_SIGNAL],

Modified: trunk/src/plugins/libburnia/burn-libisofs.c
==============================================================================
--- trunk/src/plugins/libburnia/burn-libisofs.c	(original)
+++ trunk/src/plugins/libburnia/burn-libisofs.c	Wed Jan 14 15:44:38 2009
@@ -799,7 +799,7 @@
 		if (iso_image_create_burn_source (image, opts, &priv->libburn_src) >= 0) {
 			size = priv->libburn_src->get_size (priv->libburn_src);
 			brasero_job_set_output_size_for_current_track (BRASERO_JOB (self),
-								       BRASERO_SIZE_TO_SECTORS (size, 2048),
+								       BRASERO_BYTES_TO_SECTORS (size, 2048),
 								       size);
 		}
 	}



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