From d1fd1a0d66ef594a5ee62692e81e3c8ee9ef6461 Mon Sep 17 00:00:00 2001 From: billh Date: Wed, 12 Dec 2001 21:44:15 +0000 Subject: [PATCH] Make the role conversions from AtkRole to Accessibility_Role and AccessibleRole (from ATK, libspi-IDL, and CSPI) robust. Added some roles used by ATK to the at-spi role list. git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@186 e2bd861d-eb25-0410-b326-f6ed22b6b98c --- ChangeLog | 18 +++ cspi/spi-roletypes.h | 18 ++- cspi/spi_accessible.c | 100 ++++++++++++++- docs/reference/cspi/tmpl/spi_accessible.sgml | 18 ++- idl/Accessibility_Role.idl | 11 ++ libspi/accessible.c | 179 +++++++++++++++------------ 6 files changed, 261 insertions(+), 83 deletions(-) diff --git a/ChangeLog b/ChangeLog index 915453f..1239c79 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,23 @@ 2001-12-12 Bill Haneman + * libspi/accessible.c: + Convert all AtkRole enumerations to Accessibility_Role enums when + getting a role from an AtkObject. + + * cspi/spi_accessible.c: + Complete the conversion of Accessibility_Role enums at runtime to + AccessibleRole (SPI_ROLE_*) roles in Accessible_getRole, so that + role enums correctly match those given in spi-roletypes.h. + Re-synchronize the local names list for AccessibleRole_getName (). + AccessibleRole_getName is now deprecated, since it duplicates the + more reliable Accessible_getRoleName. + Added some role types from Accessibility_Role.idl. + + * idl/Accessibility_Role.idl: + Added some role types used by AtkRole. + +2001-12-12 Bill Haneman + * cspi/spi.h: * cspi/spi_registry.c: * cspi/spi_event.c: diff --git a/cspi/spi-roletypes.h b/cspi/spi-roletypes.h index d83ba90..c3fd1e7 100644 --- a/cspi/spi-roletypes.h +++ b/cspi/spi-roletypes.h @@ -90,23 +90,31 @@ extern "C" { typedef enum { SPI_ROLE_INVALID, + SPI_ROLE_ACCEL_LABEL, SPI_ROLE_ALERT, + SPI_ROLE_ANIMATION, + SPI_ROLE_ARROW, + SPI_ROLE_CALENDAR, SPI_ROLE_CANVAS, SPI_ROLE_CHECK_BOX, SPI_ROLE_COLOR_CHOOSER, SPI_ROLE_COLUMN_HEADER, SPI_ROLE_COMBO_BOX, - SPI_ROLE_SPI_DESKTOP_ICON, - SPI_ROLE_SPI_DESKTOP_FRAME, + SPI_ROLE_DATE_EDITOR, + SPI_ROLE_DESKTOP_ICON, + SPI_ROLE_DESKTOP_FRAME, + SPI_ROLE_DIAL, SPI_ROLE_DIALOG, SPI_ROLE_DIRECTORY_PANE, SPI_ROLE_FILE_CHOOSER, SPI_ROLE_FILLER, SPI_ROLE_FOCUS_TRAVERSABLE, + SPI_ROLE_FONT_CHOOSER, SPI_ROLE_FRAME, SPI_ROLE_GLASS_PANE, SPI_ROLE_HTML_CONTAINER, SPI_ROLE_ICON, + SPI_ROLE_IMAGE, SPI_ROLE_INTERNAL_FRAME, SPI_ROLE_LABEL, SPI_ROLE_LAYERED_PANE, @@ -124,25 +132,31 @@ typedef enum SPI_ROLE_PROGRESS_BAR, SPI_ROLE_PUSH_BUTTON, SPI_ROLE_RADIO_BUTTON, + SPI_ROLE_RADIO_MENU_ITEM, SPI_ROLE_ROOT_PANE, SPI_ROLE_ROW_HEADER, SPI_ROLE_SCROLL_BAR, SPI_ROLE_SCROLL_PANE, SPI_ROLE_SEPARATOR, SPI_ROLE_SLIDER, + SPI_ROLE_SPIN_BUTTON, SPI_ROLE_SPLIT_PANE, + SPI_ROLE_STATUS_BAR, SPI_ROLE_TABLE, SPI_ROLE_TABLE_CELL, SPI_ROLE_TABLE_COLUMN_HEADER, SPI_ROLE_TABLE_ROW_HEADER, + SPI_ROLE_TEAROFF_MENU_ITEM, SPI_ROLE_TEXT, SPI_ROLE_TOGGLE_BUTTON, SPI_ROLE_TOOL_BAR, SPI_ROLE_TOOL_TIP, SPI_ROLE_TREE, + SPI_ROLE_TREE_TABLE, SPI_ROLE_UNKNOWN, SPI_ROLE_VIEWPORT, SPI_ROLE_WINDOW, + SPI_ROLE_EXTENDED, SPI_ROLE_LAST_DEFINED } AccessibleRole; diff --git a/cspi/spi_accessible.c b/cspi/spi_accessible.c index 6f5ff36..c8c13ac 100644 --- a/cspi/spi_accessible.c +++ b/cspi/spi_accessible.c @@ -17,6 +17,7 @@ static const char *role_names [] = "date editor", "desktop icon", "desktop frame", + "dial", "dialog", "directory pane", "file chooser", @@ -65,6 +66,7 @@ static const char *role_names [] = "toolbar", "tooltip", "tree", + "tree-table", "", "viewport", "window", @@ -73,10 +75,104 @@ static const char *role_names [] = #define MAX_ROLES (sizeof (role_names) / sizeof (char *)) +static SPIBoolean +cspi_init_role_table (AccessibleRole *role_table) +{ + int i; + for (i = 0; i < Accessibility_ROLE_LAST_DEFINED; ++i) + { + role_table [i] = SPI_ROLE_UNKNOWN; + } + role_table [Accessibility_ROLE_INVALID] = SPI_ROLE_INVALID; + role_table [Accessibility_ROLE_ACCELERATOR_LABEL] = SPI_ROLE_ACCEL_LABEL; + role_table [Accessibility_ROLE_ALERT] = SPI_ROLE_ALERT; + role_table [Accessibility_ROLE_ANIMATION] = SPI_ROLE_ANIMATION; + role_table [Accessibility_ROLE_ARROW] = SPI_ROLE_ARROW; + role_table [Accessibility_ROLE_CALENDAR] = SPI_ROLE_CALENDAR; + role_table [Accessibility_ROLE_CANVAS] = SPI_ROLE_CANVAS; + role_table [Accessibility_ROLE_CHECK_BOX] = SPI_ROLE_CHECK_BOX; + role_table [Accessibility_ROLE_COLOR_CHOOSER] = SPI_ROLE_COLOR_CHOOSER; + role_table [Accessibility_ROLE_COLUMN_HEADER] = SPI_ROLE_COLUMN_HEADER; + role_table [Accessibility_ROLE_COMBO_BOX] = SPI_ROLE_COMBO_BOX; + role_table [Accessibility_ROLE_DATE_EDITOR] = SPI_ROLE_DATE_EDITOR; + role_table [Accessibility_ROLE_DESKTOP_ICON] = SPI_ROLE_DESKTOP_ICON; + role_table [Accessibility_ROLE_DESKTOP_FRAME] = SPI_ROLE_DESKTOP_FRAME; + role_table [Accessibility_ROLE_DIAL] = SPI_ROLE_DIAL; + role_table [Accessibility_ROLE_DIALOG] = SPI_ROLE_DIALOG; + role_table [Accessibility_ROLE_DIRECTORY_PANE] = SPI_ROLE_DIRECTORY_PANE; + role_table [Accessibility_ROLE_FILE_CHOOSER] = SPI_ROLE_FILE_CHOOSER; + role_table [Accessibility_ROLE_FILLER] = SPI_ROLE_FILLER; + role_table [Accessibility_ROLE_FONT_CHOOSER] = SPI_ROLE_FONT_CHOOSER; + role_table [Accessibility_ROLE_FRAME] = SPI_ROLE_FRAME; + role_table [Accessibility_ROLE_GLASS_PANE] = SPI_ROLE_GLASS_PANE; + role_table [Accessibility_ROLE_HTML_CONTAINER] = SPI_ROLE_HTML_CONTAINER; + role_table [Accessibility_ROLE_ICON] = SPI_ROLE_ICON; + role_table [Accessibility_ROLE_IMAGE] = SPI_ROLE_IMAGE; + role_table [Accessibility_ROLE_INTERNAL_FRAME] = SPI_ROLE_INTERNAL_FRAME; + role_table [Accessibility_ROLE_LABEL] = SPI_ROLE_LABEL; + role_table [Accessibility_ROLE_LAYERED_PANE] = SPI_ROLE_LAYERED_PANE; + role_table [Accessibility_ROLE_LIST] = SPI_ROLE_LIST; + role_table [Accessibility_ROLE_LIST_ITEM] = SPI_ROLE_LIST_ITEM; + role_table [Accessibility_ROLE_MENU] = SPI_ROLE_MENU; + role_table [Accessibility_ROLE_MENU_BAR] = SPI_ROLE_MENU_BAR; + role_table [Accessibility_ROLE_MENU_ITEM] = SPI_ROLE_MENU_ITEM; + role_table [Accessibility_ROLE_OPTION_PANE] = SPI_ROLE_OPTION_PANE; + role_table [Accessibility_ROLE_PAGE_TAB] = SPI_ROLE_PAGE_TAB; + role_table [Accessibility_ROLE_PAGE_TAB_LIST] = SPI_ROLE_PAGE_TAB_LIST; + role_table [Accessibility_ROLE_PANEL] = SPI_ROLE_PANEL; + role_table [Accessibility_ROLE_PASSWORD_TEXT] = SPI_ROLE_PASSWORD_TEXT; + role_table [Accessibility_ROLE_POPUP_MENU] = SPI_ROLE_POPUP_MENU; + role_table [Accessibility_ROLE_PROGRESS_BAR] = SPI_ROLE_PROGRESS_BAR; + role_table [Accessibility_ROLE_PUSH_BUTTON] = SPI_ROLE_PUSH_BUTTON; + role_table [Accessibility_ROLE_RADIO_BUTTON] = SPI_ROLE_RADIO_BUTTON; + role_table [Accessibility_ROLE_RADIO_MENU_ITEM] = SPI_ROLE_RADIO_MENU_ITEM; + role_table [Accessibility_ROLE_ROOT_PANE] = SPI_ROLE_ROOT_PANE; + role_table [Accessibility_ROLE_ROW_HEADER] = SPI_ROLE_ROW_HEADER; + role_table [Accessibility_ROLE_SCROLL_BAR] = SPI_ROLE_SCROLL_BAR; + role_table [Accessibility_ROLE_SCROLL_PANE] = SPI_ROLE_SCROLL_PANE; + role_table [Accessibility_ROLE_SEPARATOR] = SPI_ROLE_SEPARATOR; + role_table [Accessibility_ROLE_SLIDER] = SPI_ROLE_SLIDER; + role_table [Accessibility_ROLE_SPIN_BUTTON] = SPI_ROLE_SPIN_BUTTON; + role_table [Accessibility_ROLE_SPLIT_PANE] = SPI_ROLE_SPLIT_PANE; + role_table [Accessibility_ROLE_STATUS_BAR] = SPI_ROLE_STATUS_BAR; + role_table [Accessibility_ROLE_TABLE] = SPI_ROLE_TABLE; + role_table [Accessibility_ROLE_TABLE_CELL] = SPI_ROLE_TABLE_CELL; + role_table [Accessibility_ROLE_TEAROFF_MENU_ITEM] = SPI_ROLE_TEAROFF_MENU_ITEM; + role_table [Accessibility_ROLE_TEXT] = SPI_ROLE_TEXT; + role_table [Accessibility_ROLE_TOGGLE_BUTTON] = SPI_ROLE_TOGGLE_BUTTON; + role_table [Accessibility_ROLE_TOOL_BAR] = SPI_ROLE_TOOL_BAR; + role_table [Accessibility_ROLE_TOOL_TIP] = SPI_ROLE_TOOL_TIP; + role_table [Accessibility_ROLE_TREE] = SPI_ROLE_TREE; + role_table [Accessibility_ROLE_TREE_TABLE] = SPI_ROLE_TREE_TABLE; + role_table [Accessibility_ROLE_UNKNOWN] = SPI_ROLE_UNKNOWN; + role_table [Accessibility_ROLE_VIEWPORT] = SPI_ROLE_VIEWPORT; + role_table [Accessibility_ROLE_WINDOW] = SPI_ROLE_WINDOW; + role_table [Accessibility_ROLE_EXTENDED] = SPI_ROLE_EXTENDED; + role_table [Accessibility_ROLE_LAST_DEFINED] = SPI_ROLE_EXTENDED; + + return TRUE; +} + static AccessibleRole cspi_role_from_spi_role (Accessibility_Role role) { - return role; /* FIXME: need to compare, equivalence not guaranteed */ + /* array is sized according to IDL roles because IDL roles are the index */ + static AccessibleRole cspi_role_table [Accessibility_ROLE_LAST_DEFINED]; + static SPIBoolean is_initialized = FALSE; + AccessibleRole cspi_role; + if (!is_initialized) + { + is_initialized = cspi_init_role_table (cspi_role_table); + } + if (role >= 0 && role < Accessibility_ROLE_LAST_DEFINED) + { + cspi_role = cspi_role_table [role]; + } + else + { + cspi_role = SPI_ROLE_EXTENDED; + } + return cspi_role; } /** @@ -84,7 +180,7 @@ cspi_role_from_spi_role (Accessibility_Role role) * @role: an #AccessibleRole object to query. * * Get a localizeable string that indicates the name of an #AccessibleRole. - * Currently broken, do not use. + * DEPRECATED. * * Returns: a localizable string name for an #AccessibleRole enumerated type. **/ diff --git a/docs/reference/cspi/tmpl/spi_accessible.sgml b/docs/reference/cspi/tmpl/spi_accessible.sgml index 1fc69f3..dbadff0 100644 --- a/docs/reference/cspi/tmpl/spi_accessible.sgml +++ b/docs/reference/cspi/tmpl/spi_accessible.sgml @@ -321,23 +321,31 @@ Accessible Objects @SPI_ROLE_INVALID: +@SPI_ROLE_ACCEL_LABEL: @SPI_ROLE_ALERT: +@SPI_ROLE_ANIMATION: +@SPI_ROLE_ARROW: +@SPI_ROLE_CALENDAR: @SPI_ROLE_CANVAS: @SPI_ROLE_CHECK_BOX: @SPI_ROLE_COLOR_CHOOSER: @SPI_ROLE_COLUMN_HEADER: @SPI_ROLE_COMBO_BOX: -@SPI_ROLE_SPI_DESKTOP_ICON: -@SPI_ROLE_SPI_DESKTOP_FRAME: +@SPI_ROLE_DATE_EDITOR: +@SPI_ROLE_DESKTOP_ICON: +@SPI_ROLE_DESKTOP_FRAME: +@SPI_ROLE_DIAL: @SPI_ROLE_DIALOG: @SPI_ROLE_DIRECTORY_PANE: @SPI_ROLE_FILE_CHOOSER: @SPI_ROLE_FILLER: @SPI_ROLE_FOCUS_TRAVERSABLE: +@SPI_ROLE_FONT_CHOOSER: @SPI_ROLE_FRAME: @SPI_ROLE_GLASS_PANE: @SPI_ROLE_HTML_CONTAINER: @SPI_ROLE_ICON: +@SPI_ROLE_IMAGE: @SPI_ROLE_INTERNAL_FRAME: @SPI_ROLE_LABEL: @SPI_ROLE_LAYERED_PANE: @@ -355,25 +363,31 @@ Accessible Objects @SPI_ROLE_PROGRESS_BAR: @SPI_ROLE_PUSH_BUTTON: @SPI_ROLE_RADIO_BUTTON: +@SPI_ROLE_RADIO_MENU_ITEM: @SPI_ROLE_ROOT_PANE: @SPI_ROLE_ROW_HEADER: @SPI_ROLE_SCROLL_BAR: @SPI_ROLE_SCROLL_PANE: @SPI_ROLE_SEPARATOR: @SPI_ROLE_SLIDER: +@SPI_ROLE_SPIN_BUTTON: @SPI_ROLE_SPLIT_PANE: +@SPI_ROLE_STATUS_BAR: @SPI_ROLE_TABLE: @SPI_ROLE_TABLE_CELL: @SPI_ROLE_TABLE_COLUMN_HEADER: @SPI_ROLE_TABLE_ROW_HEADER: +@SPI_ROLE_TEAROFF_MENU_ITEM: @SPI_ROLE_TEXT: @SPI_ROLE_TOGGLE_BUTTON: @SPI_ROLE_TOOL_BAR: @SPI_ROLE_TOOL_TIP: @SPI_ROLE_TREE: +@SPI_ROLE_TREE_TABLE: @SPI_ROLE_UNKNOWN: @SPI_ROLE_VIEWPORT: @SPI_ROLE_WINDOW: +@SPI_ROLE_EXTENDED: @SPI_ROLE_LAST_DEFINED: diff --git a/idl/Accessibility_Role.idl b/idl/Accessibility_Role.idl index a99b446..87d2c81 100644 --- a/idl/Accessibility_Role.idl +++ b/idl/Accessibility_Role.idl @@ -44,6 +44,8 @@ module Accessibility { * indicator for the current state. */ ROLE_CHECK_BOX, + /* A menu item that behaves like a check box (see ROLE_CHECK_BOX) */ + ROLE_CHECK_MENU_ITEM, /* A specialized dialog that lets the user choose a color. */ ROLE_COLOR_CHOOSER, /* The header for a column of data */ @@ -59,6 +61,11 @@ module Accessibility { * internal frames. */ ROLE_DESKTOP_FRAME, + /* + * An object that allows a value to be changed via rotating a visual element, + * or which displays a value via such a rotating element. + */ + ROLE_DIAL, /* A top level window with title bar and a border */ ROLE_DIALOG, /* @@ -199,6 +206,8 @@ module Accessibility { ROLE_TABLE_ROW_HEADER, /* Object allows menu to be removed from menubar and shown in its own window. */ ROLE_TEAROFF_MENU_ITEM, + /* An object that emulates a terminal */ + ROLE_TERMINAL, /* An object that presents text to the user */ ROLE_TEXT, /* @@ -216,6 +225,8 @@ module Accessibility { ROLE_TOOL_TIP, /* An object used to repsent hierarchical information to the user. */ ROLE_TREE, + /* An object that presents both tabular and hierarchical info to the user */ + ROLE_TREE_TABLE, /* * The object contains some Accessible information, but its role is * not known. diff --git a/libspi/accessible.c b/libspi/accessible.c index 1d0eb0e..ef8a66f 100644 --- a/libspi/accessible.c +++ b/libspi/accessible.c @@ -31,89 +31,114 @@ /* Our parent Gtk object type */ #define PARENT_TYPE SPI_TYPE_BASE +static gboolean spi_init_role_lookup_table (Accessibility_Role *role_table); +static Accessibility_Role spi_role_from_atk_role (AtkRole role); + +static gboolean +spi_init_role_lookup_table (Accessibility_Role *role_table) +{ + int i; + /* if it's not in the list below, dunno what it is */ + for (i = 0; i < ATK_ROLE_LAST_DEFINED; ++i) + { + role_table [i] = Accessibility_ROLE_UNKNOWN; + } + + role_table [ATK_ROLE_INVALID] = Accessibility_ROLE_INVALID; + role_table [ATK_ROLE_ACCEL_LABEL] = Accessibility_ROLE_ACCELERATOR_LABEL; + role_table [ATK_ROLE_ALERT] = Accessibility_ROLE_ALERT; + role_table [ATK_ROLE_ANIMATION] = Accessibility_ROLE_ANIMATION; + role_table [ATK_ROLE_ARROW] = Accessibility_ROLE_ARROW; + role_table [ATK_ROLE_CALENDAR] = Accessibility_ROLE_CALENDAR; + role_table [ATK_ROLE_CANVAS] = Accessibility_ROLE_CANVAS; + role_table [ATK_ROLE_CHECK_BOX] = Accessibility_ROLE_CHECK_BOX; + role_table [ATK_ROLE_CHECK_MENU_ITEM] = Accessibility_ROLE_CHECK_MENU_ITEM; + role_table [ATK_ROLE_COLOR_CHOOSER] = Accessibility_ROLE_COLOR_CHOOSER; + role_table [ATK_ROLE_COLUMN_HEADER] = Accessibility_ROLE_COLUMN_HEADER; + role_table [ATK_ROLE_COMBO_BOX] = Accessibility_ROLE_COMBO_BOX; + role_table [ATK_ROLE_DATE_EDITOR] = Accessibility_ROLE_DATE_EDITOR; + role_table [ATK_ROLE_DESKTOP_ICON] = Accessibility_ROLE_DESKTOP_ICON; + role_table [ATK_ROLE_DESKTOP_FRAME] = Accessibility_ROLE_DESKTOP_FRAME; + role_table [ATK_ROLE_DIAL] = Accessibility_ROLE_DIAL; + role_table [ATK_ROLE_DIALOG] = Accessibility_ROLE_DIALOG; + role_table [ATK_ROLE_DIRECTORY_PANE] = Accessibility_ROLE_DIRECTORY_PANE; + role_table [ATK_ROLE_FILE_CHOOSER] = Accessibility_ROLE_FILE_CHOOSER; + role_table [ATK_ROLE_FILLER] = Accessibility_ROLE_FILLER; + role_table [ATK_ROLE_FONT_CHOOSER] = Accessibility_ROLE_FONT_CHOOSER; + role_table [ATK_ROLE_FRAME] = Accessibility_ROLE_FRAME; + role_table [ATK_ROLE_GLASS_PANE] = Accessibility_ROLE_GLASS_PANE; + role_table [ATK_ROLE_HTML_CONTAINER] = Accessibility_ROLE_HTML_CONTAINER; + role_table [ATK_ROLE_ICON] = Accessibility_ROLE_ICON; + role_table [ATK_ROLE_IMAGE] = Accessibility_ROLE_IMAGE; + role_table [ATK_ROLE_INTERNAL_FRAME] = Accessibility_ROLE_INTERNAL_FRAME; + role_table [ATK_ROLE_LABEL] = Accessibility_ROLE_LABEL; + role_table [ATK_ROLE_LAYERED_PANE] = Accessibility_ROLE_LAYERED_PANE; + role_table [ATK_ROLE_LIST] = Accessibility_ROLE_LIST; + role_table [ATK_ROLE_LIST_ITEM] = Accessibility_ROLE_LIST_ITEM; + role_table [ATK_ROLE_MENU] = Accessibility_ROLE_MENU; + role_table [ATK_ROLE_MENU_BAR] = Accessibility_ROLE_MENU_BAR; + role_table [ATK_ROLE_MENU_ITEM] = Accessibility_ROLE_MENU_ITEM; + role_table [ATK_ROLE_OPTION_PANE] = Accessibility_ROLE_OPTION_PANE; + role_table [ATK_ROLE_PAGE_TAB] = Accessibility_ROLE_PAGE_TAB; + role_table [ATK_ROLE_PAGE_TAB_LIST] = Accessibility_ROLE_PAGE_TAB_LIST; + role_table [ATK_ROLE_PANEL] = Accessibility_ROLE_PANEL; + role_table [ATK_ROLE_PASSWORD_TEXT] = Accessibility_ROLE_PASSWORD_TEXT; + role_table [ATK_ROLE_POPUP_MENU] = Accessibility_ROLE_POPUP_MENU; + role_table [ATK_ROLE_PROGRESS_BAR] = Accessibility_ROLE_PROGRESS_BAR; + role_table [ATK_ROLE_PUSH_BUTTON] = Accessibility_ROLE_PUSH_BUTTON; + role_table [ATK_ROLE_RADIO_BUTTON] = Accessibility_ROLE_RADIO_BUTTON; + role_table [ATK_ROLE_RADIO_MENU_ITEM] = Accessibility_ROLE_RADIO_MENU_ITEM; + role_table [ATK_ROLE_ROOT_PANE] = Accessibility_ROLE_ROOT_PANE; + role_table [ATK_ROLE_ROW_HEADER] = Accessibility_ROLE_ROW_HEADER; + role_table [ATK_ROLE_SCROLL_BAR] = Accessibility_ROLE_SCROLL_BAR; + role_table [ATK_ROLE_SCROLL_PANE] = Accessibility_ROLE_SCROLL_PANE; + role_table [ATK_ROLE_SEPARATOR] = Accessibility_ROLE_SEPARATOR; + role_table [ATK_ROLE_SLIDER] = Accessibility_ROLE_SLIDER; + role_table [ATK_ROLE_SPLIT_PANE] = Accessibility_ROLE_SPLIT_PANE; + role_table [ATK_ROLE_SPIN_BUTTON] = Accessibility_ROLE_SPIN_BUTTON; + role_table [ATK_ROLE_STATUSBAR] = Accessibility_ROLE_STATUS_BAR; + role_table [ATK_ROLE_TABLE] = Accessibility_ROLE_TABLE; + role_table [ATK_ROLE_TABLE_CELL] = Accessibility_ROLE_TABLE_CELL; + role_table [ATK_ROLE_TABLE_COLUMN_HEADER] = + Accessibility_ROLE_COLUMN_HEADER; + role_table [ATK_ROLE_TABLE_ROW_HEADER] = Accessibility_ROLE_ROW_HEADER; + role_table [ATK_ROLE_TEAR_OFF_MENU_ITEM] = + Accessibility_ROLE_TEAROFF_MENU_ITEM; + role_table [ATK_ROLE_TERMINAL] = Accessibility_ROLE_TERMINAL; + role_table [ATK_ROLE_TEXT] = Accessibility_ROLE_TEXT; + role_table [ATK_ROLE_TOGGLE_BUTTON] = Accessibility_ROLE_TOGGLE_BUTTON; + role_table [ATK_ROLE_TOOL_BAR] = Accessibility_ROLE_TOOL_BAR; + role_table [ATK_ROLE_TOOL_TIP] = Accessibility_ROLE_TOOL_TIP; + role_table [ATK_ROLE_TREE] = Accessibility_ROLE_TREE; + role_table [ATK_ROLE_TREE_TABLE] = Accessibility_ROLE_TREE_TABLE; + role_table [ATK_ROLE_UNKNOWN] = Accessibility_ROLE_UNKNOWN; + role_table [ATK_ROLE_VIEWPORT] = Accessibility_ROLE_VIEWPORT; + role_table [ATK_ROLE_WINDOW] = Accessibility_ROLE_WINDOW; + role_table [ATK_ROLE_LAST_DEFINED] = Accessibility_ROLE_EXTENDED; + + return TRUE; +} + static Accessibility_Role spi_role_from_atk_role (AtkRole role) { + static gboolean is_initialized = FALSE; + static Accessibility_Role spi_role_table [ATK_ROLE_LAST_DEFINED]; Accessibility_Role spi_role; - /* TODO: finish and/or make efficient! */ - switch (role) - { - case ATK_ROLE_INVALID: - spi_role = Accessibility_ROLE_INVALID; - break; - case ATK_ROLE_ACCEL_LABEL: - case ATK_ROLE_ALERT: - case ATK_ROLE_ANIMATION: - case ATK_ROLE_ARROW: - case ATK_ROLE_CALENDAR: - case ATK_ROLE_CANVAS: - case ATK_ROLE_CHECK_BOX: - case ATK_ROLE_CHECK_MENU_ITEM: - case ATK_ROLE_COLOR_CHOOSER: - case ATK_ROLE_COLUMN_HEADER: - case ATK_ROLE_COMBO_BOX: - case ATK_ROLE_DATE_EDITOR: - case ATK_ROLE_DESKTOP_ICON: - case ATK_ROLE_DESKTOP_FRAME: - case ATK_ROLE_DIAL: - case ATK_ROLE_DIALOG: - case ATK_ROLE_DIRECTORY_PANE: - case ATK_ROLE_DRAWING_AREA: - case ATK_ROLE_FILE_CHOOSER: - case ATK_ROLE_FILLER: - case ATK_ROLE_FONT_CHOOSER: - case ATK_ROLE_FRAME: - case ATK_ROLE_GLASS_PANE: - case ATK_ROLE_HTML_CONTAINER: - case ATK_ROLE_ICON: - case ATK_ROLE_IMAGE: - case ATK_ROLE_INTERNAL_FRAME: - case ATK_ROLE_LABEL: - case ATK_ROLE_LAYERED_PANE: - case ATK_ROLE_LIST: - case ATK_ROLE_LIST_ITEM: - case ATK_ROLE_MENU: - case ATK_ROLE_MENU_BAR: - case ATK_ROLE_MENU_ITEM: - case ATK_ROLE_OPTION_PANE: - case ATK_ROLE_PAGE_TAB: - case ATK_ROLE_PAGE_TAB_LIST: - case ATK_ROLE_PANEL: - case ATK_ROLE_PASSWORD_TEXT: - case ATK_ROLE_POPUP_MENU: - case ATK_ROLE_PROGRESS_BAR: - case ATK_ROLE_PUSH_BUTTON: - case ATK_ROLE_RADIO_BUTTON: - case ATK_ROLE_RADIO_MENU_ITEM: - case ATK_ROLE_ROOT_PANE: - case ATK_ROLE_ROW_HEADER: - case ATK_ROLE_SCROLL_BAR: - case ATK_ROLE_SCROLL_PANE: - case ATK_ROLE_SEPARATOR: - case ATK_ROLE_SLIDER: - case ATK_ROLE_SPLIT_PANE: - case ATK_ROLE_SPIN_BUTTON: - case ATK_ROLE_STATUSBAR: - case ATK_ROLE_TABLE: - case ATK_ROLE_TABLE_CELL: - case ATK_ROLE_TABLE_COLUMN_HEADER: - case ATK_ROLE_TABLE_ROW_HEADER: - case ATK_ROLE_TEAR_OFF_MENU_ITEM: - case ATK_ROLE_TERMINAL: - case ATK_ROLE_TEXT: - case ATK_ROLE_TOGGLE_BUTTON: - case ATK_ROLE_TOOL_BAR: - case ATK_ROLE_TOOL_TIP: - case ATK_ROLE_TREE: - case ATK_ROLE_TREE_TABLE: - case ATK_ROLE_UNKNOWN: - case ATK_ROLE_VIEWPORT: - case ATK_ROLE_WINDOW: - case ATK_ROLE_LAST_DEFINED: - default: + if (!is_initialized) + { + is_initialized = spi_init_role_lookup_table (spi_role_table); + } + + if (role >= 0 && role < ATK_ROLE_LAST_DEFINED) + { + spi_role = spi_role_table [role]; + } + else + { spi_role = Accessibility_ROLE_EXTENDED; - } + } return spi_role; } -- 2.7.4