diff --git a/gobject/ChangeLog b/gobject/ChangeLog index dd8c8aea1..f8a0f7996 100644 --- a/gobject/ChangeLog +++ b/gobject/ChangeLog @@ -1,3 +1,9 @@ +Sun Nov 5 13:21:28 2000 Owen Taylor + + * Makefile.am gtypemodule.[ch]: New basic implementation of + GTypePlugin interface as a GObject. Dynamically loaded modules can + register any number of types and interface on the module. + Sun Nov 5 10:25:40 2000 Owen Taylor * gsignal.c (handlers_find): When appending handlers and diff --git a/gobject/Makefile.am b/gobject/Makefile.am index 4b8e658c2..44f7b4720 100644 --- a/gobject/Makefile.am +++ b/gobject/Makefile.am @@ -32,6 +32,7 @@ gobject_public_h_sources = @STRIP_BEGIN@ \ gparamspecs.h \ gsignal.h \ gtype.h \ + gtypemodule.h \ gtypeplugin.h \ gvalue.h \ gvaluecollector.h \ @@ -52,6 +53,7 @@ gobject_c_sources = @STRIP_BEGIN@ \ gparamspecs.c \ gsignal.c \ gtype.c \ + gtypemodule.c \ gtypeplugin.c \ gvalue.c \ gvaluetypes.c \ diff --git a/gobject/gtype.c b/gobject/gtype.c index a288b657b..7924d8780 100644 --- a/gobject/gtype.c +++ b/gobject/gtype.c @@ -1910,6 +1910,32 @@ g_type_get_plugin (GType type) return node ? node->plugin : NULL; } +GTypePlugin* +g_type_interface_get_plugin (GType instance_type, + GType interface_type) +{ + TypeNode *node = LOOKUP_TYPE_NODE (instance_type); + TypeNode *iface = LOOKUP_TYPE_NODE (interface_type); + IFaceHolder *iholder; + + g_return_val_if_fail (node == NULL, NULL); + g_return_val_if_fail (iface == NULL, NULL); + g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface_type), NULL); + + iholder = iface->private.iface_conformants; + + while (iholder && iholder->instance_type != instance_type) + iholder = iholder->next; + + if (!iholder) + { + g_warning (G_STRLOC ": Attempt to look up plugin for invalid instance/interface type pair."); + return NULL; + } + + return iholder->plugin; +} + GType g_type_fundamental_last (void) { diff --git a/gobject/gtype.h b/gobject/gtype.h index bbef767cf..89ecd96a3 100644 --- a/gobject/gtype.h +++ b/gobject/gtype.h @@ -295,6 +295,9 @@ void g_type_add_interface_dynamic (GType instance_type, /* --- protected (for fundamental type implementations) --- */ GTypePlugin* g_type_get_plugin (GType type); +GTypePlugin* g_type_interface_get_plugin (GType instance_type, + GType implementation_type); + GType g_type_fundamental_last (void); gboolean g_type_check_flags (GType type, guint flags);