File evolution-bsc930240-a11y-3-16-fixes.patch of Package evolution

From: Mike Gorse <mgorse@suse.com>
Date: Tue May 19 16:45:32 CDT 2015
Subject: [PATCH] Evolution a11y fixes

Fixes for bgo#741080, bgo#741083, and bgo#743404
Rebased from 3.16
--
diff -urN evolution-3.10.4.orig/addressbook/gui/widgets/ea-addressbook.c evolution-3.10.4/addressbook/gui/widgets/ea-addressbook.c
--- evolution-3.10.4.orig/addressbook/gui/widgets/ea-addressbook.c	2013-12-07 08:14:56.000000000 -0600
+++ evolution-3.10.4/addressbook/gui/widgets/ea-addressbook.c	2015-05-08 17:58:01.740564516 -0500
@@ -80,9 +80,10 @@
 		GnomeCanvasItem *item = GNOME_CANVAS_ITEM (object);
 		ea_event = atk_gobject_accessible_for_object (object);
 		if (event->type == GDK_FOCUS_CHANGE) {
-			if ((event->focus_change.in) &&
-			    (E_IS_MINICARD (item->canvas->focused_item)))
-				atk_focus_tracker_notify (ea_event);
+			if (E_IS_MINICARD (item->canvas->focused_item))
+				atk_object_notify_state_change (ea_event,
+					ATK_STATE_FOCUSED,
+					event->focus_change.in);
 		}
 	}
 
diff -urN evolution-3.10.4.orig/calendar/gui/ea-calendar.c evolution-3.10.4/calendar/gui/ea-calendar.c
--- evolution-3.10.4.orig/calendar/gui/ea-calendar.c	2015-05-08 17:57:43.811565688 -0500
+++ evolution-3.10.4/calendar/gui/ea-calendar.c	2015-05-08 17:58:01.741564516 -0500
@@ -136,15 +136,12 @@
 
 		canvas_item = GNOME_CANVAS_ITEM (object);
 		if (event->type == GDK_FOCUS_CHANGE) {
-			if (event->focus_change.in) {
-				ea_event =
-					ea_calendar_helpers_get_accessible_for (canvas_item);
-				if (!ea_event)
-					/* not canvas item we want */
-					return TRUE;
-
-			}
-			atk_focus_tracker_notify (ea_event);
+			ea_event =
+				ea_calendar_helpers_get_accessible_for (canvas_item);
+			if (!ea_event)
+				/* not canvas item we want */
+				return TRUE;
+			atk_object_notify_state_change (ea_event, ATK_STATE_FOCUSED, event->focus_change.in);
 		}
 	}
 	else if (E_IS_DAY_VIEW (object)) {
@@ -158,17 +155,12 @@
 	}
 	else if (E_IS_DAY_VIEW_MAIN_ITEM (object)) {
 		if (event->type == GDK_FOCUS_CHANGE) {
-			if (event->focus_change.in) {
-				/* we should emit focus on main item */
-				ea_event = atk_gobject_accessible_for_object (object);
-			}
-			else
-				/* focus out */
-				ea_event = NULL;
+			/* we should emit focus on main item */
+			ea_event = atk_gobject_accessible_for_object (object);
 #ifdef ACC_DEBUG
 			printf ("EvoAcc: focus notify on day main item %p\n", (gpointer) object);
 #endif
-			atk_focus_tracker_notify (ea_event);
+			atk_object_notify_state_change (ea_event, ATK_STATE_FOCUSED, event->focus_change.in);
 		}
 	} else if (E_IS_WEEK_VIEW (object)) {
 		EWeekView *week_view = E_WEEK_VIEW (object);
@@ -181,14 +173,9 @@
 	}
 	else if (E_IS_WEEK_VIEW_MAIN_ITEM (object)) {
 		if (event->type == GDK_FOCUS_CHANGE) {
-			if (event->focus_change.in) {
-				/* we should emit focus on main item */
-				ea_event = atk_gobject_accessible_for_object (object);
-			}
-			else
-				/* focus out */
-				ea_event = NULL;
-			atk_focus_tracker_notify (ea_event);
+			/* we should emit focus on main item */
+			ea_event = atk_gobject_accessible_for_object (object);
+			atk_object_notify_state_change (ea_event, ATK_STATE_FOCUSED, event->focus_change.in);
 		}
 	}
 	return TRUE;
diff -urN evolution-3.10.4.orig/calendar/gui/ea-day-view-main-item.c evolution-3.10.4/calendar/gui/ea-day-view-main-item.c
--- evolution-3.10.4.orig/calendar/gui/ea-day-view-main-item.c	2015-05-08 17:57:43.815565688 -0500
+++ evolution-3.10.4/calendar/gui/ea-day-view-main-item.c	2015-05-08 17:58:01.742564516 -0500
@@ -423,7 +423,6 @@
 			item_cell);
 		g_signal_emit_by_name (data, "selection_changed");
 
-		atk_focus_tracker_notify (item_cell);
 		g_object_unref (item_cell);
 	}
 
@@ -775,8 +774,9 @@
 		ATK_OBJECT (ea_main_item),
 		index);
 	if (child)
-		atk_component_get_size (
-			ATK_COMPONENT (child), &width, &height);
+		atk_component_get_extents (
+			ATK_COMPONENT (child), NULL, NULL, &width, &height,
+			ATK_XY_SCREEN);
 
 	return width;
 }
@@ -798,8 +798,9 @@
 		ATK_OBJECT (ea_main_item),
 		index);
 	if (child)
-		atk_component_get_size (
-			ATK_COMPONENT (child), &width, &height);
+		atk_component_get_extents (
+			ATK_COMPONENT (child), NULL, NULL, &width, &height,
+			ATK_XY_SCREEN);
 
 	return height;
 }
diff -urN evolution-3.10.4.orig/calendar/gui/ea-week-view-main-item.c evolution-3.10.4/calendar/gui/ea-week-view-main-item.c
--- evolution-3.10.4.orig/calendar/gui/ea-week-view-main-item.c	2015-05-08 17:57:43.817565688 -0500
+++ evolution-3.10.4/calendar/gui/ea-week-view-main-item.c	2015-05-08 17:58:01.742564516 -0500
@@ -450,7 +450,6 @@
 			"active-descendant-changed",
 			item_cell);
 		g_signal_emit_by_name (data, "selection_changed");
-		atk_focus_tracker_notify (item_cell);
 		g_object_unref (item_cell);
 	}
 }
@@ -766,8 +765,9 @@
 	child = atk_object_ref_accessible_child (
 		ATK_OBJECT (ea_main_item), index);
 	if (child)
-		atk_component_get_size (
-			ATK_COMPONENT (child), &width, &height);
+		atk_component_get_extents (
+			ATK_COMPONENT (child), NULL, NULL, &width, &height,
+			ATK_XY_SCREEN);
 
 	return width;
 }
