diff options
author | Paolo Molaro <lupus@src.gnome.org> | 1999-01-11 07:09:07 +0000 |
---|---|---|
committer | Paolo Molaro <lupus@src.gnome.org> | 1999-01-11 07:09:07 +0000 |
commit | f3af00f4501d4f019146b1be468fb81723f6da1a (patch) | |
tree | dc7bd9dc7db23bb8f0e5cf8a4476d070230e3299 /gtk/gtktypeutils.c | |
parent | b6714d9ad10271ddf9bce070382ceb9df922a4a4 (diff) | |
download | gdk-pixbuf-f3af00f4501d4f019146b1be468fb81723f6da1a.tar.gz |
Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro <lupus@debian.org>
* gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook().
You can have a notification when a type is created.
Diffstat (limited to 'gtk/gtktypeutils.c')
-rw-r--r-- | gtk/gtktypeutils.c | 60 |
1 files changed, 58 insertions, 2 deletions
diff --git a/gtk/gtktypeutils.c b/gtk/gtktypeutils.c index 1d3fed1c1..dc33bc84d 100644 --- a/gtk/gtktypeutils.c +++ b/gtk/gtktypeutils.c @@ -37,7 +37,6 @@ struct _GtkTypeNode GMemChunk *mem_chunk; }; - #define LOOKUP_TYPE_NODE(node_var, type) { \ GtkTypeNode *__node = NULL; \ GtkType sqn = GTK_TYPE_SEQNO (type); \ @@ -66,6 +65,7 @@ static guint n_type_nodes = 0; static guint n_ftype_nodes = 0; static GHashTable *type_name_2_type_ht = NULL; +static GHookList *creation_hook_list = NULL; static GtkTypeNode* gtk_type_node_next_and_invalidate (GtkType parent_type) @@ -228,6 +228,15 @@ gtk_type_create (GtkType parent_type, return new_node->type; } +static gboolean +gtk_creation_marshaller (GHook* hook, gpointer data) +{ + GtkTypeQuery *query = (GtkTypeQuery*) data; + GtkCreationHook func = hook->func; + + return func(query, hook->data); +} + GtkType gtk_type_unique (GtkType parent_type, const GtkTypeInfo *type_info) @@ -253,7 +262,17 @@ gtk_type_unique (GtkType parent_type, if (!new_type) g_free (type_name); - + else if ( creation_hook_list ) + { + GtkTypeQuery data; + data.type = new_type; + data.type_name = type_name; + data.object_size = type_info->object_size; + data.class_size = type_info->class_size; + + g_hook_list_marshal_check(creation_hook_list, FALSE, gtk_creation_marshaller, &data); + } + return new_type; } @@ -1015,3 +1034,40 @@ gtk_identifier_get_type (void) return identifier_type; } + +guint +gtk_type_add_creation_hook (GtkCreationHook hook_func, + gpointer data, + GDestroyNotify destroy) +{ + static guint seq_id =1; + GHook * hook; + + g_return_val_if_fail(hook_func != NULL, 0); + + if (!creation_hook_list) + { + creation_hook_list = g_new(GHookList, 1); + g_hook_list_init(creation_hook_list, sizeof(GHook)); + } + + hook = g_hook_alloc (creation_hook_list); + hook->data = data; + hook->func = hook_func; + hook->destroy = destroy; + + creation_hook_list->seq_id = seq_id; + g_hook_prepend(creation_hook_list, hook); + seq_id = creation_hook_list->seq_id; + + return hook->hook_id; +} + +void +gtk_type_remove_creation_hook (guint hook_id) +{ + g_return_if_fail(hook_id != 0); + + if (!creation_hook_list || !g_hook_destroy(creation_hook_list, hook_id)) + g_warning("gtk_type_remove_creation_hook(): could not find hook (%u)", hook_id); +} |