1 /* ATK - Accessibility Toolkit
2 * Copyright 2001 Sun Microsystems Inc.
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.
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.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18 #include "atkregistry.h"
19 #include "atknoopobjectfactory.h"
21 static AtkRegistry *default_registry = NULL;
23 static void atk_registry_init (AtkRegistry *instance,
24 AtkRegistryClass *klass);
25 static void atk_registry_finalize (GObject *instance);
26 static void atk_registry_class_init (AtkRegistryClass *klass);
27 static AtkRegistry* atk_registry_new (void);
29 static gpointer parent_class = NULL;
32 atk_registry_get_type (void)
34 static GType type = 0;
38 static const GTypeInfo info =
40 sizeof (AtkRegistryClass),
41 (GBaseInitFunc) NULL, /* base_init */
42 (GBaseFinalizeFunc) NULL, /* base_finalize */
43 (GClassInitFunc) atk_registry_class_init, /* class_init */
44 (GClassFinalizeFunc) NULL, /* class_finalize */
45 NULL, /* class_data */
46 sizeof (AtkRegistry), /* instance size */
48 (GInstanceInitFunc) atk_registry_init, /* instance init */
49 NULL /* value table */
52 type = g_type_register_static (G_TYPE_OBJECT, "AtkRegistry", &info, 0);
59 atk_registry_class_init (AtkRegistryClass *klass)
61 GObjectClass *object_class = (GObjectClass *) klass;
63 parent_class = g_type_class_peek_parent (klass);
65 object_class->finalize = atk_registry_finalize;
70 * Cannot define a class_finalize function when calling
71 * g_type_register_static()
74 atk_registry_class_finalize (GObjectClass *klass)
76 g_return_if_fail (ATK_IS_REGISTRY_CLASS (klass));
78 g_object_unref (G_OBJECT (default_registry));
83 atk_registry_init (AtkRegistry *instance, AtkRegistryClass *klass)
85 instance->factory_type_registry = g_hash_table_new ((GHashFunc) NULL,
87 instance->factory_singleton_cache = g_hash_table_new ((GHashFunc) NULL,
92 atk_registry_new (void)
96 object = g_object_new (ATK_TYPE_REGISTRY, NULL);
98 g_return_val_if_fail (ATK_IS_REGISTRY (object), NULL);
100 return (AtkRegistry *) object;
104 atk_registry_finalize (GObject *object)
106 AtkRegistry *registry = ATK_REGISTRY (object);
108 g_hash_table_destroy (registry->factory_type_registry);
109 g_hash_table_destroy (registry->factory_singleton_cache);
111 G_OBJECT_CLASS (parent_class)->finalize (object);
115 * atk_registry_set_factory_type:
116 * @registry: the #AtkRegistry in which to register the type association
117 * @type: an #AtkObject type
118 * @factory_type: an #AtkObjectFactory type to associate with @type. Must
119 * implement AtkObject appropriate for @type.
121 * Associate an #AtkObjectFactory subclass with a #GType. Note:
122 * The associated @factory_type will thereafter be responsible for
123 * the creation of new #AtkObject implementations for instances
124 * appropriate for @type.
127 atk_registry_set_factory_type (AtkRegistry *registry,
133 AtkObjectFactory *old_factory;
135 g_return_if_fail (ATK_IS_REGISTRY (registry));
137 value = g_hash_table_lookup (registry->factory_type_registry,
139 old_type = (GType) value;
140 if (old_type && old_type != factory_type)
142 g_hash_table_remove (registry->factory_type_registry,
145 * If the old factory was created, notify it that it has
146 * been replaced, then free it.
148 old_factory = g_hash_table_lookup (registry->factory_singleton_cache,
149 (gpointer) old_type);
152 atk_object_factory_invalidate (old_factory);
153 g_type_free_instance ((GTypeInstance *) old_factory);
156 g_hash_table_insert (registry->factory_type_registry,
158 (gpointer) factory_type);
162 * atk_registry_get_factory_type:
163 * @registry: an #AtkRegistry
164 * @type: a #GType with which to look up the associated #AtkObjectFactory
167 * Provides a #GType indicating the #AtkObjectFactory subclass
168 * associated with @type.
170 * Returns: a #GType associated with type @type
173 atk_registry_get_factory_type (AtkRegistry *registry,
180 * look up factory type in first hash;
181 * if there isn't an explicitly registered factory type,
182 * try inheriting one...
186 g_hash_table_lookup (registry->factory_type_registry,
188 type = g_type_parent (type);
189 if (type == G_TYPE_INVALID)
193 } while (value == NULL);
195 factory_type = (GType) value;
200 * atk_registry_get_factory:
201 * @registry: an #AtkRegistry
202 * @type: a #GType with which to look up the associated #AtkObjectFactory
204 * Gets an #AtkObjectFactory appropriate for creating #AtkObjects
205 * appropriate for @type.
207 * Returns: (transfer none): an #AtkObjectFactory appropriate for creating
208 * #AtkObjects appropriate for @type.
211 atk_registry_get_factory (AtkRegistry *registry,
214 gpointer factory_pointer = NULL;
217 factory_type = atk_registry_get_factory_type (registry, type);
219 if (factory_type == G_TYPE_INVALID)
221 /* Factory type has not been specified for this object type */
222 static AtkObjectFactory* default_factory = NULL;
224 if (!default_factory)
225 default_factory = atk_no_op_object_factory_new ();
227 return default_factory;
230 /* ask second hashtable for instance of factory type */
232 g_hash_table_lookup (registry->factory_singleton_cache,
233 (gpointer) factory_type);
235 /* if there isn't one already, create one and save it */
236 if (factory_pointer == NULL)
238 factory_pointer = g_type_create_instance (factory_type);
239 g_hash_table_insert (registry->factory_singleton_cache,
240 (gpointer) factory_type,
244 return ATK_OBJECT_FACTORY (factory_pointer);
248 * atk_get_default_registry:
250 * Gets a default implementation of the #AtkObjectFactory/type
252 * Note: For most toolkit maintainers, this will be the correct
253 * registry for registering new #AtkObject factories. Following
254 * a call to this function, maintainers may call atk_registry_set_factory_type()
255 * to associate an #AtkObjectFactory subclass with the GType of objects
256 * for whom accessibility information will be provided.
258 * Returns: (transfer full): a default implementation of the
259 * #AtkObjectFactory/type registry
262 atk_get_default_registry (void)
264 if (!default_registry)
266 default_registry = atk_registry_new ();
268 return default_registry;