@@ -787,8 +787,9 @@
 	child = atk_object_ref_accessible_child (
 		ATK_OBJECT (ea_main_item), index);
 	if (child)
-		atk_component_get_size (
-			ATK_COMPONENT (child), &width, &height);
+		atk_component_get_extents (
+			ATK_COMPONENT (child), NULL, NULL, &width, &height,
+			ATK_XY_SCREEN);
 
 	return height;
 }
diff -urN evolution-3.10.4.orig/e-util/ea-calendar-cell.c evolution-3.10.4/e-util/ea-calendar-cell.c
--- evolution-3.10.4.orig/e-util/ea-calendar-cell.c	2015-05-08 17:57:43.836565686 -0500
+++ evolution-3.10.4/e-util/ea-calendar-cell.c	2015-05-08 17:58:01.742564516 -0500
@@ -233,20 +233,13 @@
 		return NULL;
 
 	if (!accessible->name) {
-		AtkObject *atk_obj;
-		EaCalendarItem *ea_calitem;
 		ECalendarCell *cell;
-		gint day_index;
 		gint year, month, day;
 		gchar buffer[128];
 
 		cell = E_CALENDAR_CELL (g_obj);
-		atk_obj = ea_calendar_cell_get_parent (accessible);
-		ea_calitem = EA_CALENDAR_ITEM (atk_obj);
-		day_index = atk_table_get_index_at (
-			ATK_TABLE (ea_calitem),
-			cell->row, cell->column);
-		e_calendar_item_get_date_for_offset (cell->calitem, day_index,
+		e_calendar_item_get_date_for_cell (cell->calitem, cell->row,
+						     cell->column,
 						     &year, &month, &day);
 
 		g_snprintf (buffer, 128, "%d-%d-%d", year, month + 1, day);
@@ -336,7 +329,6 @@
 	ECalendarCell *cell;
 	ECalendarItem *calitem;
 	EaCalendarItem *ea_calitem;
-	gint day_index;
 	gint year, month, day;
 	gint canvas_x, canvas_y, canvas_width, canvas_height;
 
@@ -353,10 +345,7 @@
 	calitem = cell->calitem;
 	atk_obj = atk_gobject_accessible_for_object (G_OBJECT (calitem));
 	ea_calitem = EA_CALENDAR_ITEM (atk_obj);
-	day_index = atk_table_get_index_at (
-		ATK_TABLE (ea_calitem),
-		cell->row, cell->column);
-	e_calendar_item_get_date_for_offset (calitem, day_index,
+	e_calendar_item_get_date_for_cell (calitem, cell->row, cell->column,
 					     &year, &month, &day);
 
 	if (!e_calendar_item_get_day_extents (calitem,
diff -urN evolution-3.10.4.orig/e-util/ea-calendar-item.c evolution-3.10.4/e-util/ea-calendar-item.c
--- evolution-3.10.4.orig/e-util/ea-calendar-item.c	2013-12-07 08:14:35.000000000 -0600
+++ evolution-3.10.4/e-util/ea-calendar-item.c	2015-05-08 17:58:01.743564516 -0500
@@ -1144,7 +1144,7 @@
 
 	calitem = E_CALENDAR_ITEM (g_obj);
 
-	index = atk_table_get_index_at (ATK_TABLE (ea_calitem), row, 0);
+	index = table_interface_get_index_at (ATK_TABLE (ea_calitem), row, 0);
 	if (!e_calendar_item_get_date_for_offset (calitem, index,
 						  &year, &month, &day))
 		return FALSE;
@@ -1298,6 +1298,19 @@
 	return TRUE;
 }
 
+gboolean
+e_calendar_item_get_date_for_cell (ECalendarItem *calitem,
+                                     gint row,
+                                     gint column,
+                                     gint *year,
+                                     gint *month,
+                                     gint *day)
+{
+	gint index = table_interface_get_index_at (ATK_TABLE (calitem), row, column);
+
+	return e_calendar_item_get_date_for_offset (calitem, index, year, month, day);
+}
+
 /* the arg month is from 0 to 11 */
 static gboolean
 e_calendar_item_get_offset_for_date (ECalendarItem *calitem,
diff -urN evolution-3.10.4.orig/e-util/ea-calendar-item.h evolution-3.10.4/e-util/ea-calendar-item.h
--- evolution-3.10.4.orig/e-util/ea-calendar-item.h	2013-12-07 08:14:45.000000000 -0600
+++ evolution-3.10.4/e-util/ea-calendar-item.h	2015-05-08 17:58:01.743564516 -0500
@@ -63,6 +63,11 @@
 					      gint day_offset,
 					      gint *year, gint *month,
 					      gint *day);
+gboolean e_calendar_item_get_date_for_cell (ECalendarItem *calitem,
+					      gint row,
+					      gint column,
+					      gint *year, gint *month,
+					      gint *day);
 gint e_calendar_item_get_n_days_from_week_start (ECalendarItem *calitem,
 						 gint year, gint month);
 
diff -urN evolution-3.10.4.orig/e-util/e-cell-text.c evolution-3.10.4/e-util/e-cell-text.c
--- evolution-3.10.4.orig/e-util/e-cell-text.c	2013-12-07 08:14:40.000000000 -0600
+++ evolution-3.10.4/e-util/e-cell-text.c	2015-05-08 17:58:03.567564397 -0500
@@ -48,6 +48,8 @@
 
 #include <libgnomecanvas/libgnomecanvas.h>
 
+#include "gal-a11y-e-cell-registry.h"
+#include "gal-a11y-e-cell-text.h"
 #include "e-canvas.h"
 #include "e-cell-text.h"
 #include "e-table-item.h"
@@ -1703,6 +1705,8 @@
 			use_ellipsis_default = FALSE;
 		}
 	}
+
+	gal_a11y_e_cell_registry_add_cell_type (NULL, E_TYPE_CELL_TEXT, gal_a11y_e_cell_text_new);
 }
 
 /* IM Context Callbacks */
diff -urN evolution-3.10.4.orig/e-util/e-cell-toggle.c evolution-3.10.4/e-util/e-cell-toggle.c
--- evolution-3.10.4.orig/e-util/e-cell-toggle.c	2013-12-07 08:14:37.000000000 -0600
+++ evolution-3.10.4/e-util/e-cell-toggle.c	2015-05-08 17:58:06.176564227 -0500
@@ -44,6 +44,7 @@
 
 struct _ECellTogglePrivate {
 	gchar **icon_names;
+	gchar **icon_descriptions;
 	guint n_icon_names;
 
 	GdkPixbuf *empty;
@@ -128,6 +129,12 @@
 		g_free (priv->icon_names[ii]);
 	g_free (priv->icon_names);
 
+	if (priv->icon_descriptions) {
+		for (ii = 0; ii < priv->n_icon_names; ii++)
+			g_free (priv->icon_descriptions[ii]);
+		g_free (priv->icon_descriptions);
+	}
+
 	g_ptr_array_free (priv->pixbufs, TRUE);
 
 	/* Chain up to parent's finalize() method. */
@@ -467,3 +474,36 @@
 
 	return cell_toggle->priv->pixbufs;
 }
+
+void
+e_cell_toggle_set_icon_descriptions (ECellToggle *cell_toggle,
+				     const gchar **descriptions,
+				     gint n_descriptions)
+{
+	gint ii;
+	gint n_icon_names;
+
+	g_return_if_fail (E_IS_CELL_TOGGLE (cell_toggle));
+	g_return_if_fail (cell_toggle->priv->icon_descriptions == NULL);
+	g_return_if_fail (n_descriptions == cell_toggle->priv->n_icon_names);
+
+	n_icon_names = cell_toggle->priv->n_icon_names;
+
+	cell_toggle->priv->icon_descriptions = g_new (gchar *, n_icon_names);
+
+	for (ii = 0; ii < n_icon_names; ii++)
+		cell_toggle->priv->icon_descriptions[ii] = g_strdup (descriptions[ii]);
+}
+
+const gchar *
+e_cell_toggle_get_icon_description (ECellToggle *cell_toggle,
+				    gint n)
+{
+	if (n < 0 || n >= cell_toggle->priv->n_icon_names)
+		return NULL;
+
+	if (!cell_toggle->priv->icon_descriptions)
+		return NULL;
+
+	return cell_toggle->priv->icon_descriptions[n];
+}
diff -urN evolution-3.10.4.orig/e-util/e-cell-toggle.h evolution-3.10.4/e-util/e-cell-toggle.h
--- evolution-3.10.4.orig/e-util/e-cell-toggle.h	2013-12-07 08:14:50.000000000 -0600
+++ evolution-3.10.4/e-util/e-cell-toggle.h	2015-05-08 17:58:06.176564227 -0500
@@ -77,6 +77,12 @@
 						 guint n_icon_names);
 GPtrArray *	e_cell_toggle_get_pixbufs	(ECellToggle *cell_toggle);
 
