*/
#include <stdlib.h> /* for malloc */
+#include <libspi/stateset.h>
#include <cspi/spi-private.h>
static const char *role_names [] =
"unknown",
"viewport",
"window",
-
+ NULL,
+ "header",
+ "fooler",
+ "paragraph",
+ "ruler",
+ "application"
};
#define MAX_ROLES (sizeof (role_names) / sizeof (char *))
role_table [Accessibility_ROLE_FOOTER] = SPI_ROLE_FOOTER;
role_table [Accessibility_ROLE_PARAGRAPH] = SPI_ROLE_PARAGRAPH;
role_table [Accessibility_ROLE_RULER] = SPI_ROLE_RULER;
- role_table [Accessibility_ROLE_LAST_DEFINED] = SPI_ROLE_EXTENDED;
+ role_table [Accessibility_ROLE_APPLICATION] = SPI_ROLE_APPLICATION;
+ role_table [Accessibility_ROLE_AUTOCOMPLETE] = SPI_ROLE_AUTOCOMPLETE;
return TRUE;
}
return cspi_role;
}
-static SPIBoolean
-init_state_table (Accessibility_StateType *state_table)
-{
- int i;
-
- for (i = 0; i < Accessibility_STATE_LAST_DEFINED; i++)
- state_table[i] = SPI_STATE_INVALID;
-
- state_table[SPI_STATE_ACTIVE] = Accessibility_STATE_ACTIVE;
- state_table[SPI_STATE_ARMED] = Accessibility_STATE_ARMED;
- state_table[SPI_STATE_BUSY] = Accessibility_STATE_BUSY;
- state_table[SPI_STATE_CHECKED] = Accessibility_STATE_CHECKED;
- state_table[SPI_STATE_DEFUNCT] = Accessibility_STATE_DEFUNCT;
- state_table[SPI_STATE_EDITABLE] = Accessibility_STATE_EDITABLE;
- state_table[SPI_STATE_ENABLED] = Accessibility_STATE_ENABLED;
- state_table[SPI_STATE_EXPANDABLE] = Accessibility_STATE_EXPANDABLE;
- state_table[SPI_STATE_EXPANDED] = Accessibility_STATE_EXPANDED;
- state_table[SPI_STATE_FOCUSABLE] = Accessibility_STATE_FOCUSABLE;
- state_table[SPI_STATE_FOCUSED] = Accessibility_STATE_FOCUSED;
- state_table[SPI_STATE_HORIZONTAL] = Accessibility_STATE_HORIZONTAL;
- state_table[SPI_STATE_ICONIFIED] = Accessibility_STATE_ICONIFIED;
- state_table[SPI_STATE_MODAL] = Accessibility_STATE_MODAL;
- state_table[SPI_STATE_MULTI_LINE] = Accessibility_STATE_MULTI_LINE;
- state_table[SPI_STATE_MULTISELECTABLE] = Accessibility_STATE_MULTISELECTABLE;
- state_table[SPI_STATE_OPAQUE] = Accessibility_STATE_OPAQUE;
- state_table[SPI_STATE_PRESSED] = Accessibility_STATE_PRESSED;
- state_table[SPI_STATE_RESIZABLE] = Accessibility_STATE_RESIZABLE;
- state_table[SPI_STATE_SELECTABLE] = Accessibility_STATE_SELECTABLE;
- state_table[SPI_STATE_SELECTED] = Accessibility_STATE_SELECTED;
- state_table[SPI_STATE_SENSITIVE] = Accessibility_STATE_SENSITIVE;
- state_table[SPI_STATE_SHOWING] = Accessibility_STATE_SHOWING;
- state_table[SPI_STATE_SINGLE_LINE] = Accessibility_STATE_SINGLE_LINE;
- state_table[SPI_STATE_STALE] = Accessibility_STATE_STALE;
- state_table[SPI_STATE_TRANSIENT] = Accessibility_STATE_TRANSIENT;
- state_table[SPI_STATE_VERTICAL] = Accessibility_STATE_VERTICAL;
- state_table[SPI_STATE_VISIBLE] = Accessibility_STATE_VISIBLE;
- state_table[SPI_STATE_MANAGES_DESCENDANTS] = Accessibility_STATE_MANAGES_DESCENDANTS;
-
- return TRUE;
-}
-
-
-
-static Accessibility_StateType
-spi_state_type_from_accessible_state (AccessibleState type)
-{
- static Accessibility_StateType state_table[Accessibility_STATE_LAST_DEFINED];
- static SPIBoolean table_initialized = FALSE;
- Accessibility_StateType rv;
-
- if (!table_initialized)
- table_initialized = init_state_table (state_table);
- if (type > SPI_STATE_INVALID && type < SPI_STATE_LAST_DEFINED)
- rv = state_table[type];
- else
- rv = Accessibility_STATE_INVALID;
- return rv;
-}
-
-
-
-
/**
* AccessibleRole_getName:
* @role: an #AccessibleRole object to query.
char *
AccessibleRole_getName (AccessibleRole role)
{
- if (role < MAX_ROLES)
+ if (role < MAX_ROLES && role_names [(int) role])
{
return CORBA_string_dup (role_names [(int) role]);
}
else
{
- return g_strdup ("");
+ return CORBA_string_dup ("");
}
}
AccessibleRole
Accessible_getRole (Accessible *obj)
{
- AccessibleRole retval;
+ Accessibility_Role retval;
cspi_return_val_if_fail (obj != NULL, SPI_ROLE_INVALID);
}
/**
- * Accessible_getStateSet:
+ * Accessible_getLocalizedRoleName:
* @obj: a pointer to the #Accessible object on which to operate.
*
- * Not Yet Implemented.
+ * Get a UTF-8 string describing the (localized) role this object plays in the UI.
+ * This method will return useful values for roles that fall outside the
+ * enumeration used in Accessible_getRole ().
+ *
+ * Returns: a UTF-8 string specifying the role of this #Accessible object.
+ *
+ **/
+char *
+Accessible_getLocalizedRoleName (Accessible *obj)
+{
+ char *retval;
+
+ cspi_return_val_if_fail (obj != NULL, CORBA_string_dup ("invalid"));
+
+ retval =
+ Accessibility_Accessible_getLocalizedRoleName (CSPI_OBJREF (obj), cspi_ev ());
+
+ cspi_return_val_if_ev ("getLocalizedRoleName", CORBA_string_dup ("invalid"));
+
+ return retval;
+}
+
+/**
+ * Accessible_getStateSet:
+ * @obj: a pointer to the #Accessible object on which to operate.
*
* Returns: a pointer to an #AccessibleStateSet representing the object's current state.
**/
Accessible_getStateSet (Accessible *obj)
{
AccessibleStateSet *retval;
+ Accessibility_StateSet corba_stateset;
+ Accessibility_StateSeq *corba_seq;
cspi_return_val_if_fail (obj != NULL, NULL);
- retval = cspi_object_add (
- Accessibility_Accessible_getState (CSPI_OBJREF (obj),
- cspi_ev ()));
+ corba_stateset = Accessibility_Accessible_getState (
+ CSPI_OBJREF (obj), cspi_ev ());
+ cspi_return_val_if_ev ("getState", NULL);
+ cspi_return_val_if_fail (corba_stateset != CORBA_OBJECT_NIL, NULL);
+ cspi_return_val_if_fail (cspi_ping (corba_stateset), NULL);
+ corba_seq = Accessibility_StateSet_getStates (corba_stateset, cspi_ev ());
cspi_return_val_if_ev ("getState", NULL);
+
+ retval = spi_state_set_cache_new (corba_seq);
+
+ CORBA_free (corba_seq);
+ cspi_release_unref (corba_stateset);
+
return retval;
}
cspi_object_unref (obj);
}
+static SPIBoolean
+cspi_init_relation_type_table (AccessibleRelationType *relation_type_table)
+{
+ int i;
+ for (i = 0; i < Accessibility_RELATION_LAST_DEFINED; ++i)
+ {
+ relation_type_table [i] = SPI_RELATION_NULL;
+ }
+ relation_type_table [Accessibility_RELATION_NULL] = SPI_RELATION_NULL;
+ relation_type_table [Accessibility_RELATION_LABEL_FOR] = SPI_RELATION_LABEL_FOR;
+ relation_type_table [Accessibility_RELATION_LABELLED_BY] = SPI_RELATION_LABELED_BY;
+ relation_type_table [Accessibility_RELATION_CONTROLLER_FOR] = SPI_RELATION_CONTROLLER_FOR;
+ relation_type_table [Accessibility_RELATION_CONTROLLED_BY] = SPI_RELATION_CONTROLLED_BY;
+ relation_type_table [Accessibility_RELATION_MEMBER_OF] = SPI_RELATION_MEMBER_OF;
+ relation_type_table [Accessibility_RELATION_TOOLTIP_FOR] = SPI_RELATION_NULL;
+ relation_type_table [Accessibility_RELATION_NODE_CHILD_OF] = SPI_RELATION_NODE_CHILD_OF;
+ relation_type_table [Accessibility_RELATION_EXTENDED] = SPI_RELATION_EXTENDED;
+ relation_type_table [Accessibility_RELATION_FLOWS_TO] = SPI_RELATION_FLOWS_TO;
+ relation_type_table [Accessibility_RELATION_FLOWS_FROM] = SPI_RELATION_FLOWS_FROM;
+ relation_type_table [Accessibility_RELATION_SUBWINDOW_OF] = SPI_RELATION_SUBWINDOW_OF;
+ relation_type_table [Accessibility_RELATION_EMBEDS] = SPI_RELATION_EMBEDS;
+ relation_type_table [Accessibility_RELATION_EMBEDDED_BY] = SPI_RELATION_EMBEDDED_BY;
+ relation_type_table [Accessibility_RELATION_POPUP_FOR] = SPI_RELATION_POPUP_FOR;
+ return TRUE;
+}
+
+static AccessibleRelationType
+cspi_relation_type_from_spi_relation_type (Accessibility_RelationType type)
+{
+ /* array is sized according to IDL RelationType because IDL RelationTypes are the index */
+ static AccessibleRelationType cspi_relation_type_table [Accessibility_RELATION_LAST_DEFINED];
+ static SPIBoolean is_initialized = FALSE;
+ AccessibleRelationType cspi_type;
+ if (!is_initialized)
+ {
+ is_initialized = cspi_init_relation_type_table (cspi_relation_type_table);
+ }
+ if (type >= 0 && type < Accessibility_RELATION_LAST_DEFINED)
+ {
+ cspi_type = cspi_relation_type_table [type];
+ }
+ else
+ {
+ cspi_type = SPI_RELATION_NULL;
+ }
+ return cspi_type;
+}
/**
* AccessibleRelation_getRelationType:
* @obj: a pointer to the #AccessibleRelation object to query.
AccessibleRelationType
AccessibleRelation_getRelationType (AccessibleRelation *obj)
{
- AccessibleRelationType retval;
+ Accessibility_RelationType retval;
cspi_return_val_if_fail (obj, SPI_RELATION_NULL);
retval =
Accessibility_Relation_getRelationType (CSPI_OBJREF (obj), cspi_ev());
cspi_return_val_if_ev ("getRelationType", SPI_RELATION_NULL);
- return retval;
+ return cspi_relation_type_from_spi_relation_type (retval);
}
/**
void
AccessibleStateSet_ref (AccessibleStateSet *obj)
{
- cspi_object_ref (obj);
+ spi_state_set_cache_ref (obj);
}
/**
void
AccessibleStateSet_unref (AccessibleStateSet *obj)
{
- cspi_object_unref (obj);
+ spi_state_set_cache_unref (obj);
}
+static Accessibility_StateType
+spi_state_to_corba (AccessibleState state)
+{
+#define MAP_STATE(a) \
+ case SPI_STATE_##a: \
+ return Accessibility_STATE_##a
+
+ switch (state)
+ {
+ MAP_STATE (INVALID);
+ MAP_STATE (ACTIVE);
+ MAP_STATE (ARMED);
+ MAP_STATE (BUSY);
+ MAP_STATE (CHECKED);
+ MAP_STATE (DEFUNCT);
+ MAP_STATE (EDITABLE);
+ MAP_STATE (ENABLED);
+ MAP_STATE (EXPANDABLE);
+ MAP_STATE (EXPANDED);
+ MAP_STATE (FOCUSABLE);
+ MAP_STATE (FOCUSED);
+ MAP_STATE (HORIZONTAL);
+ MAP_STATE (ICONIFIED);
+ MAP_STATE (MODAL);
+ MAP_STATE (MULTI_LINE);
+ MAP_STATE (MULTISELECTABLE);
+ MAP_STATE (OPAQUE);
+ MAP_STATE (PRESSED);
+ MAP_STATE (RESIZABLE);
+ MAP_STATE (SELECTABLE);
+ MAP_STATE (SELECTED);
+ MAP_STATE (SENSITIVE);
+ MAP_STATE (SHOWING);
+ MAP_STATE (SINGLE_LINE);
+ MAP_STATE (STALE);
+ MAP_STATE (TRANSIENT);
+ MAP_STATE (VERTICAL);
+ MAP_STATE (VISIBLE);
+ MAP_STATE (MANAGES_DESCENDANTS);
+ MAP_STATE (INDETERMINATE);
+ default:
+ return Accessibility_STATE_INVALID;
+ }
+#undef MAP_STATE
+}
+
/**
* AccessibleStateSet_contains:
* @obj: a pointer to the #AccessibleStateSet object on which to operate.
AccessibleStateSet_contains (AccessibleStateSet *obj,
AccessibleState state)
{
- CORBA_boolean retval;
- Accessibility_StateType spi_state;
-
- cspi_return_val_if_fail (obj != NULL, FALSE);
-
- spi_state = spi_state_type_from_accessible_state (state);
- retval = Accessibility_StateSet_contains (CSPI_OBJREF (obj),
- spi_state, cspi_ev ());
-
- cspi_return_val_if_ev ("contains", FALSE);
-
- return retval;
+ return spi_state_set_cache_contains (obj, spi_state_to_corba (state));
}
/**
AccessibleStateSet_add (AccessibleStateSet *obj,
AccessibleState state)
{
- Accessibility_StateType spi_state;
-
- cspi_return_if_fail (obj != NULL);
-
- spi_state = spi_state_type_from_accessible_state (state);
- Accessibility_StateSet_add (CSPI_OBJREF (obj), spi_state, cspi_ev ());
- cspi_check_ev ("StateSet_add");
+ spi_state_set_cache_add (obj, spi_state_to_corba (state));
}
/**
AccessibleStateSet_remove (AccessibleStateSet *obj,
AccessibleState state)
{
- Accessibility_StateType spi_state;
-
- cspi_return_if_fail (obj != NULL);
-
- spi_state = spi_state_type_from_accessible_state (state);
- Accessibility_StateSet_remove (CSPI_OBJREF (obj), spi_state, cspi_ev ());
- cspi_check_ev ("StateSet_remove");
+ spi_state_set_cache_remove (obj, spi_state_to_corba (state));
}
/**
AccessibleStateSet_equals (AccessibleStateSet *obj,
AccessibleStateSet *obj2)
{
+ SPIBoolean eq;
+ AtkStateSet *cmp;
+
if (obj == obj2)
{
return TRUE;
}
- cspi_return_val_if_fail (obj != NULL, FALSE);
- cspi_return_val_if_fail (obj2 != NULL, FALSE);
+ cmp = spi_state_set_cache_xor (obj, obj2);
+ eq = spi_state_set_cache_is_empty (cmp);
+ spi_state_set_cache_unref (cmp);
- return Accessibility_StateSet_equals (CSPI_OBJREF (obj),
- CSPI_OBJREF (obj2), cspi_ev ());
+ return eq;
}
/**
AccessibleStateSet_compare (AccessibleStateSet *obj,
AccessibleStateSet *obj2)
{
- AccessibleStateSet *retval;
-
- cspi_return_val_if_fail (obj != NULL, NULL);
- cspi_return_val_if_fail (obj2 != NULL, NULL);
- retval = cspi_object_add (
- Accessibility_StateSet_compare (CSPI_OBJREF(obj), CSPI_OBJREF(obj2), cspi_ev ()));
-
- cspi_return_val_if_ev ("compare", NULL);
- return retval;
+ return spi_state_set_cache_xor (obj, obj2);
}
/**
SPIBoolean
AccessibleStateSet_isEmpty (AccessibleStateSet *obj)
{
- CORBA_boolean retval;
-
- cspi_return_val_if_fail (obj != NULL, FALSE);
- retval = Accessibility_StateSet_isEmpty (CSPI_OBJREF (obj), cspi_ev ());
-
- cspi_return_val_if_ev ("isEmpty", TRUE);
- return retval;
+ return spi_state_set_cache_is_empty (obj);
}