diff options
author | Tim Janik <timj@gtk.org> | 1998-09-17 05:00:30 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-09-17 05:00:30 +0000 |
commit | ee1b96185ff884190a0e44564fb5b36d249ff271 (patch) | |
tree | 2a90164f8529c981e3eb808a29fbc8ebebbcef33 /gtk/gtkobject.c | |
parent | 0b54ffa9d6bc9beb8b13eda2365e00e2de8ff5ca (diff) | |
download | gtk+-ee1b96185ff884190a0e44564fb5b36d249ff271.tar.gz |
added gtk_object_set_data_destroy and gtk_object_set_data_destroy_by_id
Thu Sep 17 05:12:48 1998 Tim Janik <timj@gtk.org>
* gtk/gtkobject.h: added gtk_object_set_data_destroy and
gtk_object_set_data_destroy_by_id functions to set the destroy
function pointer for an existing data portion.
* gtk/gtkobject.c: removed the GtkObjectData implementation and
made all gtk_object_*data* functions use the GLib equivalents.
Diffstat (limited to 'gtk/gtkobject.c')
-rw-r--r-- | gtk/gtkobject.c | 199 |
1 files changed, 52 insertions, 147 deletions
diff --git a/gtk/gtkobject.c b/gtk/gtkobject.c index ed41b10126..af023f0c38 100644 --- a/gtk/gtkobject.c +++ b/gtk/gtkobject.c @@ -23,9 +23,6 @@ #include "gtksignal.h" -#define GTK_OBJECT_DATA_ID_BLOCK_SIZE (1024) -#define GTK_OBJECT_DATA_BLOCK_SIZE (1024) - enum { DESTROY, LAST_SIGNAL @@ -40,17 +37,6 @@ enum { }; -typedef struct _GtkObjectData GtkObjectData; - -struct _GtkObjectData -{ - guint id; - gpointer data; - GtkDestroyNotify destroy; - GtkObjectData *next; -}; - - void gtk_object_init_type (void); static void gtk_object_base_class_init (GtkObjectClass *klass); static void gtk_object_class_init (GtkObjectClass *klass); @@ -75,15 +61,6 @@ static guint user_data_key_id = 0; static const gchar *weakrefs_key = "gtk-weakrefs"; static guint weakrefs_key_id = 0; -static GtkObjectData *gtk_object_data_free_list = NULL; - -#define GTK_OBJECT_DATA_DESTROY( odata ) { \ - if (odata->destroy) \ - odata->destroy (odata->data); \ - odata->next = gtk_object_data_free_list; \ - gtk_object_data_free_list = odata; \ -} - #ifdef G_ENABLE_DEBUG static guint obj_count = 0; @@ -207,7 +184,7 @@ gtk_object_init (GtkObject *object) GTK_OBJECT_FLAGS (object) = GTK_FLOATING; object->ref_count = 1; - object->object_data = NULL; + g_datalist_init (&object->object_data); #ifdef G_ENABLE_DEBUG if (gtk_debug_flags & GTK_DEBUG_OBJECTS) @@ -263,14 +240,7 @@ gtk_object_finalize (GtkObject *object) { gtk_object_notify_weaks (object); - while (object->object_data) - { - GtkObjectData *odata; - - odata = object->object_data; - object->object_data = odata->next; - GTK_OBJECT_DATA_DESTROY (odata); - } + g_datalist_clear (&object->object_data); gtk_type_free (GTK_OBJECT_TYPE (object), object); } @@ -926,9 +896,10 @@ gtk_object_set_data_by_id (GtkObject *object, GQuark data_id, gpointer data) { - g_return_if_fail (data_id > 0); + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_OBJECT (object)); - gtk_object_set_data_by_id_full (object, data_id, data, NULL); + g_datalist_id_set_data (&object->object_data, data_id, data); } void @@ -936,9 +907,11 @@ gtk_object_set_data (GtkObject *object, const gchar *key, gpointer data) { + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_OBJECT (object)); g_return_if_fail (key != NULL); - gtk_object_set_data_by_id_full (object, gtk_object_data_force_id (key), data, NULL); + g_datalist_set_data (&object->object_data, key, data); } void @@ -947,89 +920,10 @@ gtk_object_set_data_by_id_full (GtkObject *object, gpointer data, GtkDestroyNotify destroy) { - GtkObjectData *odata; - g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_OBJECT (object)); - g_return_if_fail (data_id > 0); - odata = object->object_data; - if (!data) - { - GtkObjectData *prev; - - prev = NULL; - - while (odata) - { - if (odata->id == data_id) - { - if (prev) - prev->next = odata->next; - else - object->object_data = odata->next; - - GTK_OBJECT_DATA_DESTROY (odata); - return; - } - - prev = odata; - odata = odata->next; - } - } - else - { - while (odata) - { - if (odata->id == data_id) - { - register GtkDestroyNotify dfunc; - register gpointer ddata; - - dfunc = odata->destroy; - ddata = odata->data; - odata->destroy = destroy; - odata->data = data; - - /* we need to have updated all structures prior to - * invokation of the destroy function - */ - if (dfunc) - dfunc (ddata); - - return; - } - - odata = odata->next; - } - - if (gtk_object_data_free_list) - { - odata = gtk_object_data_free_list; - gtk_object_data_free_list = odata->next; - } - else - { - GtkObjectData *odata_block; - guint i; - - odata_block = g_new0 (GtkObjectData, GTK_OBJECT_DATA_BLOCK_SIZE); - for (i = 1; i < GTK_OBJECT_DATA_BLOCK_SIZE; i++) - { - (odata_block + i)->next = gtk_object_data_free_list; - gtk_object_data_free_list = (odata_block + i); - } - - odata = odata_block; - } - - odata->id = data_id; - odata->data = data; - odata->destroy = destroy; - odata->next = object->object_data; - - object->object_data = odata; - } + g_datalist_id_set_data_full (&object->object_data, data_id, data, destroy); } void @@ -1038,87 +932,98 @@ gtk_object_set_data_full (GtkObject *object, gpointer data, GtkDestroyNotify destroy) { + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_OBJECT (object)); g_return_if_fail (key != NULL); - gtk_object_set_data_by_id_full (object, gtk_object_data_force_id (key), data, destroy); + g_datalist_set_data_full (&object->object_data, key, data, destroy); } gpointer gtk_object_get_data_by_id (GtkObject *object, GQuark data_id) { - GtkObjectData *odata; - g_return_val_if_fail (object != NULL, NULL); g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); - if (data_id) - { - odata = object->object_data; - while (odata) - { - if (odata->id == data_id) - return odata->data; - odata = odata->next; - } - } - - return NULL; + return g_datalist_id_get_data (&object->object_data, data_id); } gpointer gtk_object_get_data (GtkObject *object, const gchar *key) { - guint id; - + g_return_val_if_fail (object != NULL, NULL); + g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); g_return_val_if_fail (key != NULL, NULL); - id = gtk_object_data_try_key (key); - if (id) - return gtk_object_get_data_by_id (object, id); - - return NULL; + return g_datalist_get_data (&object->object_data, key); } void gtk_object_remove_data_by_id (GtkObject *object, GQuark data_id) { - if (data_id) - gtk_object_set_data_by_id_full (object, data_id, NULL, NULL); + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_OBJECT (object)); + + g_datalist_id_remove_data (&object->object_data, data_id); } void gtk_object_remove_data (GtkObject *object, const gchar *key) { - gint id; + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_OBJECT (object)); + g_return_if_fail (key != NULL); + g_datalist_remove_data (&object->object_data, key); +} + +void +gtk_object_set_data_destroy_by_id (GtkObject *object, + GQuark key_id, + GDestroyNotify destroy_func) +{ + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_OBJECT (object)); + + g_datalist_id_set_destroy (&object->object_data, key_id, destroy_func); +} + +void +gtk_object_set_data_destroy (GtkObject *object, + const gchar *key, + GDestroyNotify destroy_func) +{ + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_OBJECT (object)); g_return_if_fail (key != NULL); - id = gtk_object_data_try_key (key); - if (id) - gtk_object_set_data_by_id_full (object, id, NULL, NULL); + g_datalist_set_destroy (&object->object_data, key, destroy_func); } void gtk_object_set_user_data (GtkObject *object, gpointer data) { + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_OBJECT (object)); + if (!user_data_key_id) user_data_key_id = g_quark_from_static_string (user_data_key); - gtk_object_set_data_by_id_full (object, user_data_key_id, data, NULL); + g_datalist_id_set_data (&object->object_data, user_data_key_id, data); } gpointer gtk_object_get_user_data (GtkObject *object) { - if (user_data_key_id) - return gtk_object_get_data_by_id (object, user_data_key_id); + g_return_val_if_fail (object != NULL, NULL); + g_return_val_if_fail (GTK_IS_OBJECT (object), NULL); - return NULL; + return g_datalist_id_get_data (&object->object_data, user_data_key_id); } /******************************************* |