aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--my-evolution/ChangeLog6
-rw-r--r--my-evolution/e-summary-shown.c48
2 files changed, 45 insertions, 9 deletions
diff --git a/my-evolution/ChangeLog b/my-evolution/ChangeLog
index b88e4b9913..0210e822b7 100644
--- a/my-evolution/ChangeLog
+++ b/my-evolution/ChangeLog
@@ -1,3 +1,9 @@
+2002-06-05 Christopher James Lahey <clahey@ximian.com>
+
+ * e-summary-shown.c (maybe_move_to_shown, add_clicked,
+ remove_from_shown, remove_clicked): Avoid reentrancy during
+ e_tree_selection_model_foreach. Fixes Ximian bug #24987.
+
2002-05-23 JP Rosevear <jpr@ximian.com>
* GNOME_Evolution_Summary.oaf.in.in: correct typo
diff --git a/my-evolution/e-summary-shown.c b/my-evolution/e-summary-shown.c
index 2b6d6ea9e5..1cbe382cfb 100644
--- a/my-evolution/e-summary-shown.c
+++ b/my-evolution/e-summary-shown.c
@@ -242,7 +242,7 @@ find_entry_from_location (ESummaryShown *shown,
if (entry->location == NULL) {
continue;
}
-
+
if (strcmp ((char *) entry->location, location) == 0) {
return entry;
}
@@ -327,7 +327,9 @@ static void
maybe_move_to_shown (ETreePath path,
gpointer closure)
{
- ESummaryShown *shown = closure;
+ gpointer *pair = closure;
+ ESummaryShown *shown = pair[0];
+ GList **list = pair[1];
ESummaryShownModelEntry *entry, *new_entry;
entry = g_hash_table_lookup (shown->all_model, path);
@@ -349,9 +351,8 @@ maybe_move_to_shown (ETreePath path,
new_entry->showable = entry->showable;
new_entry->ref_count = 0;
- e_summary_shown_add_node (shown, FALSE, new_entry, NULL, TRUE, NULL);
- gtk_signal_emit (GTK_OBJECT (shown), shown_signals[ITEM_CHANGED]);
g_print ("Added %s\n", entry->name);
+ *list = g_list_prepend (*list, new_entry);
}
static void
@@ -360,26 +361,40 @@ add_clicked (GtkWidget *button,
{
ESelectionModel *esm;
ETree *et;
+ gpointer pair[2];
+ GList *list = NULL;
+ GList *iterator;
et = e_tree_scrolled_get_tree (E_TREE_SCROLLED (shown->priv->all->etable));
esm = e_tree_get_selection_model (et);
+ pair[0] = shown;
+ pair[1] = &list;
e_tree_selection_model_foreach (E_TREE_SELECTION_MODEL (esm),
- maybe_move_to_shown, shown);
+ maybe_move_to_shown, pair);
+
+ for (iterator = list; iterator; iterator = iterator->next) {
+ ESummaryShownModelEntry *new_entry = iterator->data;
+ e_summary_shown_add_node (shown, FALSE, new_entry, NULL, TRUE, NULL);
+ }
+
+ g_list_free (list);
+ gtk_signal_emit (GTK_OBJECT (shown), shown_signals[ITEM_CHANGED]);
}
static void
remove_from_shown (ETreePath path,
gpointer closure)
{
- ESummaryShown *shown = closure;
+ gpointer *pair = closure;
+ ESummaryShown *shown = pair[0];
+ GList **list = pair[1];
ESummaryShownModelEntry *entry;
entry = g_hash_table_lookup (shown->shown_model, path);
g_return_if_fail (entry != NULL);
- e_summary_shown_remove_node (shown, FALSE, entry);
- gtk_signal_emit (GTK_OBJECT (shown), shown_signals[ITEM_CHANGED]);
+ *list = g_list_prepend (*list, entry);
}
static void
@@ -388,12 +403,27 @@ remove_clicked (GtkWidget *button,
{
ESelectionModel *esm;
ETree *et;
+ gpointer pair[2];
+ GList *list = NULL;
+ GList *iterator;
et = e_tree_scrolled_get_tree (E_TREE_SCROLLED (shown->priv->shown->etable));
esm = e_tree_get_selection_model (et);
+ pair[0] = shown;
+ pair[1] = &list;
e_tree_selection_model_foreach (E_TREE_SELECTION_MODEL (esm),
- remove_from_shown, shown);
+ remove_from_shown, pair);
+
+ list = g_list_reverse (list);
+
+ for (iterator = list; iterator; iterator = iterator->next) {
+ ESummaryShownModelEntry *entry = iterator->data;
+ e_summary_shown_remove_node (shown, FALSE, entry);
+ }
+ g_list_free (list);
+
+ gtk_signal_emit (GTK_OBJECT (shown), shown_signals[ITEM_CHANGED]);
}
static TableData *