From f3af00f4501d4f019146b1be468fb81723f6da1a Mon Sep 17 00:00:00 2001 From: Paolo Molaro Date: Mon, 11 Jan 1999 07:09:07 +0000 Subject: [PATCH] Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook(). You can have a notification when a type is created. --- ChangeLog | 5 ++++ ChangeLog.pre-2-0 | 5 ++++ ChangeLog.pre-2-10 | 5 ++++ ChangeLog.pre-2-2 | 5 ++++ ChangeLog.pre-2-4 | 5 ++++ ChangeLog.pre-2-6 | 5 ++++ ChangeLog.pre-2-8 | 5 ++++ gtk/gtktypeutils.c | 60 ++++++++++++++++++++++++++++++++++++++++++++-- gtk/gtktypeutils.h | 8 +++++-- 9 files changed, 99 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 66310e7384..719cd47983 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro + + * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook(). + You can have a notification when a type is created. + 1999-01-11 Tim Janik * gtk/gtkmain.c (gtk_propagate_event): added an assertement. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 66310e7384..719cd47983 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,8 @@ +Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro + + * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook(). + You can have a notification when a type is created. + 1999-01-11 Tim Janik * gtk/gtkmain.c (gtk_propagate_event): added an assertement. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 66310e7384..719cd47983 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,8 @@ +Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro + + * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook(). + You can have a notification when a type is created. + 1999-01-11 Tim Janik * gtk/gtkmain.c (gtk_propagate_event): added an assertement. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 66310e7384..719cd47983 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,8 @@ +Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro + + * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook(). + You can have a notification when a type is created. + 1999-01-11 Tim Janik * gtk/gtkmain.c (gtk_propagate_event): added an assertement. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 66310e7384..719cd47983 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,8 @@ +Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro + + * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook(). + You can have a notification when a type is created. + 1999-01-11 Tim Janik * gtk/gtkmain.c (gtk_propagate_event): added an assertement. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 66310e7384..719cd47983 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,8 @@ +Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro + + * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook(). + You can have a notification when a type is created. + 1999-01-11 Tim Janik * gtk/gtkmain.c (gtk_propagate_event): added an assertement. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 66310e7384..719cd47983 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,8 @@ +Mon, 11 Jan 1999 08:09:08 +0100 Paolo Molaro + + * gtk/gtktypeutils.[ch]: add gtk_type_{add,remove}_creation_hook(). + You can have a notification when a type is created. + 1999-01-11 Tim Janik * gtk/gtkmain.c (gtk_propagate_event): added an assertement. diff --git a/gtk/gtktypeutils.c b/gtk/gtktypeutils.c index 1d3fed1c1a..dc33bc84d9 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); +} diff --git a/gtk/gtktypeutils.h b/gtk/gtktypeutils.h index 42bf9d8093..5b42840ce5 100644 --- a/gtk/gtktypeutils.h +++ b/gtk/gtktypeutils.h @@ -153,7 +153,8 @@ typedef void (*GtkSignalMarshaller) (GtkObject *object, GtkSignalFunc func, gpointer func_data, GtkArg *args); - +typedef gboolean (*GtkCreationHook) (GtkTypeQuery *type_info, + gpointer data); /* deprecated */ typedef void (*GtkArgGetFunc) (GtkObject*, GtkArg*, guint); @@ -362,7 +363,10 @@ GtkType gtk_type_get_varargs_type (GtkType foreign_type); */ GtkTypeQuery* gtk_type_query (GtkType type); - +guint gtk_type_add_creation_hook (GtkCreationHook hook, + gpointer data, + GDestroyNotify destroy); +void gtk_type_remove_creation_hook (guint hook_id);