1 #include "atspi-private.h"
3 static void atspi_state_set_class_init (AtspiStateSetClass *klass);
5 G_DEFINE_TYPE (AtspiStateSet, atspi_state_set, G_TYPE_OBJECT)
7 static const char *state_names [] =
40 "manages-descendants",
46 "supports-autocompletion",
54 atspi_state_set_init (AtspiStateSet *set)
60 atspi_state_set_class_init (AtspiStateSetClass* klass)
65 * atspi_state_set_new:
67 * @states: (element-type AtspiStateType): An array of states with which to initialize
70 * Returns: A new #AtspiStateSet with the given states.
73 atspi_state_set_new (GArray *states)
75 AtspiStateSet *set = g_object_new (ATSPI_TYPE_STATE_SET, NULL);
81 for (i = 0; i < states->len; i++)
82 atspi_state_set_add (set, g_array_index (states, AtspiStateType, i));
87 _atspi_state_set_new_internal (AtspiAccessible *accessible, gint64 states)
91 set = g_object_new (ATSPI_TYPE_STATE_SET, NULL);
92 g_return_val_if_fail (set != NULL, NULL);
94 set->accessible = accessible;
100 atspi_state_set_set_by_name (AtspiStateSet *set, const gchar *name, gboolean enabled)
104 if (set->accessible &&
105 !(set->accessible->cached_properties & ATSPI_CACHE_STATES))
108 /* TODO: This could perhaps be optimized */
109 for (i = 0; state_names [i]; i++)
111 if (!strcmp (state_names [i], name))
114 set->states |= (1 << i);
116 set->states &= ~(1 << i);
120 g_warning ("at-spi: Attempt to set unknown state '%s'", name);
124 refresh_states (AtspiStateSet *set)
127 dbus_uint32_t *states;
129 if (!set->accessible ||
130 (set->accessible->cached_properties & ATSPI_CACHE_STATES))
133 if (!_atspi_dbus_call (set->accessible, atspi_interface_accessible, "GetState", NULL, "=>au", &state_array))
136 states = (dbus_uint32_t *) state_array->data;
138 set->states = ((gint64)states [1]) << 32;
139 set->states += states [0];
140 g_array_free (state_array, TRUE);
144 * atspi_state_set_add:
146 * @set: a pointer to the #AtspiStateSet object on which to operate.
147 * @state: an #AtspiStateType to be added to the specified #AtspiStateSet.
149 * Add a particular #AtspiState to an #AtspiStateSet (i.e. set the
150 * given state to #TRUE in the stateset.
154 atspi_state_set_add (AtspiStateSet *set, AtspiStateType state)
156 g_return_if_fail (set != NULL);
157 set->states |= (1 << state);
161 * atspi_state_set_compare:
162 * @set: a pointer to the first #AtspiStateSet object on which to operate.
163 * @set: a pointer to the second #AtspiStateSet setect on which to operate.
165 * Determine the differences between two instances of #AtspiStateSet.
167 * @see AtspiStateSet_equals().
169 * Returns: (transfer full): an #AtspiStateSet object containing all states
170 * contained on one of the two sets but not the other.
174 atspi_state_set_compare (AtspiStateSet *set,
177 g_return_val_if_fail (set != NULL, NULL);
178 g_return_val_if_fail (set2 != NULL, NULL);
180 return _atspi_state_set_new_internal (NULL, set->states ^ set2->states);
184 * atspi_state_set_contains:
185 * @set: a pointer to the #AtspiStateSet object on which to operate.
186 * @state: an #AtspiStateType for which the specified #AtspiStateSet
189 * Determine whether a given #AtspiStateSet includes a given state; that is,
190 * whether @state is true for the stateset in question.
192 * Returns: #TRUE if @state is true/included in the given #AtspiStateSet,
197 atspi_state_set_contains (AtspiStateSet *set,
198 AtspiStateType state)
200 refresh_states (set);
201 return (set->states & (1 << state)) ? TRUE : FALSE;
205 * atspi_state_set_equals:
206 * @set: a pointer to the first #AtspiStateSet object on which to operate.
207 * @set2: a pointer to the second #AtspiStateSet object on which to operate.
209 * Determine whether two instances of #AtspiStateSet are equivalent (i.e.
210 * consist of the same #AtspiStates). Useful for checking multiple
211 * state variables at once; construct the target state then compare against it.
213 * @see AtspiStateSet_compare().
215 * Returns: #TRUE if the two #AtspiStateSets are equivalent,
220 atspi_state_set_equals (AtspiStateSet *set,
225 if (set == NULL || set2 == NULL)
227 return (set->states == set2->states);
231 * atspi_state_set_get_states:
233 * @set: The #AtspiStateSet to be queried.
235 * Return the states in an #AtspiStateSet as an array.
237 * Returns: (element-type AtspiStateType) (transfer full): A #GArray of state
238 * types representing the current state.
241 atspi_state_set_get_states (AtspiStateSet *set)
247 g_return_val_if_fail (set != NULL, NULL);
248 refresh_states (set);
249 ret = g_array_new (TRUE, TRUE, sizeof (AtspiStateType));
252 for (i = 0; i < 64; i++)
254 if (set->states & val)
256 GArray *new_array = g_array_append_val (ret, i);
266 * atspi_state_set_is_empty:
268 * @set: The #AtspiStateSet to query.
270 * Returns: #TRUE if the state set contains no states; #FALSE otherwise.
273 atspi_state_set_is_empty (AtspiStateSet *set)
275 return (set->states == 0);
279 * atspi_state_set_remove:
281 * @set: a pointer to the #AtspiStateSet object on which to operate.
282 * @state: an #AtspiStateType to remove from the specifiedn state set.
284 * Remove a particular #AtspiState to an #AtspiStateSet (i.e. set the
285 * given state to #FALSE in the stateset.)
289 atspi_state_set_remove (AtspiStateSet *set, AtspiStateType state)
291 g_return_if_fail (set != NULL);
292 set->states &= ~(1 << state);