summaryrefslogtreecommitdiff
path: root/atspi/atspi-stateset.c
diff options
context:
space:
mode:
Diffstat (limited to 'atspi/atspi-stateset.c')
-rw-r--r--atspi/atspi-stateset.c165
1 files changed, 161 insertions, 4 deletions
diff --git a/atspi/atspi-stateset.c b/atspi/atspi-stateset.c
index 0da98b02..4cba34e2 100644
--- a/atspi/atspi-stateset.c
+++ b/atspi/atspi-stateset.c
@@ -61,8 +61,30 @@ atspi_state_set_class_init (AtspiStateSetClass* klass)
{
}
+/*
+ * atspi_state_set_new:
+ *
+ * @states: (element-type AtspiStateType): An array of states with which to initialize
+ * the state set.
+ *
+ * Returns: A new #AtspiStateSet with the given states.
+ **/
+AtspiStateSet *
+atspi_state_set_new (GArray *states)
+{
+ AtspiStateSet *set = g_object_new (ATSPI_TYPE_STATE_SET, NULL);
+ gint i;
+
+ if (!set || !states)
+ return set;
+
+ for (i = 0; i < states->len; i++)
+ atspi_state_set_add (set, g_array_index (states, AtspiStateType, i));
+ return states;
+}
+
AtspiStateSet *
-atspi_state_set_new (AtspiAccessible *accessible, gint64 states)
+_atspi_state_set_new_internal (AtspiAccessible *accessible, gint64 states)
{
AtspiStateSet *set;
@@ -74,11 +96,13 @@ atspi_state_set_new (AtspiAccessible *accessible, gint64 states)
return set;
}
-void atspi_state_set_set_by_name (AtspiStateSet *set, const gchar *name, gboolean enabled)
+void
+atspi_state_set_set_by_name (AtspiStateSet *set, const gchar *name, gboolean enabled)
{
gint i = 0;
- if (!(set->accessible->cached_properties & ATSPI_CACHE_STATES))
+ if (set->accessible &&
+ !(set->accessible->cached_properties & ATSPI_CACHE_STATES))
return;
/* TODO: This could perhaps be optimized */
@@ -102,7 +126,8 @@ refresh_states (AtspiStateSet *set)
GArray *state_array;
dbus_uint32_t *states;
- if ((set->accessible->cached_properties & ATSPI_CACHE_STATES))
+ if (!set->accessible ||
+ (set->accessible->cached_properties & ATSPI_CACHE_STATES))
return;
if (!_atspi_dbus_call (set->accessible, atspi_interface_accessible, "GetState", NULL, "=>au", &state_array))
@@ -116,6 +141,46 @@ refresh_states (AtspiStateSet *set)
}
/**
+ * atspi_state_set_add:
+ *
+ * @set: a pointer to the #AtspiStateSet object on which to operate.
+ * @state: an #AtspiStateType to be added to the specified #AtspiStateSet.
+ *
+ * Add a particular #AtspiState to an #AtspiStateSet (i.e. set the
+ * given state to #TRUE in the stateset.
+ *
+ **/
+void
+atspi_state_set_add (AtspiStateSet *set, AtspiStateType state)
+{
+ g_return_if_fail (set != NULL);
+ set->states |= (1 << state);
+}
+
+/**
+ * atspi_state_set_compare:
+ * @set: a pointer to the first #AtspiStateSet object on which to operate.
+ * @set: a pointer to the second #AtspiStateSet setect on which to operate.
+ *
+ * Determine the differences between two instances of #AtspiStateSet.
+ *.
+ * @see AtspiStateSet_equals().
+ *
+ * Returns: (transfer full): an #AtspiStateSet object containing all states
+ * contained on one of the two sets but not the other.
+ *
+ **/
+AtspiStateSet *
+atspi_state_set_compare (AtspiStateSet *set,
+ AtspiStateSet *set2)
+{
+ g_return_val_if_fail (set != NULL, NULL);
+ g_return_val_if_fail (set2 != NULL, NULL);
+
+ return _atspi_state_set_new_internal (NULL, set->states ^ set2->states);
+}
+
+/**
* atspi_state_set_contains:
* @set: a pointer to the #AtspiStateSet object on which to operate.
* @state: an #AtspiStateType for which the specified #AtspiStateSet
@@ -135,3 +200,95 @@ atspi_state_set_contains (AtspiStateSet *set,
refresh_states (set);
return (set->states & (1 << state)) ? TRUE : FALSE;
}
+
+/**
+ * atspi_state_set_equals:
+ * @set: a pointer to the first #AtspiStateSet object on which to operate.
+ * @set2: a pointer to the second #AtspiStateSet object on which to operate.
+ *
+ * Determine whether two instances of #AtspiStateSet are equivalent (i.e.
+ * consist of the same #AtspiStates). Useful for checking multiple
+ * state variables at once; construct the target state then compare against it.
+ *
+ * @see AtspiStateSet_compare().
+ *
+ * Returns: #TRUE if the two #AtspiStateSets are equivalent,
+ * otherwise #FALSE.
+ *
+ **/
+gboolean
+atspi_state_set_equals (AtspiStateSet *set,
+ AtspiStateSet *set2)
+{
+ if (set == set2)
+ return TRUE;
+ if (set == NULL || set2 == NULL)
+ return FALSE;
+ return (set->states == set2->states);
+}
+
+/**
+ * atspi_state_set_get_states:
+ *
+ * @set: The #AtspiStateSet to be queried.
+ *
+ * Return the states in an #AtspiStateSet as an array.
+ *
+ * Returns: (element-type AtspiStateType) (transfer full): A #GArray of state
+ * types representing the current state.
+ **/
+GArray *
+atspi_state_set_get_states (AtspiStateSet *set)
+{
+ gint i = 0;
+ guint64 val = 1;
+ GArray *ret;
+
+ g_return_val_if_fail (set != NULL, NULL);
+ refresh_states (set);
+ ret = g_array_new (TRUE, TRUE, sizeof (AtspiStateType));
+ if (!ret)
+ return NULL;
+ for (i = 0; i < 64; i++)
+ {
+ if (set->states & val)
+ {
+ GArray *new_array = g_array_append_val (ret, i);
+ if (new_array)
+ ret = new_array;
+ }
+ val <<= 1;
+ }
+ return ret;
+}
+
+/**
+ * atspi_state_set_is_empty:
+ *
+ * @set: The #AtspiStateSet to query.
+ *
+ * Returns: #TRUE if the state set contains no states; #FALSE otherwise.
+ **/
+gboolean
+atspi_state_set_is_empty (AtspiStateSet *set)
+{
+ return (set->states == 0);
+}
+
+/**
+ * atspi_state_set_remove:
+ *
+ * @set: a pointer to the #AtspiStateSet object on which to operate.
+ * @state: an #AtspiStateType to remove from the specifiedn state set.
+ *
+ * Remove a particular #AtspiState to an #AtspiStateSet (i.e. set the
+ * given state to #FALSE in the stateset.)
+ *
+ **/
+void
+atspi_state_set_remove (AtspiStateSet *set, AtspiStateType state)
+{
+ g_return_if_fail (set != NULL);
+ set->states &= ~(1 << state);
+}
+