+void		e_cell_toggle_set_icon_descriptions	(ECellToggle *cell_toggle,
+							 const gchar **descriptions,
+							 gint n_descriptions);
+
+const gchar *	e_cell_toggle_get_icon_description	(ECellToggle *cell_toggle,
+							 gint n);
 G_END_DECLS
 
 #endif /* E_CELL_TOGGLE_H */
diff -urN evolution-3.10.4.orig/e-util/gal-a11y-e-cell.c evolution-3.10.4/e-util/gal-a11y-e-cell.c
--- evolution-3.10.4.orig/e-util/gal-a11y-e-cell.c	2013-12-07 08:14:40.000000000 -0600
+++ evolution-3.10.4/e-util/gal-a11y-e-cell.c	2015-05-08 17:58:01.743564516 -0500
@@ -185,9 +185,9 @@
 			width, height);
 	}
 
-	atk_component_get_position (
+	atk_component_get_extents (
 		ATK_COMPONENT (a11y->parent),
-		x, y, coord_type);
+		x, y, NULL, NULL, coord_type);
 	if (x && *x != G_MININT)
 		*x += xval;
 	if (y && *y != G_MININT)
diff -urN evolution-3.10.4.orig/e-util/gal-a11y-e-cell-text.c evolution-3.10.4/e-util/gal-a11y-e-cell-text.c
--- evolution-3.10.4.orig/e-util/gal-a11y-e-cell-text.c	1969-12-31 18:00:00.000000000 -0600
+++ evolution-3.10.4/e-util/gal-a11y-e-cell-text.c	2015-05-08 17:58:03.567564397 -0500
@@ -0,0 +1,725 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ *		Christopher James Lahey <clahey@ximian.com>
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#include <config.h>
+
+#include <string.h>
+
+#include <atk/atk.h>
+
+#include "e-util/e-cell-text.h"
+#include <glib/gi18n.h>
+
+#include "gal-a11y-e-cell-text.h"
+
+#define CS_CLASS(a11y) (G_TYPE_INSTANCE_GET_CLASS ((a11y), C_TYPE_STREAM, GalA11yECellTextClass))
+static AtkObjectClass *parent_class;
+#define PARENT_TYPE (gal_a11y_e_cell_get_type ())
+
+/* Static functions */
+static void
+ect_dispose (GObject *object)
+{
+	GObjectClass *g_class;
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (object);
+	GalA11yECellText *gaet = GAL_A11Y_E_CELL_TEXT (object);
+
+	if (gaet->inserted_id != 0) {
+		ECellText *ect = E_CELL_TEXT (gaec->cell_view->ecell);
+
+		if (ect) {
+			g_signal_handler_disconnect (ect, gaet->inserted_id);
+			g_signal_handler_disconnect (ect, gaet->deleted_id);
+		}
+
+		gaet->inserted_id = 0;
+		gaet->deleted_id = 0;
+	}
+
+	g_class = (GObjectClass *)parent_class;
+	if (g_class->dispose)
+		g_class->dispose (object);
+
+}
+
+static gboolean
+ect_check (gpointer a11y)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (a11y);
+	ETableItem *item = gaec->item;
+
+	g_return_val_if_fail ((gaec->item != NULL), FALSE);
+	g_return_val_if_fail ((gaec->cell_view != NULL), FALSE);
+	g_return_val_if_fail ((gaec->cell_view->ecell != NULL), FALSE);
+
+	if (atk_state_set_contains_state (gaec->state_set, ATK_STATE_DEFUNCT))
+		return FALSE;
+
+	if (gaec->row < 0 || gaec->row >= item->rows
+		|| gaec->view_col <0 || gaec->view_col >= item->cols
+		|| gaec->model_col <0 || gaec->model_col >= e_table_model_column_count (item->table_model))
+		return FALSE;
+
+	if (!E_IS_CELL_TEXT (gaec->cell_view->ecell))
+		return FALSE;
+
+	return TRUE;
+}
+
+static G_CONST_RETURN gchar *
+ect_get_name (AtkObject * a11y)
+{
+	GalA11yECell *gaec;
+	gchar *name;
+
+	if (!ect_check (a11y))
+		return NULL;
+
+	gaec = GAL_A11Y_E_CELL (a11y);
+	name = e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+	if (name != NULL) {
+		ATK_OBJECT_CLASS (parent_class)->set_name (a11y, name);
+		g_free (name);
+	}
+
+	if (a11y->name != NULL && strcmp (a11y->name, "")) {
+		return a11y->name;
+	} else {
+		return parent_class->get_name (a11y);
+	}
+}
+
+static gchar *
+ect_get_text (AtkText *text,
+	      gint start_offset,
+	      gint end_offset)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	gchar *full_text;
+	gchar *ret_val;
+
+	if (!ect_check (text))
+		return NULL;
+
+	full_text = e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+
+	if (end_offset == -1)
+		end_offset = strlen (full_text);
+	else
+		end_offset = g_utf8_offset_to_pointer (full_text, end_offset) - full_text;
+
+	start_offset = g_utf8_offset_to_pointer (full_text, start_offset) - full_text;
+
+	ret_val = g_strndup (full_text + start_offset, end_offset - start_offset);
+
+	g_free (full_text);
+
+	return ret_val;
+}
+
+static gchar *
+ect_get_text_after_offset (AtkText *text,
+			   gint offset,
+			   AtkTextBoundary boundary_type,
+			   gint *start_offset,
+			   gint *end_offset)
+{
+	/* Unimplemented */
+	return NULL;
+}
+
+static gchar *
+ect_get_text_at_offset (AtkText *text,
+			gint offset,
+			AtkTextBoundary boundary_type,
+			gint *start_offset,
+			gint *end_offset)
+{
+	/* Unimplemented */
+	return NULL;
+}
+
+static gunichar
+ect_get_character_at_offset (AtkText *text,
+			     gint offset)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	gunichar ret_val;
+	gchar *at_offset;
+	gchar *full_text;
+
+	if (!ect_check (text))
+		return -1;
+
+	full_text = e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+	at_offset = g_utf8_offset_to_pointer (full_text, offset);
+	ret_val = g_utf8_get_char_validated (at_offset, -1);
+	g_free (full_text);
+
+	return ret_val;
+}
+
+static gchar *
+ect_get_text_before_offset (AtkText *text,
+			    gint offset,
+			    AtkTextBoundary boundary_type,
+			    gint *start_offset,
+			    gint *end_offset)
+{
+	/* Unimplemented */
+	return NULL;
+}
+
+static gint
+ect_get_caret_offset (AtkText *text)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	gint start, end;
+
+	if (!ect_check (text))
+		return -1;
+
+	if (e_cell_text_get_selection (gaec->cell_view,
+				       gaec->view_col, gaec->row,
+				       &start, &end)) {
+		gchar *full_text = e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+		end = g_utf8_pointer_to_offset (full_text, full_text + end);
+		g_free (full_text);
+
+		return end;
+	}
+	else
+		return -1;
+}
+
+static AtkAttributeSet*
+ect_get_run_attributes (AtkText *text,
+			gint offset,
+			gint *start_offset,
+			gint *end_offset)
+{
+	/* Unimplemented */
+	return NULL;
+}
+
+static AtkAttributeSet*
+ect_get_default_attributes (AtkText *text)
+{
+	/* Unimplemented */
+	return NULL;
+}
+
+static void
+ect_get_character_extents (AtkText *text,
+			   gint offset,
+			   gint *x,
+			   gint *y,
+			   gint *width,
+			   gint *height,
+			   AtkCoordType coords)
+{
+	/* Unimplemented */
+}
+
+static gint
+ect_get_character_count (AtkText *text)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	gint ret_val;
+	gchar *full_text;
+
+	if (!ect_check (text))
+		return -1;
+
+	full_text = e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+
+	ret_val = g_utf8_strlen (full_text, -1);
+	g_free (full_text);
+	return ret_val;
+}
+
+static gint
+ect_get_offset_at_point (AtkText *text,
+			 gint x,
+			 gint y,
+			 AtkCoordType coords)
+{
+	/* Unimplemented */
+	return 0;
+}
+
+static gint
+ect_get_n_selections (AtkText *text)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	gint selection_start, selection_end;
+
+	if (!ect_check (text))
+		return 0;
+
+	if (e_cell_text_get_selection (gaec->cell_view,
+				       gaec->view_col, gaec->row,
+				       &selection_start,
+				       &selection_end)
+	    && selection_start != selection_end)
+		return 1;
+	return 0;
+}
+
+static gchar *
+ect_get_selection (AtkText *text,
+		   gint selection_num,
+		   gint *start_offset,
+		   gint *end_offset)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	gchar *ret_val;
+	gint selection_start, selection_end;
+
+	if (selection_num == 0
+	    && e_cell_text_get_selection (gaec->cell_view,
+					  gaec->view_col, gaec->row,
+					  &selection_start,
+					  &selection_end)
+	    && selection_start != selection_end) {
+		gint real_start, real_end, len;
+		gchar *full_text = e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+		len = strlen (full_text);
+		real_start = MIN (selection_start, selection_end);
+		real_end   = MAX (selection_start, selection_end);
+		real_start = MIN (MAX (0, real_start), len);
+		real_end   = MIN (MAX (0, real_end), len);
+
+		ret_val = g_strndup (full_text + real_start, real_end - real_start);
+
+		real_start = g_utf8_pointer_to_offset (full_text, full_text + real_start);
+		real_end   = g_utf8_pointer_to_offset (full_text, full_text + real_end);
+
+		if (start_offset)
+			*start_offset = real_start;
+		if (end_offset)
+			*end_offset = real_end;
+		g_free (full_text);
+	} else {
+		if (start_offset)
+			*start_offset = 0;
+		if (end_offset)
+			*end_offset = 0;
+		ret_val = NULL;
+	}
+
+	return ret_val;
+}
+
+static gboolean
+ect_add_selection (AtkText *text,
+		   gint start_offset,
+		   gint end_offset)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+
+	if (start_offset != end_offset) {
+		gint real_start, real_end, len;
+		gchar *full_text =
+			e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+
+		len = g_utf8_strlen (full_text, -1);
+		if (end_offset == -1)
+			end_offset = len;
+
+		real_start = MIN (start_offset, end_offset);
+		real_end   = MAX (start_offset, end_offset);
+
+		real_start = MIN (MAX (0, real_start), len);
+		real_end   = MIN (MAX (0, real_end), len);
+
+		real_start = g_utf8_offset_to_pointer (full_text, real_start) - full_text;
+		real_end   = g_utf8_offset_to_pointer (full_text, real_end) - full_text;
+		g_free (full_text);
+
+		if (e_cell_text_set_selection (gaec->cell_view,
+					       gaec->view_col, gaec->row,
+					       real_start, real_end)) {
+			g_signal_emit_by_name (ATK_OBJECT(text), "text_selection_changed");
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
+static gboolean
+ect_remove_selection (AtkText *text,
+		      gint selection_num)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	gint selection_start, selection_end;
+
+	if (selection_num == 0
+	    && e_cell_text_get_selection (gaec->cell_view,
+					  gaec->view_col, gaec->row,
+					  &selection_start,
+					  &selection_end)
+	    && selection_start != selection_end
+	    && e_cell_text_set_selection (gaec->cell_view,
+					  gaec->view_col, gaec->row,
+					  selection_end, selection_end)) {
+		g_signal_emit_by_name (ATK_OBJECT(text), "text_selection_changed");
+		return TRUE;
+	}
+	else
+		return FALSE;
+}
+
+static gboolean
+ect_set_selection (AtkText *text,
+		   gint selection_num,
+		   gint start_offset,
+		   gint end_offset)
+{
+	if (selection_num == 0) {
+		atk_text_add_selection (text, start_offset, end_offset);
+		return TRUE;
+	}
+	else
+		return FALSE;
+}
+
+static gboolean
+ect_set_caret_offset (AtkText *text,
+		      gint offset)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	gchar *full_text;
+	gint len;
+
+	full_text = e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+
+	len = g_utf8_strlen (full_text, -1);
+	if (offset == -1)
+		offset = len;
+	else
+		offset = MIN (MAX (0, offset), len);
+
+	offset = g_utf8_offset_to_pointer (full_text, offset) - full_text;
+
+	g_free (full_text);
+
+	return e_cell_text_set_selection (gaec->cell_view,
+					  gaec->view_col, gaec->row,
+					  offset, offset);
+}
+
+static gboolean
+ect_set_run_attributes (AtkEditableText *text,
+			AtkAttributeSet *attrib_set,
+			gint start_offset,
+			gint end_offset)
+{
+	/* Unimplemented */
+	return FALSE;
+}
+
+static void
+ect_set_text_contents (AtkEditableText *text,
+		       const gchar *string)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	ECellText *ect = E_CELL_TEXT (gaec->cell_view->ecell);
+
+	e_cell_text_set_value (ect, gaec->item->table_model, gaec->model_col, gaec->row, string);
+	e_table_item_enter_edit (gaec->item, gaec->view_col, gaec->row);
+}
+
+static void
+ect_insert_text (AtkEditableText *text,
+		 const gchar *string,
+		 gint length,
+		 gint *position)
+{
+	/* Utf8 unimplemented */
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	ECellText *ect = E_CELL_TEXT (gaec->cell_view->ecell);
+
+	gchar *full_text = e_cell_text_get_text_by_view (gaec->cell_view, gaec->model_col, gaec->row);
+	gchar *result = g_strdup_printf ("%.*s%.*s%s", *position, full_text, length, string, full_text + *position);
+
+	e_cell_text_set_value (ect, gaec->item->table_model, gaec->model_col, gaec->row, result);
+
+	*position += length;
+
+	g_free (result);
+	g_free (full_text);
+}
+
+static void
+ect_copy_text (AtkEditableText *text,
+	       gint start_pos,
+	       gint end_pos)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	if (start_pos != end_pos
+	    && atk_text_set_selection (ATK_TEXT (text), 0, start_pos, end_pos))
+		e_cell_text_copy_clipboard (gaec->cell_view,
+					    gaec->view_col, gaec->row);
+}
+
+static void
+ect_delete_text (AtkEditableText *text,
+		 gint start_pos,
+		 gint end_pos)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+	if (start_pos != end_pos
+	    && atk_text_set_selection (ATK_TEXT (text), 0, start_pos, end_pos))
+		e_cell_text_delete_selection (gaec->cell_view,
+					      gaec->view_col, gaec->row);
+}
+
+static void
+ect_cut_text (AtkEditableText *text,
+	      gint start_pos,
+	      gint end_pos)
+{
+	ect_copy_text (text, start_pos, end_pos);
+	ect_delete_text (text, start_pos, end_pos);
+}
+
+static void
+ect_paste_text (AtkEditableText *text,
+		gint position)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (text);
+
+	e_table_item_enter_edit (gaec->item, gaec->view_col, gaec->row);
+
+	if (atk_text_set_caret_offset (ATK_TEXT (text), position))
+		e_cell_text_paste_clipboard (gaec->cell_view,
+					     gaec->view_col, gaec->row);
+}
+
+static void
+ect_do_action_edit (AtkAction *action)
+{
+	GalA11yECell *a11y = GAL_A11Y_E_CELL (action);
+	ETableModel *e_table_model = a11y->item->table_model;
+
+	if (e_table_model_is_cell_editable (e_table_model, a11y->model_col, a11y->row)) {
+		e_table_item_enter_edit (a11y->item, a11y->view_col, a11y->row);
+	}
+}
+
+/* text signal handlers */
+static void
+ect_text_inserted_cb (ECellText *text, ECellView *cell_view, gint pos, gint len, gint row, gint model_col, gpointer data)
+{
+	GalA11yECellText *gaet;
+	GalA11yECell *gaec;
+
+	if (!ect_check (data))
+		return;
+	gaet = GAL_A11Y_E_CELL_TEXT (data);
+	gaec = GAL_A11Y_E_CELL (data);
+
+	if (cell_view == gaec->cell_view && row == gaec->row && model_col == gaec->model_col) {
+		g_signal_emit_by_name (gaet, "text_changed::insert", pos, len);
+
+	}
+}
+
+static void
+ect_text_deleted_cb (ECellText *text, ECellView *cell_view, gint pos, gint len, gint row, gint model_col, gpointer data)
+{
+	GalA11yECellText *gaet;
+	GalA11yECell *gaec;
+	if (!ect_check (data))
+		return;
+	gaet = GAL_A11Y_E_CELL_TEXT (data);
+	gaec = GAL_A11Y_E_CELL (data);
+	if (cell_view == gaec->cell_view && row == gaec->row && model_col == gaec->model_col) {
+		g_signal_emit_by_name (gaet, "text_changed::delete", pos, len);
+	 }
+}
+
+static void
+ect_atk_text_iface_init (AtkTextIface *iface)
+{
+	iface->get_text                = ect_get_text;
+	iface->get_text_after_offset   = ect_get_text_after_offset;
+	iface->get_text_at_offset      = ect_get_text_at_offset;
+	iface->get_character_at_offset = ect_get_character_at_offset;
+	iface->get_text_before_offset  = ect_get_text_before_offset;
+	iface->get_caret_offset        = ect_get_caret_offset;
+	iface->get_run_attributes      = ect_get_run_attributes;
+	iface->get_default_attributes  = ect_get_default_attributes;
+	iface->get_character_extents   = ect_get_character_extents;
+	iface->get_character_count     = ect_get_character_count;
+	iface->get_offset_at_point     = ect_get_offset_at_point;
+	iface->get_n_selections        = ect_get_n_selections;
+	iface->get_selection           = ect_get_selection;
+	iface->add_selection           = ect_add_selection;
+	iface->remove_selection        = ect_remove_selection;
+	iface->set_selection           = ect_set_selection;
+	iface->set_caret_offset        = ect_set_caret_offset;
+}
+
+static void
+ect_atk_editable_text_iface_init (AtkEditableTextIface *iface)
+{
+	iface->set_run_attributes = ect_set_run_attributes;
+	iface->set_text_contents  = ect_set_text_contents;
+	iface->insert_text        = ect_insert_text;
+	iface->copy_text          = ect_copy_text;
+	iface->cut_text           = ect_cut_text;
+	iface->delete_text        = ect_delete_text;
+	iface->paste_text         = ect_paste_text;
+}
+
+static void
+ect_class_init (GalA11yECellTextClass *klass)
+{
+	AtkObjectClass *a11y      = ATK_OBJECT_CLASS (klass);
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+	parent_class              = g_type_class_ref (PARENT_TYPE);
+	a11y->get_name            = ect_get_name;
+	object_class->dispose     = ect_dispose;
+}
+
+static void
+ect_action_init (GalA11yECellText *a11y)
+{
+	GalA11yECell *gaec = GAL_A11Y_E_CELL (a11y);
+	ECellText *ect = E_CELL_TEXT (gaec->cell_view->ecell);
+	if (ect->editable && e_table_model_is_cell_editable (gaec->cell_view->e_table_model, gaec->model_col, gaec->row))
+		gal_a11y_e_cell_add_action (gaec,
+				    "edit",
+				    /* Translators: description of an "edit" action */
+				    _("begin editing this cell"),
+				    NULL,
+				    (ACTION_FUNC) ect_do_action_edit);
+}
+
+/**
+ * gal_a11y_e_cell_text_get_type:
+ * @void:
+ *
+ * Registers the &GalA11yECellText class if necessary, and returns the type ID
+ * associated to it.
+ *
+ * Return value: The type ID of the &GalA11yECellText class.
+ **/
+GType
+gal_a11y_e_cell_text_get_type (void)
+{
+	static GType type = 0;
+
+	if (!type) {
+		GTypeInfo info = {
+			sizeof (GalA11yECellTextClass),
+			(GBaseInitFunc) NULL,
+			(GBaseFinalizeFunc) NULL,
+			(GClassInitFunc) ect_class_init,
+			(GClassFinalizeFunc) NULL,
+			NULL, /* class_data */
+			sizeof (GalA11yECellText),
+			0,
+			(GInstanceInitFunc) NULL,
+			NULL /* value_cell_text */
+		};
+
+		static const GInterfaceInfo atk_text_info = {
+			(GInterfaceInitFunc) ect_atk_text_iface_init,
+			(GInterfaceFinalizeFunc) NULL,
+			NULL
+		};
+
+		static const GInterfaceInfo atk_editable_text_info = {
+			(GInterfaceInitFunc) ect_atk_editable_text_iface_init,
+			(GInterfaceFinalizeFunc) NULL,
+			NULL
+		};
+
+		type = g_type_register_static (PARENT_TYPE, "GalA11yECellText", &info, 0);
+		g_type_add_interface_static (type, ATK_TYPE_TEXT, &atk_text_info);
+		g_type_add_interface_static (type, ATK_TYPE_EDITABLE_TEXT, &atk_editable_text_info);
+		gal_a11y_e_cell_type_add_action_interface (type);
+	}
+
+	return type;
+}
+
+static void
+cell_text_destroyed (gpointer data)
+{
+	g_return_if_fail (GAL_A11Y_IS_E_CELL_TEXT (data));
+
+	g_object_unref (data);
+}
+
+AtkObject *
+gal_a11y_e_cell_text_new (ETableItem *item,
+			  ECellView  *cell_view,
+			  AtkObject  *parent,
+			  gint         model_col,
+			  gint         view_col,
+			  gint         row)
+{
+	AtkObject *a11y;
+	GalA11yECell *gaec;
+	GalA11yECellText *gaet;
+	ECellText *ect;
+
+	a11y = g_object_new (gal_a11y_e_cell_text_get_type (), NULL);
+
+	gal_a11y_e_cell_construct (a11y,
+				   item,
+				   cell_view,
+				   parent,
+				   model_col,
+				   view_col,
+				   row);
+	gaet = GAL_A11Y_E_CELL_TEXT (a11y);
+
+	/* will be unrefed in cell_text_destroyed */
+	g_object_ref (a11y);
+
+	gaet->inserted_id = g_signal_connect (E_CELL_TEXT (((ECellView *)cell_view)->ecell),
+						"text_inserted", G_CALLBACK (ect_text_inserted_cb), a11y);
+	gaet->deleted_id = g_signal_connect (E_CELL_TEXT (((ECellView *)cell_view)->ecell),
+					     "text_deleted", G_CALLBACK (ect_text_deleted_cb), a11y);
+
+	g_object_weak_ref (G_OBJECT (((ECellView *)cell_view)->ecell),
+			   (GWeakNotify) cell_text_destroyed,
+			   a11y);
+
+	ect_action_init (gaet);
+
+	ect = E_CELL_TEXT (cell_view->ecell);
+	gaec = GAL_A11Y_E_CELL (a11y);
+	if (ect->editable && e_table_model_is_cell_editable (gaec->cell_view->e_table_model, gaec->model_col, gaec->row))
+		gal_a11y_e_cell_add_state (gaec, ATK_STATE_EDITABLE, FALSE);
+	else
+		gal_a11y_e_cell_remove_state (gaec, ATK_STATE_EDITABLE, FALSE);
+
+	return a11y;
+}
diff -urN evolution-3.10.4.orig/e-util/gal-a11y-e-cell-text.h evolution-3.10.4/e-util/gal-a11y-e-cell-text.h
--- evolution-3.10.4.orig/e-util/gal-a11y-e-cell-text.h	1969-12-31 18:00:00.000000000 -0600
+++ evolution-3.10.4/e-util/gal-a11y-e-cell-text.h	2015-05-08 17:58:03.568564397 -0500
@@ -0,0 +1,63 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ *		Christopher James Lahey <clahey@ximian.com>
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ */
+
+#ifndef __GAL_A11Y_E_CELL_TEXT_H__
+#define __GAL_A11Y_E_CELL_TEXT_H__
+
+#include <glib-object.h>
+#include <e-util/e-table-item.h>
+#include <e-util/e-cell-text.h>
+#include <e-util/gal-a11y-e-cell.h>
+
+#define GAL_A11Y_TYPE_E_CELL_TEXT            (gal_a11y_e_cell_text_get_type ())
+#define GAL_A11Y_E_CELL_TEXT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAL_A11Y_TYPE_E_CELL_TEXT, GalA11yECellText))
+#define GAL_A11Y_E_CELL_TEXT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GAL_A11Y_TYPE_E_CELL_TEXT, GalA11yECellTextClass))
+#define GAL_A11Y_IS_E_CELL_TEXT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAL_A11Y_TYPE_E_CELL_TEXT))
+#define GAL_A11Y_IS_E_CELL_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAL_A11Y_TYPE_E_CELL_TEXT))
+
+typedef struct _GalA11yECellText GalA11yECellText;
+typedef struct _GalA11yECellTextClass GalA11yECellTextClass;
+typedef struct _GalA11yECellTextPrivate GalA11yECellTextPrivate;
+
+/* This struct should actually be larger as this isn't what we derive from.
+ * The GalA11yECellTextPrivate comes right after the parent class structure.
+ **/
+struct _GalA11yECellText {
+	GalA11yECell object;
+	gint inserted_id;
+	gint deleted_id;
+};
+
+struct _GalA11yECellTextClass {
+	GalA11yECellClass parent_class;
+};
+
+/* Standard Glib function */
+GType      gal_a11y_e_cell_text_get_type   (void);
+AtkObject *gal_a11y_e_cell_text_new        (ETableItem *item,
+					    ECellView  *cell_view,
+					    AtkObject  *parent,
+					    gint         model_col,
+					    gint         view_col,
+					    gint         row);
+
+#endif /* __GAL_A11Y_E_CELL_TEXT_H__ */
diff -urN evolution-3.10.4.orig/e-util/gal-a11y-e-cell-toggle.c evolution-3.10.4/e-util/gal-a11y-e-cell-toggle.c
--- evolution-3.10.4.orig/e-util/gal-a11y-e-cell-toggle.c	2013-12-07 08:14:47.000000000 -0600
+++ evolution-3.10.4/e-util/gal-a11y-e-cell-toggle.c	2015-05-08 17:58:06.177564226 -0500
@@ -34,8 +34,6 @@
 #define PARENT_TYPE  (gal_a11y_e_cell_get_type ())
 static GObjectClass *parent_class;
 
