2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001, 2002 Sun Microsystems Inc.,
6 * Copyright 2001, 2002 Ximian, Inc.
7 * Copyright 2010, 2011 Novell, Inc.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 * Boston, MA 02111-1307, USA.
25 #include "atspi-private.h"
27 static void atspi_state_set_class_init (AtspiStateSetClass *klass);
29 G_DEFINE_TYPE (AtspiStateSet, atspi_state_set, G_TYPE_OBJECT)
31 static const char *state_names [] =
64 "manages-descendants",
70 "supports-autocompletion",
78 atspi_state_set_init (AtspiStateSet *set)
84 atspi_state_set_class_init (AtspiStateSetClass* klass)
89 * atspi_state_set_new:
91 * @states: (element-type AtspiStateType): An array of states with which the
92 * method initializes the state set.
94 * Generates an #AtspiStateSet with the given @states.
96 * Returns: A new #AtspiStateSet with the given states.
99 atspi_state_set_new (GArray *states)
101 AtspiStateSet *set = g_object_new (ATSPI_TYPE_STATE_SET, NULL);
107 for (i = 0; i < states->len; i++)
108 atspi_state_set_add (set, g_array_index (states, AtspiStateType, i));
113 _atspi_state_set_new_internal (AtspiAccessible *accessible, gint64 states)
117 set = g_object_new (ATSPI_TYPE_STATE_SET, NULL);
118 g_return_val_if_fail (set != NULL, NULL);
120 set->accessible = accessible;
121 set->states = states;
126 * atspi_state_set_set_by_name:
128 * @set: a pointer to the #AtspiStateSet object on which to operate.
130 * @name: a string corresponding to a state name.
132 * @enabled: if #TRUE, @name should be enabled in the @set in question; otherwise, it
133 * should be disabled.
135 * Enables/disables a state in an #AtspiStateSet according to its @name.
138 atspi_state_set_set_by_name (AtspiStateSet *set, const gchar *name, gboolean enabled)
142 if (set->accessible &&
143 !(set->accessible->cached_properties & ATSPI_CACHE_STATES))
146 /* TODO: This could perhaps be optimized */
147 for (i = 0; state_names [i]; i++)
149 if (!strcmp (state_names [i], name))
152 set->states |= ((gint64)1 << i);
154 set->states &= ~((gint64)1 << i);
158 g_warning ("at-spi: Attempt to set unknown state '%s'", name);
162 refresh_states (AtspiStateSet *set)
165 dbus_uint32_t *states;
167 if (!set->accessible ||
168 (set->accessible->cached_properties & ATSPI_CACHE_STATES))
171 if (!_atspi_dbus_call (set->accessible, atspi_interface_accessible, "GetState", NULL, "=>au", &state_array))
174 states = (dbus_uint32_t *) state_array->data;
176 set->states = ((gint64)states [1]) << 32;
177 set->states |= (gint64) states [0];
178 g_array_free (state_array, TRUE);
182 * atspi_state_set_add:
184 * @set: a pointer to the #AtspiStateSet object on which to operate.
186 * @state: an #AtspiStateType to be added to the specified #AtspiStateSet.
188 * Adds a particular #AtspiState to an #AtspiStateSet (i.e. sets the
189 * given state to #TRUE in the stateset).
193 atspi_state_set_add (AtspiStateSet *set, AtspiStateType state)
195 g_return_if_fail (set != NULL);
196 set->states |= (((gint64)1) << state);
200 * atspi_state_set_compare:
202 * @set: a pointer to the first #AtspiStateSet object on which to operate.
204 * @set2: a pointer to the second #AtspiStateSet object on which to operate.
206 * Determines the differences between two instances of #AtspiStateSet.
208 * @see #atspi_state_set_equals.
210 * Returns: (transfer full): an #AtspiStateSet object containing all states
211 * contained on one of the two sets but not the other.
215 atspi_state_set_compare (AtspiStateSet *set,
218 g_return_val_if_fail (set != NULL, NULL);
219 g_return_val_if_fail (set2 != NULL, NULL);
221 return _atspi_state_set_new_internal (NULL, set->states ^ set2->states);
225 * atspi_state_set_contains:
227 * @set: a pointer to the #AtspiStateSet object on which to operate.
229 * @state: an #AtspiStateType for which the specified #AtspiStateSet
232 * Determines whether a given #AtspiStateSet includes a given state; that is,
233 * whether @state is true for the @set in question.
235 * Returns: #TRUE if @state is true/included in the given #AtspiStateSet,
240 atspi_state_set_contains (AtspiStateSet *set,
241 AtspiStateType state)
245 refresh_states (set);
246 return (set->states & ((gint64)1 << state)) ? TRUE : FALSE;
250 * atspi_state_set_equals:
252 * @set: a pointer to the first #AtspiStateSet object on which to operate.
254 * @set2: a pointer to the second #AtspiStateSet object on which to operate.
256 * Determines whether two instances of #AtspiStateSet are equivalent (i.e.
257 * consist of the same #AtspiStates). Useful for checking multiple
258 * state variables at once.
260 * @see #atspi_state_set_compare.
262 * Returns: #TRUE if the two #AtspiStateSets are equivalent,
267 atspi_state_set_equals (AtspiStateSet *set,
272 if (set == NULL || set2 == NULL)
274 return (set->states == set2->states);
278 * atspi_state_set_get_states:
280 * @set: The #AtspiStateSet to be queried.
282 * Returns the states in an #AtspiStateSet as an array.
284 * Returns: (element-type AtspiStateType) (transfer full): A #GArray of state
285 * types representing the current state.
288 atspi_state_set_get_states (AtspiStateSet *set)
294 g_return_val_if_fail (set != NULL, NULL);
295 refresh_states (set);
296 ret = g_array_new (TRUE, TRUE, sizeof (AtspiStateType));
299 for (i = 0; i < 64; i++)
301 if (set->states & val)
303 GArray *new_array = g_array_append_val (ret, i);
313 * atspi_state_set_is_empty:
315 * @set: The #AtspiStateSet to query.
317 * Returns: #TRUE if the state set contains no states; #FALSE otherwise.
320 atspi_state_set_is_empty (AtspiStateSet *set)
322 return (set->states == 0);
326 * atspi_state_set_remove:
328 * @set: a pointer to the #AtspiStateSet object on which to operate.
330 * @state: an #AtspiStateType to remove from the specified @set.
332 * Removes a particular #AtspiState to an #AtspiStateSet (i.e. sets the
333 * given state to #FALSE in the stateset.)
337 atspi_state_set_remove (AtspiStateSet *set, AtspiStateType state)
339 g_return_if_fail (set != NULL);
340 set->states &= ~((gint64)1 << state);