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
static AtspiStateType *accessible_state_types = NULL;
34
static AtkStateType *atk_state_types = NULL;
35

            
36
static gboolean
37
1437
spi_init_state_type_tables (void)
38
{
39
  gint i;
40

            
41
1437
  if (accessible_state_types || atk_state_types)
42
1301
    return FALSE;
43
136
  if (!accessible_state_types)
44
136
    accessible_state_types = g_new (AtspiStateType, ATK_STATE_LAST_DEFINED);
45
136
  if (!atk_state_types)
46
136
    atk_state_types = g_new (AtkStateType, ATSPI_STATE_LAST_DEFINED);
47
136
  g_return_val_if_fail (accessible_state_types, FALSE);
48
136
  g_return_val_if_fail (atk_state_types, FALSE);
49

            
50
6120
  for (i = 0; i < ATSPI_STATE_LAST_DEFINED; i++)
51
    {
52
5984
      atk_state_types[i] = ATK_STATE_INVALID;
53
    }
54

            
55
6120
  for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
56
    {
57
5984
      accessible_state_types[i] = ATSPI_STATE_INVALID;
58
    }
59

            
60
136
  accessible_state_types[ATK_STATE_ACTIVE] = ATSPI_STATE_ACTIVE;
61
136
  atk_state_types[ATSPI_STATE_ACTIVE] = ATK_STATE_ACTIVE;
62
136
  accessible_state_types[ATK_STATE_ANIMATED] = ATSPI_STATE_ANIMATED;
63
136
  atk_state_types[ATSPI_STATE_ANIMATED] = ATK_STATE_ANIMATED;
64
136
  accessible_state_types[ATK_STATE_ARMED] = ATSPI_STATE_ARMED;
65
136
  atk_state_types[ATSPI_STATE_ARMED] = ATK_STATE_ARMED;
66
136
  accessible_state_types[ATK_STATE_BUSY] = ATSPI_STATE_BUSY;
67
136
  atk_state_types[ATSPI_STATE_BUSY] = ATK_STATE_BUSY;
68
136
  accessible_state_types[ATK_STATE_CHECKED] = ATSPI_STATE_CHECKED;
69
136
  atk_state_types[ATSPI_STATE_CHECKED] = ATK_STATE_CHECKED;
70
136
  accessible_state_types[ATK_STATE_DEFUNCT] = ATSPI_STATE_DEFUNCT;
71
136
  atk_state_types[ATSPI_STATE_DEFUNCT] = ATK_STATE_DEFUNCT;
72
136
  accessible_state_types[ATK_STATE_EDITABLE] = ATSPI_STATE_EDITABLE;
73
136
  atk_state_types[ATSPI_STATE_EDITABLE] = ATK_STATE_EDITABLE;
74
136
  accessible_state_types[ATK_STATE_ENABLED] = ATSPI_STATE_ENABLED;
75
136
  atk_state_types[ATSPI_STATE_ENABLED] = ATK_STATE_ENABLED;
76
136
  accessible_state_types[ATK_STATE_EXPANDABLE] = ATSPI_STATE_EXPANDABLE;
77
136
  atk_state_types[ATSPI_STATE_EXPANDABLE] = ATK_STATE_EXPANDABLE;
78
136
  accessible_state_types[ATK_STATE_EXPANDED] = ATSPI_STATE_EXPANDED;
79
136
  atk_state_types[ATSPI_STATE_EXPANDED] = ATK_STATE_EXPANDED;
80
136
  accessible_state_types[ATK_STATE_FOCUSABLE] = ATSPI_STATE_FOCUSABLE;
81
136
  atk_state_types[ATSPI_STATE_FOCUSABLE] = ATK_STATE_FOCUSABLE;
82
136
  accessible_state_types[ATK_STATE_FOCUSED] = ATSPI_STATE_FOCUSED;
83
136
  atk_state_types[ATSPI_STATE_FOCUSED] = ATK_STATE_FOCUSED;
84
136
  accessible_state_types[ATK_STATE_HORIZONTAL] = ATSPI_STATE_HORIZONTAL;
85
136
  atk_state_types[ATSPI_STATE_HORIZONTAL] = ATK_STATE_HORIZONTAL;
86
136
  accessible_state_types[ATK_STATE_ICONIFIED] = ATSPI_STATE_ICONIFIED;
87
136
  atk_state_types[ATSPI_STATE_ICONIFIED] = ATK_STATE_ICONIFIED;
88
136
  accessible_state_types[ATK_STATE_MODAL] = ATSPI_STATE_MODAL;
89
136
  atk_state_types[ATSPI_STATE_MODAL] = ATK_STATE_MODAL;
90
136
  accessible_state_types[ATK_STATE_MULTI_LINE] = ATSPI_STATE_MULTI_LINE;
91
136
  atk_state_types[ATSPI_STATE_MULTI_LINE] = ATK_STATE_MULTI_LINE;
92
136
  accessible_state_types[ATK_STATE_MULTISELECTABLE] = ATSPI_STATE_MULTISELECTABLE;
93
136
  atk_state_types[ATSPI_STATE_MULTISELECTABLE] = ATK_STATE_MULTISELECTABLE;
94
136
  accessible_state_types[ATK_STATE_OPAQUE] = ATSPI_STATE_OPAQUE;
95
136
  atk_state_types[ATSPI_STATE_OPAQUE] = ATK_STATE_OPAQUE;
96
136
  accessible_state_types[ATK_STATE_PRESSED] = ATSPI_STATE_PRESSED;
97
136
  atk_state_types[ATSPI_STATE_PRESSED] = ATK_STATE_PRESSED;
98
136
  accessible_state_types[ATK_STATE_RESIZABLE] = ATSPI_STATE_RESIZABLE;
99
136
  atk_state_types[ATSPI_STATE_RESIZABLE] = ATK_STATE_RESIZABLE;
100
136
  accessible_state_types[ATK_STATE_SELECTABLE] = ATSPI_STATE_SELECTABLE;
101
136
  atk_state_types[ATSPI_STATE_SELECTABLE] = ATK_STATE_SELECTABLE;
102
136
  accessible_state_types[ATK_STATE_SELECTED] = ATSPI_STATE_SELECTED;
103
136
  atk_state_types[ATSPI_STATE_SELECTED] = ATK_STATE_SELECTED;
104
136
  accessible_state_types[ATK_STATE_SENSITIVE] = ATSPI_STATE_SENSITIVE;
105
136
  atk_state_types[ATSPI_STATE_SENSITIVE] = ATK_STATE_SENSITIVE;
106
136
  accessible_state_types[ATK_STATE_SHOWING] = ATSPI_STATE_SHOWING;
107
136
  atk_state_types[ATSPI_STATE_SHOWING] = ATK_STATE_SHOWING;
108
136
  accessible_state_types[ATK_STATE_SINGLE_LINE] = ATSPI_STATE_SINGLE_LINE;
109
136
  atk_state_types[ATSPI_STATE_SINGLE_LINE] = ATK_STATE_SINGLE_LINE;
110
136
  accessible_state_types[ATK_STATE_STALE] = ATSPI_STATE_STALE;
111
136
  atk_state_types[ATSPI_STATE_STALE] = ATK_STATE_STALE;
112
136
  accessible_state_types[ATK_STATE_TRANSIENT] = ATSPI_STATE_TRANSIENT;
113
136
  atk_state_types[ATSPI_STATE_TRANSIENT] = ATK_STATE_TRANSIENT;
114
136
  accessible_state_types[ATK_STATE_VERTICAL] = ATSPI_STATE_VERTICAL;
115
136
  atk_state_types[ATSPI_STATE_VERTICAL] = ATK_STATE_VERTICAL;
116
136
  accessible_state_types[ATK_STATE_VISIBLE] = ATSPI_STATE_VISIBLE;
117
136
  atk_state_types[ATSPI_STATE_VISIBLE] = ATK_STATE_VISIBLE;
118
136
  accessible_state_types[ATK_STATE_MANAGES_DESCENDANTS] = ATSPI_STATE_MANAGES_DESCENDANTS;
119
136
  atk_state_types[ATSPI_STATE_MANAGES_DESCENDANTS] = ATK_STATE_MANAGES_DESCENDANTS;
120
136
  accessible_state_types[ATK_STATE_INDETERMINATE] = ATSPI_STATE_INDETERMINATE;
121
136
  atk_state_types[ATSPI_STATE_INDETERMINATE] = ATK_STATE_INDETERMINATE;
122
136
  accessible_state_types[ATK_STATE_TRUNCATED] = ATSPI_STATE_TRUNCATED;
123
136
  atk_state_types[ATSPI_STATE_TRUNCATED] = ATK_STATE_TRUNCATED;
124
136
  accessible_state_types[ATK_STATE_REQUIRED] = ATSPI_STATE_REQUIRED;
125
136
  atk_state_types[ATSPI_STATE_REQUIRED] = ATK_STATE_REQUIRED;
126
136
  accessible_state_types[ATK_STATE_INVALID_ENTRY] = ATSPI_STATE_INVALID_ENTRY;
127
136
  atk_state_types[ATSPI_STATE_INVALID_ENTRY] = ATK_STATE_INVALID_ENTRY;
128
136
  accessible_state_types[ATK_STATE_SUPPORTS_AUTOCOMPLETION] = ATSPI_STATE_SUPPORTS_AUTOCOMPLETION;
129
136
  atk_state_types[ATSPI_STATE_SUPPORTS_AUTOCOMPLETION] = ATK_STATE_SUPPORTS_AUTOCOMPLETION;
130
136
  accessible_state_types[ATK_STATE_SELECTABLE_TEXT] = ATSPI_STATE_SELECTABLE_TEXT;
131
136
  atk_state_types[ATSPI_STATE_SELECTABLE_TEXT] = ATK_STATE_SELECTABLE_TEXT;
132
136
  accessible_state_types[ATK_STATE_DEFAULT] = ATSPI_STATE_IS_DEFAULT;
133
136
  atk_state_types[ATSPI_STATE_IS_DEFAULT] = ATK_STATE_DEFAULT;
134
136
  accessible_state_types[ATK_STATE_VISITED] = ATSPI_STATE_VISITED;
135
136
  atk_state_types[ATSPI_STATE_VISITED] = ATK_STATE_VISITED;
136
136
  accessible_state_types[ATK_STATE_HAS_POPUP] = ATSPI_STATE_HAS_POPUP;
137
136
  atk_state_types[ATSPI_STATE_HAS_POPUP] = ATK_STATE_HAS_POPUP;
138
136
  accessible_state_types[ATK_STATE_CHECKABLE] = ATSPI_STATE_CHECKABLE;
139
136
  atk_state_types[ATSPI_STATE_CHECKABLE] = ATK_STATE_CHECKABLE;
140
136
  accessible_state_types[ATK_STATE_HAS_TOOLTIP] = ATSPI_STATE_HAS_TOOLTIP;
141
136
  atk_state_types[ATSPI_STATE_HAS_TOOLTIP] = ATK_STATE_HAS_TOOLTIP;
142
136
  accessible_state_types[ATK_STATE_READ_ONLY] = ATSPI_STATE_READ_ONLY;
143
136
  atk_state_types[ATSPI_STATE_READ_ONLY] = ATK_STATE_READ_ONLY;
144
136
  accessible_state_types[ATK_STATE_COLLAPSED] = ATSPI_STATE_COLLAPSED;
145
136
  atk_state_types[ATSPI_STATE_COLLAPSED] = ATK_STATE_COLLAPSED;
146

            
147
136
  return TRUE;
148
}
149

            
150
static inline AtkState
151
6
state_spi_to_atk (AtspiStateType state)
152
{
153
6
  guint idx = state;
154
6
  if (idx < ATSPI_STATE_LAST_DEFINED)
155
6
    return atk_state_types[idx];
156
  else
157
    return ATK_STATE_INVALID;
158
}
159

            
160
AtkState
161
6
spi_atk_state_from_spi_state (AtspiStateType state)
162
{
163
6
  spi_init_state_type_tables ();
164
6
  return state_spi_to_atk (state);
165
}
166

            
167
AtkStateSet *
168
spi_state_set_cache_from_sequence (GArray *seq)
169
{
170
  int i;
171
  AtkStateSet *set;
172
  AtkStateType *states;
173

            
174
  spi_init_state_type_tables ();
175

            
176
  states = g_newa (AtkStateType, seq->len);
177
  for (i = 0; i < seq->len; i++)
178
    states[i] = state_spi_to_atk (g_array_index (seq, dbus_int32_t, i));
179

            
180
  set = atk_state_set_new ();
181
  atk_state_set_add_states (set, states, seq->len);
182

            
183
  g_array_free (seq, TRUE);
184
  return set;
185
}
186

            
187
void
188
12
spi_atk_state_to_dbus_array (AtkObject *object, dbus_uint32_t *array)
189
{
190
12
  AtkStateSet *set = atk_object_ref_state_set (object);
191
12
  spi_atk_state_set_to_dbus_array (set, array);
192
12
  g_clear_object (&set);
193
12
}
194

            
195
void
196
1431
spi_atk_state_set_to_dbus_array (AtkStateSet *set, dbus_uint32_t *array)
197
{
198
  int i;
199

            
200
1431
  array[0] = 0;
201
1431
  array[1] = 0;
202
1431
  if (!set)
203
    return;
204
1431
  spi_init_state_type_tables ();
205

            
206
  g_assert (ATK_STATE_LAST_DEFINED <= 64);
207
64395
  for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
208
    {
209
62964
      if (atk_state_set_contains_state (set, i))
210
        {
211
239
          int a = accessible_state_types[i];
212
239
          g_assert (a < 64);
213
239
          BITARRAY_SET (array, a);
214
        }
215
    }
216
}