-static void gal_a11y_e_cell_toggle_class_init (GalA11yECellToggleClass *class);
-
 static void
 gal_a11y_e_cell_toggle_dispose (GObject *object)
 {
@@ -52,36 +50,33 @@
 		parent_class->dispose (object);
 }
 
-GType
-gal_a11y_e_cell_toggle_get_type (void)
+static void
+ect_get_current_value (AtkValue *obj,
+		       GValue *value)
 {
-  static GType type = 0;
+	gint val;
+	GalA11yECell *cell = GAL_A11Y_E_CELL (obj);
 
-  if (!type)
-    {
-      static const GTypeInfo tinfo =
-      {
-	sizeof (GalA11yECellToggleClass),
-	(GBaseInitFunc) NULL, /* base init */
-	(GBaseFinalizeFunc) NULL, /* base finalize */
-	(GClassInitFunc) gal_a11y_e_cell_toggle_class_init, /* class init */
-	(GClassFinalizeFunc) NULL, /* class finalize */
-	NULL, /* class data */
-	sizeof (GalA11yECellToggle), /* instance size */
-	0, /* nb preallocs */
-	NULL, /* instance init */
-	NULL /* value table */
-      };
-
-      type = g_type_register_static (GAL_A11Y_TYPE_E_CELL,
-				     "GalA11yECellToggle", &tinfo, 0);
-      gal_a11y_e_cell_type_add_action_interface (type);
+	val = GPOINTER_TO_INT (e_table_model_value_at (cell->cell_view->e_table_model, cell->model_col, cell->row));
 
-    }
-  return type;
+	memset (value, 0, sizeof (GValue));
+	g_value_init (value, G_TYPE_DOUBLE);
+	g_value_set_double (value, val);
 }
 
 static void
