Hi, The attachment is a patch for bug #61688, which is a accessibility related bug. Steps to reproduce the problem: 1. start evolution with accessibility enabled; 2. Click Tools->Settings; 3. Start gnopernicus, then click the left navigation pane's cell to read its text. Actual Results: gnopernicus can only read "TAB". Expected Results: gnopernicus should read the cell's text, such as "Mail Accounts". The bug's reason is that the navigation pane's e-cell is an e-cell-vbox, which consists of several subcells. So it can't be treated as a generic e-cell, and the corresponding AtkObject of e-cell-vbox should be implemented. In the attachment, I implemented the a11y of e-cell-vbox and modified some relevant files, please help review, thanks. Regards, Eric -- Eric Zhao <eric zhao sun com> Public Key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3225516 Key fingerprint = EA12 D205 D359 A98D E63E CAC3 C2A7 30B1 E322 5516 |
Index: a11y/e-table/Makefile.am =================================================================== RCS file: /cvs/gnome/gal/gal/a11y/e-table/Makefile.am,v retrieving revision 1.7 diff -u -p -r1.7 Makefile.am --- a11y/e-table/Makefile.am 17 Dec 2003 02:35:20 -0000 1.7 +++ a11y/e-table/Makefile.am 17 Jul 2004 13:27:38 -0000 @@ -19,6 +19,7 @@ libgal_a11y_etable_la_SOURCES = \ gal-a11y-e-cell-toggle.c \ gal-a11y-e-cell-popup.c \ gal-a11y-e-cell-registry.c \ + gal-a11y-e-cell-vbox.c \ gal-a11y-e-table.c \ gal-a11y-e-table-item.c \ gal-a11y-e-table-item-factory.c \ @@ -37,6 +38,7 @@ libgal_a11y_etableinclude_HEADERS = \ gal-a11y-e-cell-toggle.h \ gal-a11y-e-cell-popup.h \ gal-a11y-e-cell-registry.h \ + gal-a11y-e-cell-vbox.h \ gal-a11y-e-table.h \ gal-a11y-e-table-item.h \ gal-a11y-e-table-click-to-add-factory.h \ Index: e-table/e-cell-vbox.c =================================================================== RCS file: /cvs/gnome/gal/gal/e-table/e-cell-vbox.c,v retrieving revision 1.4 diff -u -p -r1.4 e-cell-vbox.c --- e-table/e-cell-vbox.c 17 Nov 2002 00:02:53 -0000 1.4 +++ e-table/e-cell-vbox.c 17 Jul 2004 13:27:38 -0000 @@ -42,18 +42,13 @@ #include <gdk/gdkkeysyms.h> #include "gal/util/e-util.h" +#include "gal/a11y/e-table/gal-a11y-e-cell-registry.h" +#include "gal/a11y/e-table/gal-a11y-e-cell-vbox.h" #include "e-table-item.h" #include "e-cell-vbox.h" #define PARENT_TYPE e_cell_get_type () -typedef struct { - ECellView cell_view; - int subcell_view_count; - ECellView **subcell_views; - int *model_cols; -} ECellVboxView; - static ECellClass *parent_class; #define INDENT_AMOUNT 16 @@ -443,6 +438,8 @@ e_cell_vbox_class_init (GObjectClass *ob #endif parent_class = g_type_class_ref (PARENT_TYPE); + + gal_a11y_e_cell_registry_add_cell_type (NULL, E_CELL_VBOX_TYPE, gal_a11y_e_cell_vbox_new); } static void Index: e-table/e-cell-vbox.h =================================================================== RCS file: /cvs/gnome/gal/gal/e-table/e-cell-vbox.h,v retrieving revision 1.3 diff -u -p -r1.3 e-cell-vbox.h --- e-table/e-cell-vbox.h 17 Nov 2002 00:02:53 -0000 1.3 +++ e-table/e-cell-vbox.h 17 Jul 2004 13:27:38 -0000 @@ -50,6 +50,13 @@ typedef struct { } ECellVbox; typedef struct { + ECellView cell_view; + int subcell_view_count; + ECellView **subcell_views; + int *model_cols; +} ECellVboxView; + +typedef struct { ECellClass parent_class; } ECellVboxClass;
/* Evolution Accessibility: gal-a11y-e-cell-vbox.c * * Copyright (C) 2004 Sun Microsystem, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * 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. * * Author: Eric Zhao <eric zhao sun com> Sun Microsystem Inc., 2004 * */ #include "gal-a11y-e-cell-vbox.h" #include "gal-a11y-e-cell-registry.h" #include <gal/e-table/e-cell-vbox.h> #include <atk/atkcomponent.h> static AtkObjectClass *parent_class; static AtkComponentIface *component_parent_iface; #define PARENT_TYPE (gal_a11y_e_cell_get_type ()) static gint ecv_get_n_children (AtkObject *a11y) { g_return_val_if_fail (GAL_A11Y_IS_E_CELL_VBOX (a11y), 0); GalA11yECellVbox *gaev = GAL_A11Y_E_CELL_VBOX (a11y); return (gaev->a11y_subcell_count); } static void subcell_destroyed (gpointer data) { GalA11yECell *cell; AtkObject *parent; GalA11yECellVbox *gaev; g_return_if_fail (GAL_A11Y_IS_E_CELL (data)); cell = GAL_A11Y_E_CELL (data); parent = atk_object_get_parent (ATK_OBJECT (cell)); g_return_if_fail (GAL_A11Y_IS_E_CELL_VBOX (parent)); gaev = GAL_A11Y_E_CELL_VBOX (parent); if (cell->view_col < gaev->a11y_subcell_count) gaev->a11y_subcells[cell->view_col] = NULL; } static AtkObject* ecv_ref_child (AtkObject *a11y, gint i) { GalA11yECellVbox *gaev = GAL_A11Y_E_CELL_VBOX (a11y); GalA11yECell *gaec = GAL_A11Y_E_CELL (a11y); ECellVboxView *ecvv = (ECellVboxView *) (gaec->cell_view); AtkObject *ret; if (i < gaev->a11y_subcell_count) { if (gaev->a11y_subcells[i] == NULL) { gint model_col, row; row = gaec->row; model_col = ecvv->model_cols[i]; ECellView *subcell_view = ecvv->subcell_views[i]; ret = gal_a11y_e_cell_registry_get_object (NULL, gaec->item, subcell_view, a11y, model_col, i, /* FIXME should the view column use a fake one or the same as its parent? */ row); gaev->a11y_subcells[i] = ret; g_object_weak_ref (G_OBJECT (ret), (GWeakNotify) subcell_destroyed, ret); } else { ret = (AtkObject *) gaev->a11y_subcells[i]; if (ATK_IS_OBJECT (ret)) g_object_ref (ret); else ret = NULL; } } else { ret = NULL; } return ret; } static void ecv_dispose (GObject *object) { GalA11yECellVbox *gaev = GAL_A11Y_E_CELL_VBOX (object); if (gaev->a11y_subcells) g_free (gaev->a11y_subcells); } /* AtkComponet interface */ static AtkObject* ecv_ref_accessible_at_point (AtkComponent *component, gint x, gint y, AtkCoordType coord_type) { gint x0, y0, width, height; int subcell_height, i; GalA11yECell *gaec = GAL_A11Y_E_CELL (component); ECellVboxView *ecvv = (ECellVboxView *) (gaec->cell_view); atk_component_get_extents (component, &x0, &y0, &width, &height, coord_type); x -= x0; y -= y0; if (x < 0 || x > width || y < 0 || y > height) return NULL; for (i = 0; i < ecvv->subcell_view_count; i++) { subcell_height = e_cell_height (ecvv->subcell_views[i], ecvv->model_cols[i], gaec->view_col, gaec->row); if ( 0 <= y && y <= subcell_height) { return ecv_ref_child ((AtkObject *)component, i); } else y -= subcell_height; } return NULL; } static void ecv_class_init (GalA11yECellVboxClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); AtkObjectClass *a11y_class = ATK_OBJECT_CLASS (klass); parent_class = g_type_class_ref (PARENT_TYPE); object_class->dispose = ecv_dispose; a11y_class->get_n_children = ecv_get_n_children; a11y_class->ref_child = ecv_ref_child; } static void ecv_init (GalA11yECellVbox *a11y) { } static void ecv_atk_component_iface_init (AtkComponentIface *iface) { component_parent_iface = g_type_interface_peek_parent (iface); iface->ref_accessible_at_point = ecv_ref_accessible_at_point; } GType gal_a11y_e_cell_vbox_get_type (void) { static GType type = 0; if (!type) { GTypeInfo info = { sizeof (GalA11yECellVboxClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) ecv_class_init, (GClassFinalizeFunc) NULL, NULL, /* class_data */ sizeof (GalA11yECellVbox), 0, (GInstanceInitFunc) ecv_init, NULL /* value_cell */ }; static const GInterfaceInfo atk_component_info = { (GInterfaceInitFunc) ecv_atk_component_iface_init, (GInterfaceFinalizeFunc) NULL, NULL }; type = g_type_register_static (PARENT_TYPE, "GalA11yECellVbox", &info, 0); gal_a11y_e_cell_type_add_action_interface (type); g_type_add_interface_static (type, ATK_TYPE_COMPONENT, &atk_component_info); } return type; } AtkObject *gal_a11y_e_cell_vbox_new (ETableItem *item, ECellView *cell_view, AtkObject *parent, int model_col, int view_col, int row) { AtkObject *a11y; a11y = g_object_new (gal_a11y_e_cell_vbox_get_type (), NULL); gal_a11y_e_cell_construct (a11y, item, cell_view, parent, model_col, view_col, row); GalA11yECell *gaec = GAL_A11Y_E_CELL (a11y); GalA11yECellVbox *gaev = GAL_A11Y_E_CELL_VBOX (a11y); ECellVboxView *ecvv = (ECellVboxView *) (gaec->cell_view); gaev->a11y_subcell_count = ecvv->subcell_view_count; gaev->a11y_subcells = g_malloc0 (sizeof(AtkObject *)*gaev->a11y_subcell_count); return a11y; }
/* Evolution Accessibility: gal-a11y-e-cell-vbox.h * * Copyright (C) 2004 Sun Microsystem, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of version 2 of the GNU General Public * License as published by the Free Software Foundation. * * 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. * * Author: Eric Zhao <eric zhao sun com> Sun Microsystem Inc., 2004 * */ #ifndef __GAL_A11Y_E_CELL_VBOX_H__ #define __GAL_A11Y_E_CELL_VBOX_H__ #include "gal-a11y-e-cell.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define GAL_A11Y_TYPE_E_CELL_VBOX (gal_a11y_e_cell_vbox_get_type ()) #define GAL_A11Y_E_CELL_VBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAL_A11Y_TYPE_E_CELL_VBOX, GalA11yECellVbox)) #define GAL_A11Y_E_CELL_VBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAL_A11Y_E_CELL_VBOX, GalA11yECellVboxClass)) #define GAL_A11Y_IS_E_CELL_VBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAL_A11Y_TYPE_E_CELL_VBOX)) #define GAL_A11Y_IS_E_CELL_VBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAL_A11Y_TYPE_E_CELL_VBOX)) #define GAL_A11Y_E_CELL_VBOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GAL_A11Y_TYPE_E_CELL_VBOX, GalA11yECellVboxClass)) typedef struct _GalA11yECellVbox GalA11yECellVbox; typedef struct _GalA11yECellVboxClass GalA11yECellVboxClass; struct _GalA11yECellVbox { GalA11yECell object; int a11y_subcell_count; gpointer *a11y_subcells; }; struct _GalA11yECellVboxClass { GalA11yECellClass parent_class; }; GType gal_a11y_e_cell_vbox_get_type (void); AtkObject *gal_a11y_e_cell_vbox_new (ETableItem *item, ECellView *cell_view, AtkObject *parent, int model_col, int view_col, int row); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __GAL_A11Y_E_CELL_VBOX_H__ */