2.38.0
[platform/upstream/at-spi2-atk.git] / atk-adaptor / accessible-stateset.c
1 /*
2  * AT-SPI - Assistive Technology Service Provider Interface
3  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
4  *
5  * Copyright 2001, 2002 Sun Microsystems Inc.,
6  * Copyright 2001, 2002 Ximian, Inc.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
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  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  */
23
24 /* stateset.c : implements the StateSet interface */
25
26 #include "config.h"
27
28 #include "accessible-stateset.h"
29 #include "bitarray.h"
30
31 #include <stdio.h>
32
33
34 static AtspiStateType *accessible_state_types = NULL;
35 static AtkStateType *atk_state_types = NULL;
36
37
38 static gboolean
39 spi_init_state_type_tables (void)
40 {
41   gint i;
42
43   if (accessible_state_types || atk_state_types)
44     return FALSE;
45   if (!accessible_state_types)
46     accessible_state_types = g_new (AtspiStateType, ATK_STATE_LAST_DEFINED);
47   if (!atk_state_types)
48     atk_state_types = g_new (AtkStateType, ATSPI_STATE_LAST_DEFINED);
49   g_return_val_if_fail (accessible_state_types, FALSE);
50   g_return_val_if_fail (atk_state_types, FALSE);
51   
52   for (i = 0; i < ATSPI_STATE_LAST_DEFINED; i++)
53     {
54       atk_state_types[i] = ATK_STATE_INVALID;
55     }
56
57   for (i=0; i < ATK_STATE_LAST_DEFINED; i++)
58     {
59       accessible_state_types[i] = ATSPI_STATE_INVALID;  
60     }
61
62   accessible_state_types[ATK_STATE_ACTIVE] = ATSPI_STATE_ACTIVE;
63   atk_state_types[ATSPI_STATE_ACTIVE] = ATK_STATE_ACTIVE;
64   accessible_state_types[ATK_STATE_ARMED] = ATSPI_STATE_ARMED;
65   atk_state_types[ATSPI_STATE_ARMED] = ATK_STATE_ARMED;
66   accessible_state_types[ATK_STATE_BUSY] = ATSPI_STATE_BUSY;
67   atk_state_types[ATSPI_STATE_BUSY] = ATK_STATE_BUSY;
68   accessible_state_types[ATK_STATE_CHECKED] = ATSPI_STATE_CHECKED;
69   atk_state_types[ATSPI_STATE_CHECKED] = ATK_STATE_CHECKED;
70   accessible_state_types[ATK_STATE_DEFUNCT] = ATSPI_STATE_DEFUNCT;
71   atk_state_types[ATSPI_STATE_DEFUNCT] = ATK_STATE_DEFUNCT;
72   accessible_state_types[ATK_STATE_EDITABLE] = ATSPI_STATE_EDITABLE;
73   atk_state_types[ATSPI_STATE_EDITABLE] = ATK_STATE_EDITABLE;  
74   accessible_state_types[ATK_STATE_ENABLED] = ATSPI_STATE_ENABLED;
75   atk_state_types[ATSPI_STATE_ENABLED] = ATK_STATE_ENABLED;  
76   accessible_state_types[ATK_STATE_EXPANDABLE] = ATSPI_STATE_EXPANDABLE;
77   atk_state_types[ATSPI_STATE_EXPANDABLE] = ATK_STATE_EXPANDABLE;
78   accessible_state_types[ATK_STATE_EXPANDED] = ATSPI_STATE_EXPANDED;
79   atk_state_types[ATSPI_STATE_EXPANDED] = ATK_STATE_EXPANDED;
80   accessible_state_types[ATK_STATE_FOCUSABLE] = ATSPI_STATE_FOCUSABLE;
81   atk_state_types[ATSPI_STATE_FOCUSABLE] = ATK_STATE_FOCUSABLE;
82   accessible_state_types[ATK_STATE_FOCUSED] = ATSPI_STATE_FOCUSED;
83   atk_state_types[ATSPI_STATE_FOCUSED] = ATK_STATE_FOCUSED;
84   accessible_state_types[ATK_STATE_HORIZONTAL] = ATSPI_STATE_HORIZONTAL;
85   atk_state_types[ATSPI_STATE_HORIZONTAL] = ATK_STATE_HORIZONTAL;
86   accessible_state_types[ATK_STATE_ICONIFIED] = ATSPI_STATE_ICONIFIED;
87   atk_state_types[ATSPI_STATE_ICONIFIED] = ATK_STATE_ICONIFIED;
88   accessible_state_types[ATK_STATE_MODAL] = ATSPI_STATE_MODAL;
89   atk_state_types[ATSPI_STATE_MODAL] = ATK_STATE_MODAL;
90   accessible_state_types[ATK_STATE_MULTI_LINE] = ATSPI_STATE_MULTI_LINE;
91   atk_state_types[ATSPI_STATE_MULTI_LINE] = ATK_STATE_MULTI_LINE;
92   accessible_state_types[ATK_STATE_MULTISELECTABLE] = ATSPI_STATE_MULTISELECTABLE;
93   atk_state_types[ATSPI_STATE_MULTISELECTABLE] = ATK_STATE_MULTISELECTABLE;
94   accessible_state_types[ATK_STATE_OPAQUE] = ATSPI_STATE_OPAQUE;
95   atk_state_types[ATSPI_STATE_OPAQUE] = ATK_STATE_OPAQUE;
96   accessible_state_types[ATK_STATE_PRESSED] = ATSPI_STATE_PRESSED;
97   atk_state_types[ATSPI_STATE_PRESSED] = ATK_STATE_PRESSED;
98   accessible_state_types[ATK_STATE_RESIZABLE] = ATSPI_STATE_RESIZABLE;
99   atk_state_types[ATSPI_STATE_RESIZABLE] = ATK_STATE_RESIZABLE;
100   accessible_state_types[ATK_STATE_SELECTABLE] = ATSPI_STATE_SELECTABLE;
101   atk_state_types[ATSPI_STATE_SELECTABLE] = ATK_STATE_SELECTABLE;
102   accessible_state_types[ATK_STATE_SELECTED] = ATSPI_STATE_SELECTED;
103   atk_state_types[ATSPI_STATE_SELECTED] = ATK_STATE_SELECTED;
104   accessible_state_types[ATK_STATE_SENSITIVE] = ATSPI_STATE_SENSITIVE;
105   atk_state_types[ATSPI_STATE_SENSITIVE] = ATK_STATE_SENSITIVE;
106   accessible_state_types[ATK_STATE_SHOWING] = ATSPI_STATE_SHOWING;
107   atk_state_types[ATSPI_STATE_SHOWING] = ATK_STATE_SHOWING;
108   accessible_state_types[ATK_STATE_SINGLE_LINE] = ATSPI_STATE_SINGLE_LINE;
109   atk_state_types[ATSPI_STATE_SINGLE_LINE] = ATK_STATE_SINGLE_LINE;
110   accessible_state_types[ATK_STATE_STALE] = ATSPI_STATE_STALE;
111   atk_state_types[ATSPI_STATE_STALE] = ATK_STATE_STALE;
112   accessible_state_types[ATK_STATE_TRANSIENT] = ATSPI_STATE_TRANSIENT;
113   atk_state_types[ATSPI_STATE_TRANSIENT] = ATK_STATE_TRANSIENT;
114   accessible_state_types[ATK_STATE_VERTICAL] = ATSPI_STATE_VERTICAL;
115   atk_state_types[ATSPI_STATE_VERTICAL] = ATK_STATE_VERTICAL;
116   accessible_state_types[ATK_STATE_VISIBLE] = ATSPI_STATE_VISIBLE;
117   atk_state_types[ATSPI_STATE_VISIBLE] = ATK_STATE_VISIBLE;
118   accessible_state_types[ATK_STATE_MANAGES_DESCENDANTS] = ATSPI_STATE_MANAGES_DESCENDANTS;
119   atk_state_types[ATSPI_STATE_MANAGES_DESCENDANTS] = ATK_STATE_MANAGES_DESCENDANTS;
120   accessible_state_types[ATK_STATE_INDETERMINATE] = ATSPI_STATE_INDETERMINATE;
121   atk_state_types[ATSPI_STATE_INDETERMINATE] = ATK_STATE_INDETERMINATE;
122   accessible_state_types[ATK_STATE_TRUNCATED] = ATSPI_STATE_TRUNCATED;
123   atk_state_types[ATSPI_STATE_TRUNCATED] = ATK_STATE_TRUNCATED;
124   accessible_state_types[ATK_STATE_REQUIRED] = ATSPI_STATE_REQUIRED;
125   atk_state_types[ATSPI_STATE_REQUIRED] = ATK_STATE_REQUIRED;
126   accessible_state_types[ATK_STATE_INVALID_ENTRY] = ATSPI_STATE_INVALID_ENTRY;
127   atk_state_types[ATSPI_STATE_INVALID_ENTRY] = ATK_STATE_INVALID_ENTRY;
128   accessible_state_types[ATK_STATE_SUPPORTS_AUTOCOMPLETION] = ATSPI_STATE_SUPPORTS_AUTOCOMPLETION;
129   atk_state_types[ATSPI_STATE_SUPPORTS_AUTOCOMPLETION] = ATK_STATE_SUPPORTS_AUTOCOMPLETION;
130   accessible_state_types[ATK_STATE_SELECTABLE_TEXT] = ATSPI_STATE_SELECTABLE_TEXT;
131   atk_state_types[ATSPI_STATE_SELECTABLE_TEXT] = ATK_STATE_SELECTABLE_TEXT;
132   accessible_state_types[ATK_STATE_DEFAULT] = ATSPI_STATE_IS_DEFAULT;
133   atk_state_types[ATSPI_STATE_IS_DEFAULT] = ATK_STATE_DEFAULT;
134   accessible_state_types[ATK_STATE_VISITED] = ATSPI_STATE_VISITED;
135   atk_state_types[ATSPI_STATE_VISITED] = ATK_STATE_VISITED;
136   accessible_state_types[ATK_STATE_HAS_POPUP] = ATSPI_STATE_HAS_POPUP;
137   atk_state_types[ATSPI_STATE_HAS_POPUP] = ATK_STATE_HAS_POPUP;
138   accessible_state_types[ATK_STATE_CHECKABLE] = ATSPI_STATE_CHECKABLE;
139   atk_state_types[ATSPI_STATE_CHECKABLE] = ATK_STATE_CHECKABLE;
140   accessible_state_types[ATK_STATE_HAS_TOOLTIP] = ATSPI_STATE_HAS_TOOLTIP;
141   atk_state_types[ATSPI_STATE_HAS_TOOLTIP] = ATK_STATE_HAS_TOOLTIP;
142   accessible_state_types[ATK_STATE_READ_ONLY] = ATSPI_STATE_READ_ONLY;
143   atk_state_types[ATSPI_STATE_READ_ONLY] = ATK_STATE_READ_ONLY;
144
145   return TRUE;
146 }
147
148 static inline AtkState
149 state_spi_to_atk (AtspiStateType state)
150 {
151   guint idx = state;
152   if (idx < ATSPI_STATE_LAST_DEFINED)
153     return atk_state_types [idx];
154   else
155     return ATK_STATE_INVALID;
156 }
157
158 AtkState
159 spi_atk_state_from_spi_state (AtspiStateType state)
160 {
161   spi_init_state_type_tables ();
162   return state_spi_to_atk (state);
163 }
164
165 AtkStateSet *
166 spi_state_set_cache_from_sequence (GArray *seq)
167 {
168   int i;
169   AtkStateSet *set;
170   AtkStateType *states;
171
172   spi_init_state_type_tables ();
173   
174   states = g_newa (AtkStateType, seq->len);
175   for (i = 0; i < seq->len; i++)
176     states [i] = state_spi_to_atk (g_array_index (seq, dbus_int32_t, i));
177
178   set = atk_state_set_new ();
179   atk_state_set_add_states (set, states, seq->len);
180
181   g_array_free (seq, TRUE);
182   return set;
183 }
184
185 void
186 spi_atk_state_to_dbus_array (AtkObject * object, dbus_uint32_t * array)
187 {
188   AtkStateSet *set = atk_object_ref_state_set (object);
189   spi_atk_state_set_to_dbus_array (set, array);
190   g_clear_object (&set);
191 }
192
193 void
194 spi_atk_state_set_to_dbus_array (AtkStateSet * set, dbus_uint32_t * array)
195 {
196   int i;
197
198   array[0] = 0;
199   array[1] = 0;
200   if (!set)
201     return;
202   spi_init_state_type_tables ();
203
204   g_assert (ATK_STATE_LAST_DEFINED <= 64);
205   for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
206     {
207       if (atk_state_set_contains_state (set, i))
208         {
209           int a = accessible_state_types[i];
210           g_assert (a < 64);
211           BITARRAY_SET (array, a);
212         }
213     }
214 }