Author: pollux
Date: 2006-08-11 22:42:33 +0000 (Fri, 11 Aug 2006)
New Revision: 22719
Modified:
xfburn/trunk/NEWS
xfburn/trunk/xfburn/xfburn-data-composition.c
Log:
Fix segfault when removing a file and one of its parent directory together
Modified: xfburn/trunk/NEWS
===================================================================
--- xfburn/trunk/NEWS 2006-08-11 19:42:35 UTC (rev 22718)
+++ xfburn/trunk/NEWS 2006-08-11 22:42:33 UTC (rev 22719)
@@ -1,3 +1,8 @@
+xfburn 0.x
+==========
+
+- Fix segfault when removing a file and one of its parent directory together
+
xfburn 0.2.0beta
================
Modified: xfburn/trunk/xfburn/xfburn-data-composition.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-data-composition.c 2006-08-11 19:42:35 UTC
(rev 22718)
+++ xfburn/trunk/xfburn/xfburn-data-composition.c 2006-08-11 22:42:33 UTC
(rev 22719)
@@ -716,70 +716,82 @@
}
static void
+remove_row_reference (GtkTreeRowReference *reference,
XfburnDataCompositionPrivate *priv)
+{
+ GtkTreePath *path = NULL;
+ GtkTreeModel *model;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->content));
+
+ path = gtk_tree_row_reference_get_path (reference);
+ if (path) {
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter (model, &iter, path)) {
+ GtkTreeIter parent, iter_temp;
+ guint64 size = 0;
+
+ gtk_tree_model_get (model, &iter, DATA_COMPOSITION_COLUMN_SIZE, &size,
-1);
+ xfburn_data_disc_usage_sub_size (XFBURN_DATA_DISC_USAGE
(priv->disc_usage), size);
+
+ iter_temp = iter;
+ while (gtk_tree_model_iter_parent (model, &parent, &iter_temp)) {
+ guint64 old_size;
+ gchar *humansize = NULL;
+
+ /* updates parent directories size */
+ gtk_tree_model_get (model, &parent, DATA_COMPOSITION_COLUMN_SIZE,
&old_size, -1);
+
+ humansize = xfburn_humanreadable_filesize (old_size - size);
+ gtk_tree_store_set (GTK_TREE_STORE (model), &parent,
+ DATA_COMPOSITION_COLUMN_HUMANSIZE, humansize,
+ DATA_COMPOSITION_COLUMN_SIZE, old_size - size, -1);
+
+ iter_temp = parent;
+
+ g_free (humansize);
+ }
+
+ gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
+ }
+
+ gtk_tree_path_free (path);
+ }
+
+ gtk_tree_row_reference_free (reference);
+}
+
+static void
action_remove_selection (GtkAction * action, XfburnDataComposition * dc)
{
XfburnDataCompositionPrivate *priv = XFBURN_DATA_COMPOSITION_GET_PRIVATE
(dc);
GtkTreeSelection *selection;
GtkTreeModel *model;
- GList *list_paths = NULL, *list_iters = NULL, *el;
-
+ GList *list_paths = NULL, *el;
+ GList *references = NULL;
+
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->content));
list_paths = gtk_tree_selection_get_selected_rows (selection, &model);
- /* recompute new disc usage */
el = list_paths;
while (el) {
GtkTreePath *path = NULL;
- GtkTreeIter *iter = NULL;
- GtkTreeIter parent, iter_temp;
- guint64 size = 0;
-
+ GtkTreeRowReference *reference = NULL;
+
path = (GtkTreePath *) el->data;
- iter = g_new0 (GtkTreeIter, 1);
-
- gtk_tree_model_get_iter (model, iter, path);
- list_iters = g_list_append (list_iters, iter);
-
- gtk_tree_model_get (model, iter, DATA_COMPOSITION_COLUMN_SIZE, &size, -1);
- xfburn_data_disc_usage_sub_size (XFBURN_DATA_DISC_USAGE
(priv->disc_usage), size);
-
- iter_temp = *iter;
- while (gtk_tree_model_iter_parent (model, &parent, &iter_temp)) {
- guint64 old_size;
- gchar *humansize = NULL;
-
- /* updates parent directories size */
- gtk_tree_model_get (model, &parent, DATA_COMPOSITION_COLUMN_SIZE,
&old_size, -1);
-
- humansize = xfburn_humanreadable_filesize (old_size - size);
- gtk_tree_store_set (GTK_TREE_STORE (model), &parent,
- DATA_COMPOSITION_COLUMN_HUMANSIZE, humansize,
- DATA_COMPOSITION_COLUMN_SIZE, old_size - size, -1);
-
- iter_temp = parent;
-
- g_free (humansize);
- }
-
+ reference = gtk_tree_row_reference_new (model, path);
gtk_tree_path_free (path);
+
+ if (reference)
+ references = g_list_prepend (references, reference);
+
el = g_list_next (el);
- }
+ }
g_list_free (list_paths);
-
- /* remove rows from the list */
- el = list_iters;
- while (el) {
- GtkTreeIter *iter = NULL;
-
- iter = (GtkTreeIter *) el->data;
- gtk_tree_store_remove (GTK_TREE_STORE (model), iter);
-
- g_free (iter);
- el = g_list_next (el);
- }
- g_list_free (list_iters);
-
+
+ g_list_foreach (references, (GFunc) remove_row_reference, priv);
+ g_list_free (references);
}
static void
@@ -905,7 +917,7 @@
reference = gtk_tree_row_reference_new (model, temp);
gtk_tree_path_free (temp);
- references = g_list_append (references, reference);
+ references = g_list_prepend (references, reference);
row = g_list_next (row);
}
@@ -1266,6 +1278,12 @@
reference = (GtkTreeRowReference *) row->data;
path_src = gtk_tree_row_reference_get_path (reference);
+ if (!path_src) {
+ gtk_tree_row_reference_free (reference);
+
+ row = g_list_next (row);
+ continue;
+ }
if (path_where_insert && (position == GTK_TREE_VIEW_DROP_AFTER ||
position == GTK_TREE_VIEW_DROP_BEFORE)
&& (gtk_tree_path_get_depth (path_where_insert) ==
gtk_tree_path_get_depth (path_src))) {
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits