240
240
G_CONST_RETURN gchar *atk_get_version (void);
242
/* --- GType boilerplate --- */
243
/* convenience macros for atk type implementations, which for a type GtkGadgetAccessible will:
244
* - prototype: static void gtk_gadget_accessible_class_init (GtkGadgetClass *klass);
245
* - prototype: static void gtk_gadget_accessible_init (GtkGadget *self);
246
* - define: static gpointer gtk_gadget_accessible_parent_class = NULL;
247
* gtk_gadget_accessible_parent_class is initialized prior to calling gtk_gadget_class_init()
248
* - implement: GType gtk_gadget_accessible_get_type (void) { ... }
249
* - support custom code in gtk_gadget_accessible_get_type() after the type is registered.
251
* macro arguments: TypeName, type_name, TYPE_PARENT, CODE
252
* example: ATK_DEFINE_TYPE_WITH_CODE (GtkGadgetAccessible, gtk_gadget_accessible, GTK_TYPE_GADGET,
253
* G_IMPLEMENT_INTERFACE (ATK_TYPE_TABLE, gtk_gadget_accessible_table_iface_init))
256
#define ATK_DEFINE_TYPE(TN, t_n, T_P) ATK_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
257
#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()
258
#define ATK_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P) ATK_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {})
259
#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()
260
#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()
262
#define _ATK_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE, flags) \
264
static void type_name##_init (TypeName *self); \
265
static void type_name##_class_init (TypeName##Class *klass); \
266
static gpointer type_name##_parent_class = NULL; \
267
static void type_name##_class_intern_init (gpointer klass) \
269
type_name##_parent_class = g_type_class_peek_parent (klass); \
270
type_name##_class_init ((TypeName##Class*) klass); \
274
type_name##_get_type (void) \
276
static volatile gsize g_define_type_id__volatile = 0; \
277
if (g_once_init_enter (&g_define_type_id__volatile)) \
279
AtkObjectFactory *factory; \
280
GType derived_type; \
282
GType derived_atk_type; \
283
GType g_define_type_id; \
285
/* Figure out the size of the class and instance we are deriving from */ \
286
derived_type = g_type_parent (TYPE); \
287
factory = atk_registry_get_factory (atk_get_default_registry (), \
289
derived_atk_type = atk_object_factory_get_accessible_type (factory); \
290
g_type_query (derived_atk_type, &query); \
293
g_type_register_static_simple (derived_atk_type, \
294
g_intern_static_string (#TypeName), \
296
(GClassInitFunc) type_name##_class_intern_init, \
297
query.instance_size, \
298
(GInstanceInitFunc) type_name##_init, \
299
(GTypeFlags) flags); \
300
{ /* custom code follows */
301
#define _ATK_DEFINE_TYPE_EXTENDED_END() \
302
/* following custom code */ \
304
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
306
return g_define_type_id__volatile; \
307
} /* closes type_name##_get_type() */
242
310
#ifdef __cplusplus
244
312
#endif /* __cplusplus */