+ect_value_iface_init (AtkValueIface *iface)
+{
+	iface->get_current_value = ect_get_current_value;
+}
+
+G_DEFINE_TYPE_WITH_CODE (GalA11yECellToggle,
+	gal_a11y_e_cell_toggle,
+	GAL_A11Y_TYPE_E_CELL,
+	gal_a11y_e_cell_type_add_action_interface (g_define_type_id);
+	G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, ect_value_iface_init))
+
+static void
 gal_a11y_e_cell_toggle_class_init (GalA11yECellToggleClass *class)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (class);
@@ -91,6 +86,11 @@
 }
 
 static void
+gal_a11y_e_cell_toggle_init (GalA11yECellToggle *toggle)
+{
+}
+
+static void
 toggle_cell_action (GalA11yECell *cell)
 {
 	gint finished;
@@ -121,26 +121,33 @@
 }
 
 static void
+update_cell (GalA11yECell *cell,
+	     gboolean notify)
+{
+	gint value;
+	const gchar *name;
+
+	value = GPOINTER_TO_INT (e_table_model_value_at (cell->cell_view->e_table_model, cell->model_col, cell->row));
+	name = e_cell_toggle_get_icon_description (E_CELL_TOGGLE (cell->cell_view->ecell), value);
+
+	if (name)
+		atk_object_set_name (ATK_OBJECT (cell), name);
+
+	if (value && !name)
+		gal_a11y_e_cell_add_state (cell, ATK_STATE_CHECKED, notify);
+	else
+		gal_a11y_e_cell_remove_state (cell, ATK_STATE_CHECKED, notify);
+}
+
+static void
 model_change_cb (ETableModel *etm,
                  gint col,
                  gint row,
                  GalA11yECell *cell)
 {
-	gint value;
-
-	if (col == cell->model_col && row == cell->row) {
 
-		value = GPOINTER_TO_INT (
-			e_table_model_value_at (cell->cell_view->e_table_model,
-						cell->model_col, cell->row));
-		/* Cheat gnopernicus, or it will ignore the state change signal  */
-		atk_focus_tracker_notify (ATK_OBJECT (cell));
-
-		if (value)
-			gal_a11y_e_cell_add_state (cell, ATK_STATE_CHECKED, TRUE);
-		else
-			gal_a11y_e_cell_remove_state (cell, ATK_STATE_CHECKED, TRUE);
-	}
+	if (col == cell->model_col && row == cell->row)
+		update_cell (cell, TRUE);
 }
 
 AtkObject *
