diff -up evolution-3.12.11/e-util/e-table-click-to-add.c.crash-in-ect-dispose evolution-3.12.11/e-util/e-table-click-to-add.c
--- evolution-3.12.11/e-util/e-table-click-to-add.c.crash-in-ect-dispose 2014-10-09 11:06:21.000000000 +0200
+++ evolution-3.12.11/e-util/e-table-click-to-add.c 2015-08-12 15:00:05.523831117 +0200
@@ -397,6 +397,15 @@ finish_editing (ETableClickToAdd *etcta)
g_object_run_dispose (G_OBJECT (etcta->row));
etcta->row = NULL;
+ if (etcta->text) {
+ g_object_run_dispose (G_OBJECT (etcta->text));
+ etcta->text = NULL;
+ }
+ if (etcta->rect) {
+ g_object_run_dispose (G_OBJECT (etcta->rect));
+ etcta->rect = NULL;
+ }
+
one = e_table_one_new (etcta->model);
etcta_add_one (etcta, one);
g_object_unref (one);
diff -up evolution-3.12.11/e-util/gal-a11y-e-table-item.c.crash-in-ect-dispose evolution-3.12.11/e-util/gal-a11y-e-table-item.c
--- evolution-3.12.11/e-util/gal-a11y-e-table-item.c.crash-in-ect-dispose 2014-10-20 15:28:40.000000000 +0200
+++ evolution-3.12.11/e-util/gal-a11y-e-table-item.c 2015-08-12 15:01:16.629828006 +0200
@@ -86,17 +86,39 @@ free_columns (ETableCol **columns)
}
static void
+table_item_cell_gone_cb (gpointer user_data,
+ GObject *gone_cell)
+{
+ GalA11yETableItem *a11y;
+ GObject *old_cell;
+
+ a11y = GAL_A11Y_E_TABLE_ITEM (user_data);
+
+ old_cell = g_object_get_data (G_OBJECT (a11y), "gail-focus-object");
+ if (old_cell == gone_cell)
+ g_object_set_data (G_OBJECT (a11y), "gail-focus-object", NULL);
+}
+
+static void
item_finalized (gpointer user_data,
GObject *gone_item)
{
GalA11yETableItem *a11y;
GalA11yETableItemPrivate *priv;
+ GObject *old_cell;
a11y = GAL_A11Y_E_TABLE_ITEM (user_data);
priv = GET_PRIVATE (a11y);
priv->item = NULL;
+ old_cell = g_object_get_data (G_OBJECT (a11y), "gail-focus-object");
+ if (old_cell) {
+ g_object_weak_unref (G_OBJECT (old_cell), table_item_cell_gone_cb, a11y);
+ g_object_unref (old_cell);
+ }
+ g_object_set_data (G_OBJECT (a11y), "gail-focus-object", NULL);
+
atk_state_set_add_state (priv->state_set, ATK_STATE_DEFUNCT);
atk_object_notify_state_change (ATK_OBJECT (a11y), ATK_STATE_DEFUNCT, TRUE);
@@ -211,8 +233,10 @@ eti_a11y_reset_focus_object (GalA11yETab
if (old_cell && GAL_A11Y_IS_E_CELL (old_cell))
gal_a11y_e_cell_remove_state (
GAL_A11Y_E_CELL (old_cell), ATK_STATE_FOCUSED, FALSE);
- if (old_cell)
+ if (old_cell) {
+ g_object_weak_unref (G_OBJECT (old_cell), table_item_cell_gone_cb, a11y);
g_object_unref (old_cell);
+ }
cell = eti_ref_at (ATK_TABLE (a11y), view_row, view_col);
@@ -220,6 +244,7 @@ eti_a11y_reset_focus_object (GalA11yETab
g_object_set_data (G_OBJECT (a11y), "gail-focus-object", cell);
gal_a11y_e_cell_add_state (
GAL_A11Y_E_CELL (cell), ATK_STATE_FOCUSED, FALSE);
+ g_object_weak_ref (G_OBJECT (cell), table_item_cell_gone_cb, a11y);
} else
g_object_set_data (G_OBJECT (a11y), "gail-focus-object", NULL);
@@ -359,23 +384,6 @@ eti_ref_accessible_at_point (AtkComponen
}
}
-static void
-cell_destroyed (gpointer data)
-{
- GalA11yECell * cell;
-
- g_return_if_fail (GAL_A11Y_IS_E_CELL (data));
- cell = GAL_A11Y_E_CELL (data);
-
- g_return_if_fail (cell->item && G_IS_OBJECT (cell->item));
-
- if (cell->item) {
- g_object_unref (cell->item);
- cell->item = NULL;
- }
-
-}
-
/* atk table */
static AtkObject *
eti_ref_at (AtkTable *table,
@@ -409,10 +417,6 @@ eti_ref_at (AtkTable *table,
column,
row);
if (ATK_IS_OBJECT (ret)) {
- g_object_weak_ref (
- G_OBJECT (ret),
- (GWeakNotify) cell_destroyed,
- ret);
/* if current cell is focused, add FOCUSED state */
if (e_selection_model_cursor_row (item->selection) ==
GAL_A11Y_E_CELL (ret)->row &&