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.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
24 /* stateset.c : implements the StateSet interface */
28 #include "spi-stateset.h"
32 static Accessibility_StateType *accessible_state_types = NULL;
33 static AtkStateType *atk_state_types = NULL;
37 spi_init_state_type_tables (void)
41 if (accessible_state_types || atk_state_types)
43 if (!accessible_state_types)
44 accessible_state_types = g_new (Accessibility_StateType, ATK_STATE_LAST_DEFINED);
46 atk_state_types = g_new (AtkStateType, Accessibility_STATE_LAST_DEFINED);
47 g_return_val_if_fail (accessible_state_types, FALSE);
48 g_return_val_if_fail (atk_state_types, FALSE);
50 for (i = 0; i < Accessibility_STATE_LAST_DEFINED; i++)
52 atk_state_types[i] = ATK_STATE_INVALID;
55 for (i=0; i < ATK_STATE_LAST_DEFINED; i++)
57 accessible_state_types[i] = Accessibility_STATE_INVALID;
60 accessible_state_types[ATK_STATE_ACTIVE] = Accessibility_STATE_ACTIVE;
61 atk_state_types[Accessibility_STATE_ACTIVE] = ATK_STATE_ACTIVE;
62 accessible_state_types[ATK_STATE_ARMED] = Accessibility_STATE_ARMED;
63 atk_state_types[Accessibility_STATE_ARMED] = ATK_STATE_ARMED;
64 accessible_state_types[ATK_STATE_BUSY] = Accessibility_STATE_BUSY;
65 atk_state_types[Accessibility_STATE_BUSY] = ATK_STATE_BUSY;
66 accessible_state_types[ATK_STATE_CHECKED] = Accessibility_STATE_CHECKED;
67 atk_state_types[Accessibility_STATE_CHECKED] = ATK_STATE_CHECKED;
68 accessible_state_types[ATK_STATE_DEFUNCT] = Accessibility_STATE_DEFUNCT;
69 atk_state_types[Accessibility_STATE_DEFUNCT] = ATK_STATE_DEFUNCT;
70 accessible_state_types[ATK_STATE_EDITABLE] = Accessibility_STATE_EDITABLE;
71 atk_state_types[Accessibility_STATE_EDITABLE] = ATK_STATE_EDITABLE;
72 accessible_state_types[ATK_STATE_ENABLED] = Accessibility_STATE_ENABLED;
73 atk_state_types[Accessibility_STATE_ENABLED] = ATK_STATE_ENABLED;
74 accessible_state_types[ATK_STATE_EXPANDABLE] = Accessibility_STATE_EXPANDABLE;
75 atk_state_types[Accessibility_STATE_EXPANDABLE] = ATK_STATE_EXPANDABLE;
76 accessible_state_types[ATK_STATE_EXPANDED] = Accessibility_STATE_EXPANDED;
77 atk_state_types[Accessibility_STATE_EXPANDED] = ATK_STATE_EXPANDED;
78 accessible_state_types[ATK_STATE_FOCUSABLE] = Accessibility_STATE_FOCUSABLE;
79 atk_state_types[Accessibility_STATE_FOCUSABLE] = ATK_STATE_FOCUSABLE;
80 accessible_state_types[ATK_STATE_FOCUSED] = Accessibility_STATE_FOCUSED;
81 atk_state_types[Accessibility_STATE_FOCUSED] = ATK_STATE_FOCUSED;
82 accessible_state_types[ATK_STATE_HORIZONTAL] = Accessibility_STATE_HORIZONTAL;
83 atk_state_types[Accessibility_STATE_HORIZONTAL] = ATK_STATE_HORIZONTAL;
84 accessible_state_types[ATK_STATE_ICONIFIED] = Accessibility_STATE_ICONIFIED;
85 atk_state_types[Accessibility_STATE_ICONIFIED] = ATK_STATE_ICONIFIED;
86 accessible_state_types[ATK_STATE_MODAL] = Accessibility_STATE_MODAL;
87 atk_state_types[Accessibility_STATE_MODAL] = ATK_STATE_MODAL;
88 accessible_state_types[ATK_STATE_MULTI_LINE] = Accessibility_STATE_MULTI_LINE;
89 atk_state_types[Accessibility_STATE_MULTI_LINE] = ATK_STATE_MULTI_LINE;
90 accessible_state_types[ATK_STATE_MULTISELECTABLE] = Accessibility_STATE_MULTISELECTABLE;
91 atk_state_types[Accessibility_STATE_MULTISELECTABLE] = ATK_STATE_MULTISELECTABLE;
92 accessible_state_types[ATK_STATE_OPAQUE] = Accessibility_STATE_OPAQUE;
93 atk_state_types[Accessibility_STATE_OPAQUE] = ATK_STATE_OPAQUE;
94 accessible_state_types[ATK_STATE_PRESSED] = Accessibility_STATE_PRESSED;
95 atk_state_types[Accessibility_STATE_PRESSED] = ATK_STATE_PRESSED;
96 accessible_state_types[ATK_STATE_RESIZABLE] = Accessibility_STATE_RESIZABLE;
97 atk_state_types[Accessibility_STATE_RESIZABLE] = ATK_STATE_RESIZABLE;
98 accessible_state_types[ATK_STATE_SELECTABLE] = Accessibility_STATE_SELECTABLE;
99 atk_state_types[Accessibility_STATE_SELECTABLE] = ATK_STATE_SELECTABLE;
100 accessible_state_types[ATK_STATE_SELECTED] = Accessibility_STATE_SELECTED;
101 atk_state_types[Accessibility_STATE_SELECTED] = ATK_STATE_SELECTED;
102 accessible_state_types[ATK_STATE_SENSITIVE] = Accessibility_STATE_SENSITIVE;
103 atk_state_types[Accessibility_STATE_SENSITIVE] = ATK_STATE_SENSITIVE;
104 accessible_state_types[ATK_STATE_SHOWING] = Accessibility_STATE_SHOWING;
105 atk_state_types[Accessibility_STATE_SHOWING] = ATK_STATE_SHOWING;
106 accessible_state_types[ATK_STATE_SINGLE_LINE] = Accessibility_STATE_SINGLE_LINE;
107 atk_state_types[Accessibility_STATE_SINGLE_LINE] = ATK_STATE_SINGLE_LINE;
108 accessible_state_types[ATK_STATE_STALE] = Accessibility_STATE_STALE;
109 atk_state_types[Accessibility_STATE_STALE] = ATK_STATE_STALE;
110 accessible_state_types[ATK_STATE_TRANSIENT] = Accessibility_STATE_TRANSIENT;
111 atk_state_types[Accessibility_STATE_TRANSIENT] = ATK_STATE_TRANSIENT;
112 accessible_state_types[ATK_STATE_VERTICAL] = Accessibility_STATE_VERTICAL;
113 atk_state_types[Accessibility_STATE_VERTICAL] = ATK_STATE_VERTICAL;
114 accessible_state_types[ATK_STATE_VISIBLE] = Accessibility_STATE_VISIBLE;
115 atk_state_types[Accessibility_STATE_VISIBLE] = ATK_STATE_VISIBLE;
116 accessible_state_types[ATK_STATE_MANAGES_DESCENDANTS] = Accessibility_STATE_MANAGES_DESCENDANTS;
117 atk_state_types[Accessibility_STATE_MANAGES_DESCENDANTS] = ATK_STATE_MANAGES_DESCENDANTS;
118 accessible_state_types[ATK_STATE_INDETERMINATE] = Accessibility_STATE_INDETERMINATE;
119 atk_state_types[Accessibility_STATE_INDETERMINATE] = ATK_STATE_INDETERMINATE;
120 accessible_state_types[ATK_STATE_TRUNCATED] = Accessibility_STATE_TRUNCATED;
121 atk_state_types[Accessibility_STATE_TRUNCATED] = ATK_STATE_TRUNCATED;
122 accessible_state_types[ATK_STATE_REQUIRED] = Accessibility_STATE_REQUIRED;
123 atk_state_types[Accessibility_STATE_REQUIRED] = ATK_STATE_REQUIRED;
124 accessible_state_types[ATK_STATE_INVALID_ENTRY] = Accessibility_STATE_INVALID_ENTRY;
125 atk_state_types[Accessibility_STATE_INVALID_ENTRY] = ATK_STATE_INVALID_ENTRY;
126 accessible_state_types[ATK_STATE_SUPPORTS_AUTOCOMPLETION] = Accessibility_STATE_SUPPORTS_AUTOCOMPLETION;
127 atk_state_types[Accessibility_STATE_SUPPORTS_AUTOCOMPLETION] = ATK_STATE_SUPPORTS_AUTOCOMPLETION;
128 accessible_state_types[ATK_STATE_SELECTABLE_TEXT] = Accessibility_STATE_SELECTABLE_TEXT;
129 atk_state_types[Accessibility_STATE_SELECTABLE_TEXT] = ATK_STATE_SELECTABLE_TEXT;
130 accessible_state_types[ATK_STATE_DEFAULT] = Accessibility_STATE_IS_DEFAULT;
131 atk_state_types[Accessibility_STATE_IS_DEFAULT] = ATK_STATE_DEFAULT;
132 accessible_state_types[ATK_STATE_VISITED] = Accessibility_STATE_VISITED;
133 atk_state_types[Accessibility_STATE_VISITED] = ATK_STATE_VISITED;
139 static inline AtkState
140 state_spi_to_atk (Accessibility_StateType state)
143 if (idx < Accessibility_STATE_LAST_DEFINED)
144 return atk_state_types [idx];
146 return ATK_STATE_INVALID;
150 spi_atk_state_from_spi_state (Accessibility_StateType state)
152 spi_init_state_type_tables ();
153 return state_spi_to_atk (state);
157 spi_state_set_cache_from_sequence (GArray *seq)
161 AtkStateType *states;
163 spi_init_state_type_tables ();
165 states = g_newa (AtkStateType, seq->len);
166 for (i = 0; i < seq->len; i++)
167 states [i] = state_spi_to_atk (g_array_index (seq, dbus_int32_t, i));
169 set = atk_state_set_new ();
170 atk_state_set_add_states (set, states, seq->len);
172 g_array_free (seq, TRUE);
177 spi_atk_state_to_dbus_array (AtkObject * object, dbus_uint32_t * array)
179 AtkStateSet *set = atk_object_ref_state_set (object);
180 spi_atk_state_set_to_dbus_array (set, array);
181 g_object_unref (set);
185 spi_atk_state_set_to_dbus_array (AtkStateSet * set, dbus_uint32_t * array)
193 spi_init_state_type_tables ();
195 g_assert (ATK_STATE_LAST_DEFINED <= 64);
196 for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
198 if (atk_state_set_contains_state (set, i))
200 int a = accessible_state_types[i];
202 BITARRAY_SET (array, a);