X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libspi%2Faccessible.c;h=d26784c6c741a02fba7b167db2ce79134bc9a59f;hb=056d1bc768c8135609c26342525b084983e2bb2f;hp=f83263ed1064c1939ba321661a83a18735146aff;hpb=be2f9288bfa43de706c8abc2197c3660069ad0ae;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/libspi/accessible.c b/libspi/accessible.c index f83263e..d26784c 100644 --- a/libspi/accessible.c +++ b/libspi/accessible.c @@ -2,7 +2,8 @@ * AT-SPI - Assistive Technology Service Provider Interface * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) * - * Copyright 2001 Sun Microsystems Inc. + * Copyright 2001, 2002 Sun Microsystems Inc., + * Copyright 2001, 2002 Ximian, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -27,12 +28,13 @@ #include #include #include +#include "spi-private.h" /* 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); +Accessibility_Role spi_accessible_role_from_atk_role (AtkRole role); static gboolean spi_init_role_lookup_table (Accessibility_Role *role_table) @@ -44,82 +46,99 @@ spi_init_role_lookup_table (Accessibility_Role *role_table) 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_DRAWING_AREA] = Accessibility_ROLE_DRAWING_AREA; - 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_SPIN_BUTTON] = Accessibility_ROLE_SPIN_BUTTON; - role_table [ATK_ROLE_SPLIT_PANE] = Accessibility_ROLE_SPLIT_PANE; - 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; - + 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_DRAWING_AREA] = Accessibility_ROLE_DRAWING_AREA; + 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_SPIN_BUTTON] = Accessibility_ROLE_SPIN_BUTTON; + role_table [ATK_ROLE_SPLIT_PANE] = Accessibility_ROLE_SPLIT_PANE; + 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_TABLE_COLUMN_HEADER; + role_table [ATK_ROLE_TABLE_ROW_HEADER] = Accessibility_ROLE_TABLE_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_HEADER] = Accessibility_ROLE_HEADER; + role_table [ATK_ROLE_FOOTER] = Accessibility_ROLE_FOOTER; + role_table [ATK_ROLE_PARAGRAPH] = Accessibility_ROLE_PARAGRAPH; + role_table [ATK_ROLE_RULER] = Accessibility_ROLE_RULER; + role_table [ATK_ROLE_APPLICATION] = Accessibility_ROLE_APPLICATION; + role_table [ATK_ROLE_AUTOCOMPLETE] = Accessibility_ROLE_AUTOCOMPLETE; + role_table [ATK_ROLE_EDITBAR] = Accessibility_ROLE_EDITBAR; + role_table [ATK_ROLE_EMBEDDED] = Accessibility_ROLE_EMBEDDED; + role_table [ATK_ROLE_ENTRY] = Accessibility_ROLE_ENTRY; + role_table [ATK_ROLE_CHART] = Accessibility_ROLE_CHART; + role_table [ATK_ROLE_CAPTION] = Accessibility_ROLE_CAPTION; + role_table [ATK_ROLE_DOCUMENT_FRAME] = Accessibility_ROLE_DOCUMENT_FRAME; + role_table [ATK_ROLE_HEADING] = Accessibility_ROLE_HEADING; + role_table [ATK_ROLE_PAGE] = Accessibility_ROLE_PAGE; + role_table [ATK_ROLE_SECTION] = Accessibility_ROLE_SECTION; + role_table [ATK_ROLE_FORM] = Accessibility_ROLE_FORM; + role_table [ATK_ROLE_REDUNDANT_OBJECT] = Accessibility_ROLE_REDUNDANT_OBJECT; + role_table [ATK_ROLE_LINK] = Accessibility_ROLE_LINK; + role_table [ATK_ROLE_INPUT_METHOD_WINDOW] = Accessibility_ROLE_INPUT_METHOD_WINDOW; return TRUE; } -static Accessibility_Role -spi_role_from_atk_role (AtkRole role) +Accessibility_Role +spi_accessible_role_from_atk_role (AtkRole role) { static gboolean is_initialized = FALSE; static Accessibility_Role spi_role_table [ATK_ROLE_LAST_DEFINED]; @@ -384,14 +403,82 @@ static CORBA_char * impl_accessibility_accessible_get_role_name (PortableServer_Servant servant, CORBA_Environment *ev) { + const gchar *role_name; AtkRole role; AtkObject *object = get_atkobject_from_servant (servant); - g_return_val_if_fail (object != NULL, 0); + g_return_val_if_fail (object != NULL, NULL); role = atk_object_get_role (object); - return CORBA_string_dup (atk_role_get_name (role)); + role_name = atk_role_get_name (role); + if (role_name) + return CORBA_string_dup (role_name); + else + return CORBA_string_dup (""); +} + +/* + * CORBA Accessibility::Accessible::getLocalizedRole method implementation + */ +static CORBA_char * +impl_accessibility_accessible_get_local_role_name (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + const gchar *role_name; + AtkRole role; + AtkObject *object = get_atkobject_from_servant (servant); + + g_return_val_if_fail (object != NULL, NULL); + + role = atk_object_get_role (object); + + role_name = atk_role_get_localized_name (role); + if (role_name) + return CORBA_string_dup (role_name); + else + return CORBA_string_dup (""); +} + +static Accessibility_Accessible +impl_accessibility_accessible_get_application (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + return spi_accessible_new_return (atk_get_root (), FALSE, ev); +} + +static Accessibility_AttributeSet* +impl_accessibility_accessible_get_attributes (PortableServer_Servant servant, + CORBA_Environment *ev) +{ + Accessibility_AttributeSet *retval; + AtkAttributeSet *attributes = NULL; + AtkAttribute *attr = NULL; + gint n_attributes = 0; + gint i; + + AtkObject *object = get_atkobject_from_servant (servant); + + g_return_val_if_fail (object != NULL, NULL); + attributes = atk_object_get_attributes (object); + + bonobo_return_val_if_fail (attributes != NULL, NULL, ev); + n_attributes = g_slist_length (attributes); + + retval = CORBA_sequence_CORBA_string__alloc (); + retval->_length = retval->_maximum = n_attributes; + retval->_buffer = CORBA_sequence_CORBA_string_allocbuf (n_attributes); + CORBA_sequence_set_release (retval, CORBA_TRUE); + + for (i = 0; i < n_attributes; ++i) + { + attr = g_slist_nth_data (attributes, i); + retval->_buffer[i] = CORBA_string_dup (g_strconcat (attr->name, ":", attr->value, NULL)); + } + + atk_attribute_set_free (attributes); + + return retval; } static void @@ -413,6 +500,9 @@ spi_accessible_class_init (SpiAccessibleClass *klass) epv->getState = impl_accessibility_accessible_get_state; epv->getRole = impl_accessibility_accessible_get_role; epv->getRoleName = impl_accessibility_accessible_get_role_name; + epv->getLocalizedRoleName = impl_accessibility_accessible_get_local_role_name; + epv->getApplication = impl_accessibility_accessible_get_application; + epv->getAttributes = impl_accessibility_accessible_get_attributes; } static void @@ -423,7 +513,7 @@ spi_accessible_init (SpiAccessible *accessible) BONOBO_TYPE_FUNC_FULL (SpiAccessible, Accessibility_Accessible, PARENT_TYPE, - spi_accessible); + spi_accessible) static GHashTable *public_corba_refs = NULL; @@ -532,6 +622,27 @@ spi_accessible_construct (GType type, AtkObject *o) BONOBO_OBJECT (spi_value_interface_new (o))); } + if (ATK_IS_STREAMABLE_CONTENT (o)) + { + bonobo_object_add_interface (bonobo_object (retval), + BONOBO_OBJECT (spi_streamable_interface_new (o))); + } + if (ATK_IS_DOCUMENT (o)) + { + bonobo_object_add_interface (bonobo_object (retval), + BONOBO_OBJECT (spi_document_interface_new (o))); + } + if (ATK_IS_HYPERLINK_IMPL (o)) + { + /* !!! the cast below is used instead of the ATK_HYPERLINK macro, since + the object 'o' is not really a hyperlink, but is in fact an AtkHyperlinkImpl. + Ouch. This works since it gets cast back to GObject, but it's nasty and needs + to be cleaned up. + */ + bonobo_object_add_interface (bonobo_object (retval), + BONOBO_OBJECT (spi_hyperlink_new ((AtkHyperlink*)o))); + } + return retval; }