1 | /* ATK - Accessibility Toolkit |
2 | * Copyright 2001 Sun Microsystems Inc. |
3 | * |
4 | * This library is free software; you can redistribute it and/or |
5 | * modify it under the terms of the GNU Library General Public |
6 | * License as published by the Free Software Foundation; either |
7 | * version 2 of the License, or (at your option) any later version. |
8 | * |
9 | * This library is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
12 | * Library General Public License for more details. |
13 | * |
14 | * You should have received a copy of the GNU Library General Public |
15 | * License along with this library; if not, write to the |
16 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
17 | * Boston, MA 02111-1307, USA. |
18 | */ |
19 | |
20 | #ifndef __ATK_UTIL_H__ |
21 | #define __ATK_UTIL_H__ |
22 | |
23 | #if defined(ATK_DISABLE_SINGLE_INCLUDES) && !defined (__ATK_H_INSIDE__) && !defined (ATK_COMPILATION) |
24 | #error "Only <atk/atk.h> can be included directly." |
25 | #endif |
26 | |
27 | #include <atk/atkobject.h> |
28 | |
29 | G_BEGIN_DECLS |
30 | |
31 | #define ATK_TYPE_UTIL (atk_util_get_type ()) |
32 | #define ATK_IS_UTIL(obj) G_TYPE_CHECK_INSTANCE_TYPE ((obj), ATK_TYPE_UTIL) |
33 | #define ATK_UTIL(obj) G_TYPE_CHECK_INSTANCE_CAST ((obj), ATK_TYPE_UTIL, AtkUtil) |
34 | #define ATK_UTIL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ATK_TYPE_UTIL, AtkUtilClass)) |
35 | #define ATK_IS_UTIL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ATK_TYPE_UTIL)) |
36 | #define ATK_UTIL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), ATK_TYPE_UTIL, AtkUtilClass)) |
37 | |
38 | |
39 | #ifndef _TYPEDEF_ATK_UTIL_ |
40 | #define _TYPEDEF_ATK_UTIL_ |
41 | typedef struct _AtkUtil AtkUtil; |
42 | typedef struct _AtkUtilClass AtkUtilClass; |
43 | typedef struct _AtkKeyEventStruct AtkKeyEventStruct; |
44 | #endif |
45 | |
46 | /** |
47 | * AtkEventListener: |
48 | * @obj: An #AtkObject instance for whom the callback will be called when |
49 | * the specified event (e.g. 'focus:') takes place. |
50 | * |
51 | * A function which is called when an object emits a matching event, |
52 | * as used in #atk_add_focus_tracker. |
53 | * Currently the only events for which object-specific handlers are |
54 | * supported are events of type "focus:". Most clients of ATK will prefer to |
55 | * attach signal handlers for the various ATK signals instead. |
56 | * |
57 | * see atk_add_focus_tracker. |
58 | **/ |
59 | typedef void (*AtkEventListener) (AtkObject* obj); |
60 | /** |
61 | * AtkEventListenerInit: |
62 | * |
63 | * An #AtkEventListenerInit function is a special function that is |
64 | * called in order to initialize the per-object event registration system |
65 | * used by #AtkEventListener, if any preparation is required. |
66 | * |
67 | * see atk_focus_tracker_init. |
68 | **/ |
69 | typedef void (*AtkEventListenerInit) (void); |
70 | /** |
71 | * AtkKeySnoopFunc: |
72 | * @event: an AtkKeyEventStruct containing information about the key event for which |
73 | * notification is being given. |
74 | * @user_data: a block of data which will be passed to the event listener, on notification. |
75 | * |
76 | * An #AtkKeySnoopFunc is a type of callback which is called whenever a key event occurs, |
77 | * if registered via atk_add_key_event_listener. It allows for pre-emptive |
78 | * interception of key events via the return code as described below. |
79 | * |
80 | * Returns: TRUE (nonzero) if the event emission should be stopped and the event |
81 | * discarded without being passed to the normal GUI recipient; FALSE (zero) if the |
82 | * event dispatch to the client application should proceed as normal. |
83 | * |
84 | * see atk_add_key_event_listener. |
85 | **/ |
86 | typedef gint (*AtkKeySnoopFunc) (AtkKeyEventStruct *event, |
87 | gpointer user_data); |
88 | |
89 | /** |
90 | * AtkKeyEventStruct: |
91 | * @type: An AtkKeyEventType, generally one of ATK_KEY_EVENT_PRESS or ATK_KEY_EVENT_RELEASE |
92 | * @state: A bitmask representing the state of the modifier keys immediately after the event takes place. |
93 | * The meaning of the bits is currently defined to match the bitmask used by GDK in |
94 | * GdkEventType.state, see |
95 | * http://developer.gnome.org/doc/API/2.0/gdk/gdk-Event-Structures.html#GdkEventKey |
96 | * @keyval: A guint representing a keysym value corresponding to those used by GDK and X11: see |
97 | * /usr/X11/include/keysymdef.h. |
98 | * @length: The length of member #string. |
99 | * @string: A string containing one of the following: either a string approximating the text that would |
100 | * result from this keypress, if the key is a control or graphic character, or a symbolic name for this keypress. |
101 | * Alphanumeric and printable keys will have the symbolic key name in this string member, for instance "A". "0", |
102 | * "semicolon", "aacute". Keypad keys have the prefix "KP". |
103 | * @keycode: The raw hardware code that generated the key event. This field is raraly useful. |
104 | * @timestamp: A timestamp in milliseconds indicating when the event occurred. |
105 | * These timestamps are relative to a starting point which should be considered arbitrary, |
106 | * and only used to compare the dispatch times of events to one another. |
107 | * |
108 | * Encapsulates information about a key event. |
109 | **/ |
110 | struct _AtkKeyEventStruct { |
111 | gint type; |
112 | guint state; |
113 | guint keyval; |
114 | gint length; |
115 | gchar *string; |
116 | guint16 keycode; |
117 | guint32 timestamp; |
118 | }; |
119 | |
120 | /** |
121 | *AtkKeyEventType: |
122 | *@ATK_KEY_EVENT_PRESS: specifies a key press event |
123 | *@ATK_KEY_EVENT_RELEASE: specifies a key release event |
124 | *@ATK_KEY_EVENT_LAST_DEFINED: Not a valid value; specifies end of enumeration |
125 | * |
126 | *Specifies the type of a keyboard evemt. |
127 | **/ |
128 | typedef enum |
129 | { |
130 | ATK_KEY_EVENT_PRESS, |
131 | ATK_KEY_EVENT_RELEASE, |
132 | ATK_KEY_EVENT_LAST_DEFINED |
133 | } AtkKeyEventType; |
134 | |
135 | struct _AtkUtil |
136 | { |
137 | GObject parent; |
138 | }; |
139 | |
140 | /** |
141 | * AtkUtilClass: |
142 | * @add_global_event_listener: adds the specified function to the list |
143 | * of functions to be called when an ATK event occurs. ATK |
144 | * implementors are discouraged from reimplementing this method. |
145 | * @remove_global_event_listener: removes the specified function to |
146 | * the list of functions to be called when an ATK event occurs. ATK |
147 | * implementors are discouraged from reimplementing this method. |
148 | * @add_key_event_listener: adds the specified function to the list of |
149 | * functions to be called when a key event occurs. |
150 | * @remove_key_event_listener: remove the specified function to the |
151 | * list of functions to be called when a key event occurs. |
152 | * @get_root: gets the root accessible container for the current |
153 | * application. |
154 | * @get_toolkit_name: gets name string for the GUI toolkit |
155 | * implementing ATK for this application. |
156 | * @get_toolkit_version: gets version string for the GUI toolkit |
157 | * implementing ATK for this application. |
158 | * |
159 | */ |
160 | struct _AtkUtilClass |
161 | { |
162 | GObjectClass parent; |
163 | guint (* add_global_event_listener) (GSignalEmissionHook listener, |
164 | const gchar *event_type); |
165 | void (* remove_global_event_listener) (guint listener_id); |
166 | guint (* add_key_event_listener) (AtkKeySnoopFunc listener, |
167 | gpointer data); |
168 | void (* remove_key_event_listener) (guint listener_id); |
169 | AtkObject* (* get_root) (void); |
170 | const gchar* (* get_toolkit_name) (void); |
171 | const gchar* (* get_toolkit_version) (void); |
172 | }; |
173 | ATK_AVAILABLE_IN_ALL |
174 | GType atk_util_get_type (void); |
175 | |
176 | /** |
177 | *AtkCoordType: |
178 | *@ATK_XY_SCREEN: specifies xy coordinates relative to the screen |
179 | *@ATK_XY_WINDOW: specifies xy coordinates relative to the widget's |
180 | * top-level window |
181 | *@ATK_XY_PARENT: specifies xy coordinates relative to the widget's |
182 | * immediate parent. Since: 2.30 |
183 | * |
184 | *Specifies how xy coordinates are to be interpreted. Used by functions such |
185 | *as atk_component_get_position() and atk_text_get_character_extents() |
186 | **/ |
187 | typedef enum { |
188 | ATK_XY_SCREEN, |
189 | ATK_XY_WINDOW, |
190 | ATK_XY_PARENT |
191 | }AtkCoordType; |
192 | |
193 | ATK_DEPRECATED_IN_2_10 |
194 | guint atk_add_focus_tracker (AtkEventListener focus_tracker); |
195 | ATK_DEPRECATED_IN_2_10 |
196 | void atk_remove_focus_tracker (guint tracker_id); |
197 | ATK_DEPRECATED_IN_2_10 |
198 | void atk_focus_tracker_init (AtkEventListenerInit init); |
199 | ATK_DEPRECATED_IN_2_10 |
200 | void atk_focus_tracker_notify (AtkObject *object); |
201 | ATK_AVAILABLE_IN_ALL |
202 | guint atk_add_global_event_listener (GSignalEmissionHook listener, |
203 | const gchar *event_type); |
204 | ATK_AVAILABLE_IN_ALL |
205 | void atk_remove_global_event_listener (guint listener_id); |
206 | ATK_AVAILABLE_IN_ALL |
207 | guint atk_add_key_event_listener (AtkKeySnoopFunc listener, gpointer data); |
208 | ATK_AVAILABLE_IN_ALL |
209 | void atk_remove_key_event_listener (guint listener_id); |
210 | |
211 | ATK_AVAILABLE_IN_ALL |
212 | AtkObject* atk_get_root(void); |
213 | ATK_AVAILABLE_IN_ALL |
214 | AtkObject* atk_get_focus_object (void); |
215 | |
216 | ATK_AVAILABLE_IN_ALL |
217 | const gchar *atk_get_toolkit_name (void); |
218 | ATK_AVAILABLE_IN_ALL |
219 | const gchar *atk_get_toolkit_version (void); |
220 | ATK_AVAILABLE_IN_ALL |
221 | const gchar *atk_get_version (void); |
222 | |
223 | /* --- GType boilerplate --- */ |
224 | /* convenience macros for atk type implementations, which for a type GtkGadgetAccessible will: |
225 | * - prototype: static void gtk_gadget_accessible_class_init (GtkGadgetClass *klass); |
226 | * - prototype: static void gtk_gadget_accessible_init (GtkGadget *self); |
227 | * - define: static gpointer gtk_gadget_accessible_parent_class = NULL; |
228 | * gtk_gadget_accessible_parent_class is initialized prior to calling gtk_gadget_class_init() |
229 | * - implement: GType gtk_gadget_accessible_get_type (void) { ... } |
230 | * - support custom code in gtk_gadget_accessible_get_type() after the type is registered. |
231 | * |
232 | * macro arguments: TypeName, type_name, TYPE_PARENT, CODE |
233 | * example: ATK_DEFINE_TYPE_WITH_CODE (GtkGadgetAccessible, gtk_gadget_accessible, GTK_TYPE_GADGET, |
234 | * G_IMPLEMENT_INTERFACE (ATK_TYPE_TABLE, gtk_gadget_accessible_table_iface_init)) |
235 | */ |
236 | |
237 | /** |
238 | * ATK_DEFINE_TYPE: |
239 | * @TN: The name of the new type, in Camel case. |
240 | * @t_n: The name of the new type, in lowercase, with words separated by '_'. |
241 | * @T_P: The #GType of the parent type. |
242 | * |
243 | * A convenience macro for type ATK implementations, which declares a class |
244 | * initialization function, an instance initialization function (see #GTypeInfo |
245 | * for information about these) and a static variable named |
246 | * @t_n _parent_class pointing to the parent class. Furthermore, it |
247 | * defines a _get_type() function. |
248 | * |
249 | * Since: 1.22 |
250 | */ |
251 | #define ATK_DEFINE_TYPE(TN, t_n, T_P) ATK_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {}) |
252 | |
253 | /** |
254 | * ATK_DEFINE_TYPE_WITH_CODE: |
255 | * @TN: The name of the new type, in Camel case. |
256 | * @t_n: The name of the new type in lowercase, with words separated by '_'. |
257 | * @T_P: The #GType of the parent type. |
258 | * @_C_: Custom code that gets inserted in the _get_type() function. |
259 | * |
260 | * A convenience macro for ATK type implementations. |
261 | * Similar to ATK_DEFINE_TYPE(), but allows you to insert custom code into the |
262 | * _get_type() function, e.g. interface implementations via G_IMPLEMENT_INTERFACE(). |
263 | * |
264 | * Since: 1.22 |
265 | */ |
266 | #define ATK_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _ATK_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _ATK_DEFINE_TYPE_EXTENDED_END() |
267 | |
268 | /** |
269 | * ATK_DEFINE_ABSTRACT_TYPE: |
270 | * @TN: The name of the new type, in Camel case. |
271 | * @t_n: The name of the new type, in lowercase, with words separated by '_'. |
272 | * @T_P: The #GType of the parent type. |
273 | * |
274 | * A convenience macro for ATK type implementations. |
275 | * Similar to ATK_DEFINE_TYPE(), but defines an abstract type. |
276 | * |
277 | * Since: 1.22 |
278 | */ |
279 | #define ATK_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P) ATK_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {}) |
280 | |
281 | /** |
282 | * ATK_DEFINE_ABSTRACT_TYPE_WITH_CODE: |
283 | * @TN: The name of the new type, in Camel case. |
284 | * @t_n: The name of the new type, in lowercase, with words separated by '_'. |
285 | * @T_P: The #GType of the parent type. |
286 | * @_C_: Custom code that gets inserted in the _get_type() function. |
287 | * |
288 | * A convenience macro for ATK type implementations. |
289 | * Similar to ATK_DEFINE_TYPE_WITH_CODE(), but defines an abstract type. |
290 | * |
291 | * Since: 1.22 |
292 | */ |
293 | #define ATK_DEFINE_ABSTRACT_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _ATK_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT) {_C_;} _ATK_DEFINE_TYPE_EXTENDED_END() |
294 | |
295 | /** |
296 | * ATK_DEFINE_TYPE_EXTENDED: |
297 | * @TN: The name of the new type, in Camel case. |
298 | * @t_n: The name of the new type, in lowercase, with words separated by '_'. |
299 | * @T_P: The #GType of the parent type. |
300 | * @_f_: #GTypeFlags to pass to g_type_register_static() |
301 | * @_C_: Custom code that gets inserted in the _get_type() function. |
302 | * |
303 | * The most general convenience macro for ATK type implementations, on which |
304 | * ATK_DEFINE_TYPE(), etc are based. |
305 | * |
306 | * Since: 1.22 |
307 | */ |
308 | #define ATK_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_) _ATK_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _ATK_DEFINE_TYPE_EXTENDED_END() |
309 | |
310 | #define _ATK_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE, flags) \ |
311 | \ |
312 | static void type_name##_init (TypeName *self); \ |
313 | static void type_name##_class_init (TypeName##Class *klass); \ |
314 | static gpointer type_name##_parent_class = NULL; \ |
315 | static void type_name##_class_intern_init (gpointer klass) \ |
316 | { \ |
317 | type_name##_parent_class = g_type_class_peek_parent (klass); \ |
318 | type_name##_class_init ((TypeName##Class*) klass); \ |
319 | } \ |
320 | \ |
321 | ATK_AVAILABLE_IN_ALL \ |
322 | GType \ |
323 | type_name##_get_type (void) \ |
324 | { \ |
325 | static volatile gsize g_define_type_id__volatile = 0; \ |
326 | if (g_once_init_enter (&g_define_type_id__volatile)) \ |
327 | { \ |
328 | AtkObjectFactory *factory; \ |
329 | GType derived_type; \ |
330 | GTypeQuery query; \ |
331 | GType derived_atk_type; \ |
332 | GType g_define_type_id; \ |
333 | \ |
334 | /* Figure out the size of the class and instance we are deriving from */ \ |
335 | derived_type = g_type_parent (TYPE); \ |
336 | factory = atk_registry_get_factory (atk_get_default_registry (), \ |
337 | derived_type); \ |
338 | derived_atk_type = atk_object_factory_get_accessible_type (factory); \ |
339 | g_type_query (derived_atk_type, &query); \ |
340 | \ |
341 | g_define_type_id = \ |
342 | g_type_register_static_simple (derived_atk_type, \ |
343 | g_intern_static_string (#TypeName), \ |
344 | query.class_size, \ |
345 | (GClassInitFunc) type_name##_class_intern_init, \ |
346 | query.instance_size, \ |
347 | (GInstanceInitFunc) type_name##_init, \ |
348 | (GTypeFlags) flags); \ |
349 | { /* custom code follows */ |
350 | #define _ATK_DEFINE_TYPE_EXTENDED_END() \ |
351 | /* following custom code */ \ |
352 | } \ |
353 | g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ |
354 | } \ |
355 | return g_define_type_id__volatile; \ |
356 | } /* closes type_name##_get_type() */ |
357 | |
358 | G_END_DECLS |
359 | |
360 | #endif /* __ATK_UTIL_H__ */ |
361 | |