@@ -154,7 +161,6 @@
 	AtkObject *a11y;
 	GalA11yECell *cell;
 	GalA11yECellToggle *toggle_cell;
-	gint value;
 
 	a11y = ATK_OBJECT (g_object_new (GAL_A11Y_TYPE_E_CELL_TOGGLE, NULL));
 
@@ -185,14 +191,7 @@
 		item->table_model, "model_cell_changed",
 		(GCallback) model_change_cb, a11y);
 
-	value = GPOINTER_TO_INT (
-			e_table_model_value_at (
-				cell->cell_view->e_table_model,
-				cell->model_col, cell->row));
-	if (value)
-		gal_a11y_e_cell_add_state (cell, ATK_STATE_CHECKED, FALSE);
-	else
-		gal_a11y_e_cell_remove_state (cell, ATK_STATE_CHECKED, FALSE);
+	update_cell (cell, FALSE);
 
 	return a11y;
 }
diff -urN evolution-3.10.4.orig/e-util/gal-a11y-e-table-click-to-add.c evolution-3.10.4/e-util/gal-a11y-e-table-click-to-add.c
--- evolution-3.10.4.orig/e-util/gal-a11y-e-table-click-to-add.c	2015-05-08 17:57:43.841565686 -0500
+++ evolution-3.10.4/e-util/gal-a11y-e-table-click-to-add.c	2015-05-08 17:58:01.744564516 -0500
@@ -317,7 +317,7 @@
 		cell_a11y = g_object_get_data (
 			G_OBJECT (row_a11y), "gail-focus-object");
 		if (cell_a11y) {
-			atk_focus_tracker_notify (cell_a11y);
+			atk_object_notify_state_change (cell_a11y, ATK_STATE_FOCUSED, TRUE);
 		}
 	}
 }
diff -urN evolution-3.10.4.orig/e-util/gal-a11y-e-table-item.c evolution-3.10.4/e-util/gal-a11y-e-table-item.c
--- evolution-3.10.4.orig/e-util/gal-a11y-e-table-item.c	2015-05-08 17:57:43.844565686 -0500
+++ evolution-3.10.4/e-util/gal-a11y-e-table-item.c	2015-05-08 17:58:01.744564516 -0500
@@ -225,7 +225,7 @@
 		g_object_set_data (G_OBJECT (a11y), "gail-focus-object", NULL);
 
 	if (notify && cell)
-		atk_focus_tracker_notify (cell);
+		g_signal_emit_by_name (a11y, "active-descendant-changed", cell);
 }
 
 static void
@@ -338,10 +338,12 @@
 	if (!item)
 		return NULL;
 
-	atk_component_get_position (
+	atk_component_get_extents (
 		component,
 		&x_origin,
 		&y_origin,
+		NULL,
+		NULL,
 		coord_type);
 	x -= x_origin;
 	y -= y_origin;
diff -urN evolution-3.10.4.orig/e-util/Makefile.am evolution-3.10.4/e-util/Makefile.am
--- evolution-3.10.4.orig/e-util/Makefile.am	2013-09-21 08:53:22.000000000 -0500
+++ evolution-3.10.4/e-util/Makefile.am	2015-05-08 17:58:03.566564397 -0500
@@ -307,6 +307,7 @@
 	ea-widgets.h \
 	gal-a11y-e-cell-popup.h \
 	gal-a11y-e-cell-registry.h \
+	gal-a11y-e-cell-text.h \
 	gal-a11y-e-cell-toggle.h \
 	gal-a11y-e-cell-tree.h \
 	gal-a11y-e-cell-vbox.h \
@@ -541,6 +542,7 @@
 	ea-widgets.c \
 	gal-a11y-e-cell-popup.c \
 	gal-a11y-e-cell-registry.c \
+	gal-a11y-e-cell-text.c \
 	gal-a11y-e-cell-toggle.c \
 	gal-a11y-e-cell-tree.c \
 	gal-a11y-e-cell-vbox.c \
diff -urN evolution-3.10.4.orig/mail/message-list.c evolution-3.10.4/mail/message-list.c
--- evolution-3.10.4.orig/mail/message-list.c	2014-02-02 11:07:09.000000000 -0600
+++ evolution-3.10.4/mail/message-list.c	2015-05-08 17:58:06.178564226 -0500
@@ -1985,8 +1985,8 @@
 
 	e_table_extras_add_compare (extras, "address_compare", address_compare);
 
-	cell = e_cell_toggle_new (
-		status_icons, G_N_ELEMENTS (status_icons));
+	cell = e_cell_toggle_new (status_icons, G_N_ELEMENTS (status_icons));
+	e_cell_toggle_set_icon_descriptions (E_CELL_TOGGLE (cell), status_map, G_N_ELEMENTS (status_map));
 	e_table_extras_add_cell (extras, "render_message_status", cell);
 	g_object_unref (cell);
 
@@ -3101,13 +3101,13 @@
 			ii = GPOINTER_TO_UINT (value);
 			if (ii > 5)
 				return g_strdup ("");
-			return g_strdup (_(status_map[ii]));
+			return g_strdup (status_map[ii]);
 
 		case COL_SCORE:
 			ii = GPOINTER_TO_UINT (value) + 3;
 			if (ii > 6)
 				ii = 3;
-			return g_strdup (_(score_map[ii]));
+			return g_strdup (score_map[ii]);
 
 		case COL_ATTACHMENT:
 		case COL_FLAGGED:
@@ -3147,10 +3147,22 @@
 message_list_class_init (MessageListClass *class)
 {
 	GObjectClass *object_class;
-	gint i;
 
-	for (i = 0; i < G_N_ELEMENTS (ml_drag_info); i++)
-		ml_drag_info[i].atom = gdk_atom_intern (ml_drag_info[i].target, FALSE);
+	if (!ml_drag_info[0].atom) {
+		gint ii;
+
+		for (ii = 0; ii < G_N_ELEMENTS (ml_drag_info); ii++) {
+			ml_drag_info[ii].atom = gdk_atom_intern (ml_drag_info[ii].target, FALSE);
+		}
+
+		for (ii = 0; ii < G_N_ELEMENTS (status_map); ii++) {
+			status_map[ii] = _(status_map[ii]);
+		}
+
+		for (ii = 0; ii < G_N_ELEMENTS (score_map); ii++) {
+			score_map[ii] = _(score_map[ii]);
+		}
+	}
 
 	g_type_class_add_private (class, sizeof (MessageListPrivate));
 
diff -urN evolution-3.10.4.orig/po/POTFILES.in evolution-3.10.4/po/POTFILES.in
--- evolution-3.10.4.orig/po/POTFILES.in	2013-11-10 07:47:06.000000000 -0600
+++ evolution-3.10.4/po/POTFILES.in	2015-05-08 17:58:03.568564397 -0500
@@ -278,6 +278,7 @@
 e-util/evolution-source-viewer.c
 e-util/filter.error.xml
 e-util/gal-a11y-e-cell-popup.c
+e-util/gal-a11y-e-cell-text.c
 e-util/gal-a11y-e-cell-toggle.c
 e-util/gal-a11y-e-cell-tree.c
 e-util/gal-a11y-e-cell.c
openSUSE Build Service is sponsored by