/cvs/xorg/xc/programs/Xserver/hw/xfree86/vga256/drivers/p9x00 oObjectClassPrivate { - GalagoObjectClass *parent_class; - unsigned long serial; - - char *name; char *dbus_iface; - - const GalagoObjectClassInfo *info; }; struct _GalagoObjectPrivate { - GalagoObjectClass *klass; - unsigned int ref_count; GalagoContext *context; - unsigned long flags; - char *dbus_path; - gboolean watched; - - GHashTable *user_data; - - gboolean finalizing; }; -static unsigned long last_serial = 0; +static void galago_object_finalize(GObject *gobject); -/************************************************************************** - * Class API - **************************************************************************/ -GalagoObjectClass * -galago_class_register(GalagoObjectClass *parent_class, const char *name, - const char *dbus_iface, const GalagoObjectClassInfo *info) -{ - GalagoObjectClass *klass; - GalagoObjectClass *tmp_klass; - GList *class_inits = NULL, *l; +static GObjectClass *parent_class = NULL; - galago_return_val_if_fail(parent_class == NULL || - GALAGO_IS_CLASS(parent_class), NULL); - galago_return_val_if_fail(name != NULL, NULL); - galago_return_val_if_fail(*name != '\0', NULL); - galago_return_val_if_fail(info != NULL, NULL); - galago_return_val_if_fail(info->class_size >= sizeof(GalagoObjectClass), - NULL); - galago_return_val_if_fail(info->object_size >= sizeof(GalagoObject), NULL); +G_DEFINE_TYPE(GalagoObject, galago_object, G_TYPE_OBJECT); - klass = g_malloc0(info->class_size); - - klass->magic = GALAGO_CLASS_MAGIC; - - klass->priv = g_new0(GalagoObjectClassPrivate, 1); - - klass->priv->parent_class = parent_class; - klass->priv->serial = ++last_serial; - klass->priv->name = g_strdup(name); - klass->priv->info = info; - - if (dbus_iface != NULL) - klass->priv->dbus_iface = g_strdup(dbus_iface); - - klass->signal_context = galago_signal_context_new(); - - galago_signal_register(klass->signal_context, "destroy", - galago_marshal_VOID, 0); - - for (tmp_klass = klass; - tmp_klass != NULL; - tmp_klass = tmp_klass->priv->parent_class) - { - if (tmp_klass->priv->info->class_init != NULL) - { - class_inits = - g_list_prepend(class_inits, tmp_klass->priv->info->class_init); - } - } - - for (l = class_inits; l != NULL; l = l->next) - ((GalagoObjectClassInitFunc)l->data)(klass); - - g_list_free(class_inits); - - return klass; -} - -GalagoObjectClass * -galago_class_get_parent(const GalagoObjectClass *klass) +static void +galago_object_class_init(GalagoObjectClass *klass) { - galago_return_val_if_fail(klass != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_CLASS(klass), NULL); + GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - return klass->priv->parent_class; -} + parent_class = g_type_class_peek_parent(klass); -const char * -galago_class_get_name(const GalagoObjectClass *klass) -{ - galago_return_val_if_fail(klass != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_CLASS(klass), NULL); - - return klass->priv->name; + gobject_class->finalize = galago_object_finalize; } -const char * -galago_class_get_dbus_iface(const GalagoObjectClass *klass) +static void +galago_object_init(GalagoObject *object) { - galago_return_val_if_fail(klass != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_CLASS(klass), NULL); - - return klass->priv->dbus_iface; -} - -GalagoSignalContext * -galago_class_get_signal_context(const GalagoObjectClass *klass) -{ - galago_return_val_if_fail(klass != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_CLASS(klass), NULL); - - return klass->signal_context; -} - - -/************************************************************************** - * Object API - **************************************************************************/ -void -_galago_object_finalize(GalagoObject *object) -{ - GalagoObjectClass *klass; - - if (GALAGO_OBJECT_HAS_FLAG(object, GALAGO_FLAG_FINALIZING)) - return; - - GALAGO_OBJECT_SET_FLAG(object, GALAGO_FLAG_FINALIZING); - - galago_signal_emit(object, "destroy"); - - galago_context_push(object->priv->context); - - for (klass = object->priv->klass; - klass != NULL; - klass = klass->priv->parent_class) - { - if (klass->finalize != NULL) - klass->finalize(object); - } - - if (galago_object_is_watched(object)) - galago_object_set_watch(object, FALSE); - - if (object->priv->user_data != NULL) - g_hash_table_destroy(object->priv->user_data); - - if (object->priv->dbus_path != NULL) - { - galago_context_remove_object(object); - - g_free(object->priv->dbus_path); - } - - g_free(object->priv); - g_free(object); - - galago_context_pop(); -} - -void * -galago_object_new(GalagoObjectClass *klass) -{ - GalagoObject *object; - GalagoObjectClass *tmp_klass; - GList *object_inits = NULL, *l; - - galago_return_val_if_fail(klass != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_CLASS(klass), NULL); - - if (klass->priv->info->flags & GALAGO_FLAG_ABSTRACT) - { - galago_log_error("Unable to create instance of abstract class '%s'\n", - klass->priv->name); - - return NULL; - } - - object = g_malloc0(klass->priv->info->object_size); - - object->magic = GALAGO_OBJECT_MAGIC; - object->priv = g_new0(GalagoObjectPrivate, 1); - - object->priv->context = galago_context_get(); - object->priv->klass = klass; - object->priv->ref_count = 1; - - for (tmp_klass = klass; - tmp_klass != NULL; - tmp_klass = tmp_klass->priv->parent_class) - { - if (tmp_klass->priv->info->object_init != NULL) - { - object_inits = - g_list_prepend(object_inits, - tmp_klass->priv->info->object_init); - } - } - - for (l = object_inits; l != NULL; l = l->next) - ((GalagoObjectInitFunc)l->data)(object); - - g_list_free(object_inits); - - return object; } -void * -galago_object_ref(void *object) +static void +galago_object_finalize(GObject *gobject) { - galago_return_val_if_fail(object != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_OBJECT(object), NULL); + GalagoObject *object = (GalagoObject *)gobject; - ((GalagoObject *)object)->priv->ref_count++; - - return object; + if (object->priv != NULL) + g_free(object->priv); } -void * -galago_object_unref(void *_object) -{ - GalagoObject *object = (GalagoObject *)_object; - - galago_return_val_if_fail(object != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_OBJECT(object), NULL); - - if (GALAGO_OBJECT_HAS_FLAG(object, GALAGO_FLAG_FINALIZING)) - return NULL; - - galago_return_val_if_fail(object->priv->ref_count > 0, NULL); - - object->priv->ref_count--; - - if (object->priv->ref_count == 0) - { - _galago_object_finalize(object); - - return NULL; - } - - return object; -} - -GalagoObjectClass * -galago_object_get_class(const void *_object) -{ - galago_return_val_if_fail(_object != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_OBJECT(_object), NULL); - - return GALAGO_OBJECT(_object)->priv->klass; -} - void -galago_object_set_flags(void *_object, unsigned long flags) +galago_object_set_dbus_path(GalagoObject *object, const gchar *obj_path) { - galago_return_if_fail(_object != NULL); - galago_return_if_fail(GALAGO_IS_OBJECT(_object)); + g_return_if_fail(object != NULL && GALAGO_IS_OBJECT(object)); - GALAGO_OBJECT(_object)->priv->flags = flags; -} - -unsigned long -galago_object_get_flags(const void *_object) -{ - galago_return_val_if_fail(_object != NULL, 0); - galago_return_val_if_fail(GALAGO_IS_OBJECT(_object), 0); - - return GALAGO_OBJECT(_object)->priv->flags; -} - -void -galago_object_set_dbus_path(void *_object, const char *obj_path) -{ - GalagoObject *object; - - galago_return_if_fail(_object != NULL); - galago_return_if_fail(GALAGO_IS_OBJECT(_object)); - - object = GALAGO_OBJECT(_object); - galago_context_push(object->priv->context); if (object->priv->dbus_path != NULL) @@ -335,25 +94,19 @@ galago_context_pop(); } -const char * -galago_object_get_dbus_path(const void *_object) +const gchar * +galago_object_get_dbus_path(const GalagoObject *object) { - galago_return_val_if_fail(_object != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_OBJECT(_object), NULL); + g_return_val_if_fail(object != NULL && GALAGO_IS_OBJECT(object), NULL); - return GALAGO_OBJECT(_object)->priv->dbus_path; + return object->priv->dbus_path; } void -galago_object_set_watch(void *_object, gboolean watch) +galago_object_set_watch(GalagoObject *object, gboolean watch) { - GalagoObject *object; + g_return_if_fail(object != NULL && GALAGO_IS_OBJECT(object)); - galago_return_if_fail(_object != NULL); - galago_return_if_fail(GALAGO_IS_OBJECT(_object)); - - object = GALAGO_OBJECT(_object); - if (object->priv->watched == watch) return; @@ -361,95 +114,17 @@ } gboolean -galago_object_is_watched(const void *_object) +galago_object_is_watched(const GalagoObject *object) { - galago_return_val_if_fail(_object != NULL, FALSE); - galago_return_val_if_fail(GALAGO_IS_OBJECT(_object), FALSE); + g_return_val_if_fail(object != NULL && GALAGO_IS_OBJECT(object), FALSE); - return GALAGO_OBJECT(_object)->priv->watched; + return object->priv->watched; } -void -galago_object_set_data(void *_object, const char *name, void *value) -{ - GalagoObject *object; - - galago_return_if_fail(_object != NULL); - galago_return_if_fail(GALAGO_IS_OBJECT(_object)); - galago_return_if_fail(name != NULL); - galago_return_if_fail(*name != '\0'); - - object = GALAGO_OBJECT(_object); - - if (object->priv->user_data == NULL) - { - object->priv->user_data = - g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); - } - - if (value == NULL) - g_hash_table_remove(object->priv->user_data, name); - else - g_hash_table_replace(object->priv->user_data, g_strdup(name), value); -} - -void * -galago_object_get_data(const void *_object, const char *name) -{ - GalagoObject *object; - - galago_return_val_if_fail(_object != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_OBJECT(_object), NULL); - galago_return_val_if_fail(name != NULL, NULL); - galago_return_val_if_fail(*name != '\0', NULL); - - object = GALAGO_OBJECT(_object); - - if (object->priv->user_data == NULL) - return NULL; - - return g_hash_table_lookup(object->priv->user_data, name); -} - GalagoContext * -galago_object_get_context(const void *_object) +galago_object_get_context(const GalagoObject *object) { - galago_return_val_if_fail(_object != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_OBJECT(_object), NULL); + g_return_val_if_fail(object != NULL && GALAGO_IS_OBJECT(object), NULL); - return GALAGO_OBJECT(_object)->priv->context; + return object->priv->context; } - -GalagoObject * -galago_object_check_cast(const void *ptr, const GalagoObjectClass *klass) -{ - GalagoObjectClass *tmp_class; - GalagoObject *obj; - gboolean found = FALSE; - - galago_return_val_if_fail(ptr != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_OBJECT(ptr), NULL); - galago_return_val_if_fail(klass != NULL, NULL); - galago_return_val_if_fail(GALAGO_IS_CLASS(klass), NULL); - - obj = GALAGO_OBJECT(ptr); - - for (tmp_class = obj->priv->klass; - tmp_class != NULL && !found; - tmp_class = tmp_class->priv->parent_class) - { - if (tmp_class->priv->serial == klass->priv->serial) - found = TRUE; - } - - if (!found) - { - galago_log_error("Invalid cast from `%s' to `%s'\n", - galago_class_get_name(obj->priv->klass), - galago_class_get_name(klass)); - - return NULL; - } - - return obj; -} Modified: branches/libgalago/glib-port/libgalago/galago-object.h =================================================================== --- branches/libgalago/glib-port/libgalago/galago-object.h 2005-06-20 08:56:49 UTC (rev 1966) +++ branches/libgalago/glib-port/libgalago/galago-object.h 2005-06-21 07:13:18 UTC (rev 1967) @@ -1,5 +1,5 @@ /** - * @file libgalago/galago-object.h Galago Object API + * @file libgalago/galago-object.h Galago Base Object * * @Copyright (C) 2004-2005 Christian Hammond * @@ -28,27 +28,10 @@ #include <dbus/dbus.h> typedef struct _GalagoObjectClass GalagoObjectClass; -typedef struct _GalagoObjectClassInfo GalagoObjectClassInfo; typedef struct _GalagoObjectClassPrivate GalagoObjectClassPrivate; typedef struct _GalagoObject GalagoObject; typedef struct _GalagoObjectPrivate GalagoObjectPrivate; -typedef void (*GalagoObjectClassInitFunc)(GalagoObjectClass *klass); -typedef void (*GalagoObjectClassFinalizeFunc)(GalagoObjectClass *klass); -typedef void (*GalagoObjectInitFunc)(GalagoObject *object); - -typedef enum -{ - GALAGO_FLAG_FINALIZING = 1 << 1 /**< Object is being finalized. */ - -} GalagoObjectFlags; - -typedef enum -{ - GALAGO_FLAG_ABSTRACT = 1 << 1 /**< Abstract object. */ - -} GalagoObjectClassFlags; - #include <libgalago/galago-context-base.h> #include <libgalago/galago-signals.h> @@ -58,14 +41,11 @@ */ struct _GalagoObjectClass { - unsigned long magic; + GObjectClass parent_class; GalagoObjectClassPrivate *priv; - GalagoSignalContext *signal_context; - - void (*finalize)(GalagoObject *object); - + /* vtable */ void (*dbus_message_append)(DBusMessageIter *iter, const GalagoObject *object); void *(*dbus_message_get)(DBusMessageIter *iter); @@ -78,24 +58,11 @@ }; /** - * Class information. - */ -struct _GalagoObjectClassInfo -{ - unsigned long flags; - size_t class_size; - GalagoObjectClassInitFunc class_init; - GalagoObjectClassFinalizeFunc class_finalize; - size_t object_size; - GalagoObjectInitFunc object_init; -}; - -/** * An object. */ struct _GalagoObject { - unsigned long magic; + GObject parent_object; GalagoObjectPrivate *priv; @@ -105,162 +72,35 @@ void (*reserved_4)(void); }; -#define GALAGO_OBJECT_MAGIC 0xB00F -#define GALAGO_CLASS_MAGIC 0xB0B0 -#define GALAGO_IS_OBJECT(ptr) \ - ((ptr) != NULL && ((GalagoObject *)(ptr))->magic == GALAGO_OBJECT_MAGIC) +#define GALAGO_TYPE_OBJECT (galago_object_get_type()) +#define GALAGO_OBJECT(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), GALAGO_TYPE_OBJECT, GalagoObject)) +#define GALAGO_OBJECT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), GALAGO_TYPE_OBJECT, GalagoObjectClass)) +#define GALAGO_IS_OBJECT(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj), GALAGO_TYPE_OBJECT)) +#define GALAGO_IS_OBJECT_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), GALAGO_TYPE_OBJECT)) +#define GALAGO_OBJECT_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), GALAGO_TYPE_OBJECT, GalagoObjectClass)) -#define GALAGO_IS_CLASS(ptr) \ - ((ptr) != NULL && ((GalagoObjectClass *)(ptr))->magic == GALAGO_CLASS_MAGIC) - -#define GALAGO_OBJECT(ptr) \ - ((ptr) == NULL ? NULL : \ - (GALAGO_IS_OBJECT(ptr) ? (GalagoObject *)(ptr) : NULL)) - -#define GALAGO_OBJECT_CLASS(obj) (galago_object_get_class(obj)) - -#define GALAGO_OBJECT_CAST(obj, klass, type) \ - ((obj) == NULL ? NULL : (type *)galago_object_check_cast((obj), (klass))) - -#define GALAGO_OBJECT_GET_FLAGS(obj) (galago_object_get_flags(obj)) -#define GALAGO_OBJECT_SET_FLAGS(obj, flags) \ - galago_object_set_flags((obj), (flags)) - -#define GALAGO_OBJECT_SET_FLAG(obj, flag) \ - GALAGO_OBJECT_SET_FLAGS((obj), GALAGO_OBJECT_GET_FLAGS(obj) | (flag)) -#define GALAGO_OBJECT_UNSET_FLAG(obj, flag) \ - GALAGO_OBJECT_SET_FLAGS((obj), GALAGO_OBJECT_GET_FLAGS(obj) & ~(flag)) - -#define GALAGO_OBJECT_HAS_FLAG(obj, flag) \ - ((GALAGO_OBJECT_GET_FLAGS(obj) & (flag)) == (flag)) - #ifdef __cplusplus extern "C" { #endif /**************************************************************************/ -/** @name Class API */ -/**************************************************************************/ -/*@{*/ - -/** - * Registers a n/cvs/xorg/xc/programs/Xserver/hw/xfree86/xaa id *object, const char *name); - -/** * Returns the object's context. * * @param object The object. * * @return The object's context. */ -GalagoContext *galago_object_get_context(const void *object); +GalagoContext *galago_object_get_context(const GalagoObject *object); -/** - * Casts the specified pointer to a GalagoObject, if the pointer is an object - * and matches the type specified. - * - * @param ptr The pointer to the object to cast. - * @param klass The class type. - * - * @return @a ptr casted into a GalagoObject, if @a ptr is an object and if - * its class type matches @a klass. - */ -GalagoObject *galago_object_check_cast(const void *ptr, - const GalagoObjectClass *klass); - /*@}*/ #ifdef __cplusplus Deleted: branches/libgalago/glib-port/libgalago/galago-signals.c =================================================================== --- branches/libgalago/glib-port/libgalago/galago-signals.c 2005-06-20 08:56:49 UTC (rev 1966) +++ branches/libgalago/glib-port/libgalago/galago-signals.c 2005-06-21 07:13:18 UTC (rev 1967) @@ -1,483 +0,0 @@ -/** - * @file libgalago/galago-signals.c Galago Signals API - * - * @Copyright (C) 2004-2005 Christian Hammond - * - * This library is g_free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#include <libgalago/galago-signals.h> -#include <libgalago/galago-assert.h> -#include <libgalago/galago-core.h> -#include <string.h> - -struct _GalagoSignalHandler -{ - size_t id; - - GalagoSignalContext *signal_context; - void *object; - char *signal; - GCallback cb; - void *user_data; - size_t ref_count; -}; - -struct _GalagoSignalContext -{ - GHashTable *signals; - - size_t g_freeze_count; -}; - -typedef struct -{ - GalagoMarshalFunc marshal; - int num_values; - GalagoType *value_types; - - GList *handlers; - -} GalagoSignalData; - -static GHashTable *signal_handlers = NULL; -static gboolean initted = FALSE; -static size_t last_signal_id = 0; - - -/************************************************************************** - * Property Watch API - **************************************************************************/ -static void galago_signal_handler_ref(GalagoSignalHandler *signal_handler); -static void galago_signal_handler_unref(GalagoSignalHandler *signal_handler); - -static GalagoSignalHandler * -galago_signal_handler_new(GalagoSignalContext *signal_context, void *obj, - const char *signal, GCallback cb, - void *user_data) -{ - GalagoSignalHandler *signal_handler; - GalagoSignalData *signal_data; - - galago_return_val_if_fail(signal_context != NULL, NULL); - galago_return_val_if_fail(signal != NULL, NULL); - galago_return_val_if_fail(cb != NULL, NULL); - - signal_handler = g_new0(GalagoSignalHandler, 1); - signal_handler->id = ++last_signal_id; - signal_handler->signal_context = signal_context; - signal_handler->object = obj; - signal_handler->cb = cb; - signal_handler->user_data = user_data; - signal_handler->signal = g_strdup(signal); - signal_handler->ref_count = 1; - - g_hash_table_insert(signal_handlers, - GSIZE_TO_POINTER(signal_handler->id), signal_handler); - - signal_data = g_hash_table_lookup(signal_context->signals, - signal_handler->signal); - - galago_return_val_if_fail(signal_data != NULL, FALSE); - - signal_data->handlers = g_list_append(signal_data->handlers, - signal_handler); - - return signal_handler; -} - -static void -galago_signal_handler_destroy(GalagoSignalHandler *signal_handler) -{ - GalagoSignalData *signal_data; - - galago_return_if_fail(signal_handler != NULL); - - if (signal_handler->ref_count > 0) - { - galago_signal_handler_unref(signal_handler); - return; - } - - signal_data = g_hash_table_lookup( - signal_handler->signal_context->signals, signal_handler->signal); - - if (signal_data != NULL) - { - signal_data->handlers = g_list_remove(signal_data->handlers, - signal_handler); - } - - g_hash_table_remove(signal_handlers, GSIZE_TO_POINTER(signal_handler->id)); - - if (signal_handler->signal != NULL) - g_free(signal_handler->signal); - - g_free(signal_handler); -} - -static void -galago_signal_handler_ref(GalagoSignalHandler *signal_handler) -{ - galago_return_if_fail(signal_handler != NULL); - - signal_handler->ref_count++; -} - -static void -galago_signal_handler_unref(GalagoSignalHandler *signal_handler) -{ - galago_return_if_fail(signal_handler != NULL); - - signal_handler->ref_count--; - - if (signal_handler->ref_count == 0) - galago_signal_handler_destroy(signal_handler); -} - -static void -destroy_signal(GalagoSignalData *signal_data) -{ - g_list_foreach(signal_data->handlers, - (GFunc)galago_signal_handler_destroy, NULL); - g_list_free(signal_data->handlers); - - if (signal_data->value_types != NULL) - g_free(signal_data->value_types); -} - -/************************************************************************** - * Signal Context API - **************************************************************************/ -static void -galago_signal_context_remove_handler(GalagoSignalContext *signal_context, - GalagoSignalHandler *signal_handler) -{ - GalagoSignalData *signal_data; - - galago_return_if_fail(signal_context != NULL); - galago_return_if_fail(signal_handler != NULL); - - signal_data = g_hash_table_lookup(signal_context->signals, - signal_handler->signal); - - galago_return_if_fail(signal_data != NULL); - - galago_signal_handler_unref(signal_handler); -} - -GalagoSignalContext * -galago_signal_context_new(void) -{ - GalagoSignalContext *signal_context; - - signal_context = g_new0(GalagoSignalContext, 1); - - signal_context->signals = - g_hash_table_new_full(g_str_hash, g_str_equal, g_free, - (GFreeFunc)destroy_signal); - - return signal_context; -} - -void -galago_signal_context_destroy(GalagoSignalContext *signal_context) -{ - galago_return_if_fail(signal_context != NULL); - - g_hash_table_destroy(signal_context->signals); - - g_free(signal_context); -} - -void -galago_signal_context_freeze(GalagoSignalContext *signal_context) -{ - galago_return_if_fail(signal_context != NULL); - - signal_context->g_freeze_count++; -} - -void -galago_signal_context_thaw(GalagoSignalContext *signal_context) -{ - galago_return_if_fail(signal_context != NULL); - - signal_context->g_freeze_count--; -} - -gboolean -galago_signal_context_is_frozen(const GalagoSignalContext *signal_context) -{ - galago_return_val_if_fail(signal_context != NULL, FALSE); - - return (signal_context->g_freeze_count > 0); -} - -GalagoSignalHandler * -galago_signal_context_find_handler(const GalagoSignalContext *signal_context, - const void *object, const char *signal, - GCallback cb) -{ - GalagoSignalData *signal_data; - GList *l; - - galago_return_val_if_fail(signal_context != NULL, NULL); - galago_return_val_if_fail(signal != NULL, NULL); - galago_return_val_if_fail(cb != NULL, NULL); - - signal_data = g_hash_table_lookup(signal_context->signals, signal); - - galago_return_val_if_fail(signal_data != NULL, NULL); - - for (l = signal_data->handlers; l != NULL; l = l->next) - { - GalagoSignalHandler *signal_handler = (GalagoSignalHandler *)l->data; - - if (signal_handler->object == object && signal_handler->cb == cb) - return signal_handler; - } - - return NULL; -} - -GalagoSignalHandler * -galago_signal_context_find_handler_with_id(unsigned long id) -{ - galago_return_val_if_fail(id > 0, NULL); - - return (GalagoSignalHandler *)g_hash_table_lookup(signal_handlers, - GSIZE_TO_POINTER(id)); -} - - -/************************************************************************** - * Signals Subsystem API - **************************************************************************/ -gboolean -galago_signal_register(GalagoSignalContext *signal_context, - const char *signal, GalagoMarshalFunc marshal, - size_t num_values, ...) -{ - GalagoSignalData *signal_data; - - galago_return_val_if_fail(signal_context != NULL, FALSE); - galago_return_val_if_fail(signal != NULL, FALSE); - galago_return_val_if_fail(marshal != NULL, FALSE); - - if (g_hash_table_lookup(signal_context->signals, signal) != NULL) - return FALSE; - - signal_data = g_new0(GalagoSignalData, 1); - - signal_data->marshal = marshal; - signal_data->num_values = num_values; - - if (num_values > 0) - { - va_list args; - int i; - - signal_data->value_types = g_new0(GalagoType, num_values); - - va_start(args, num_values); - - for (i = 0; i < num_values; i++) - signal_data->value_types[i] = va_arg(args, GalagoType); - - va_end(args); - } - - g_hash_table_insert(signal_context->signals, g_strdup(signal), signal_data); - - return TRUE; -} - -void -galago_signal_unregister(GalagoSignalContext *signal_context, - const char *signal) -{ - galago_return_if_fail(signal_context != NULL); - galago_return_if_fail(signal != NULL); - - g_hash_table_remove(signal_context->signals, signal); -} - -static unsigned long -_galago_signal_connect_common(GalagoSignalContext *signal_context, void *obj, - const char *signal, GCallback cb, - void *user_data) -{ - GalagoSignalHandler *signal_handler; - - signal_handler = galago_signal_handler_new(signal_context, obj, signal, - cb, user_data); - - if (obj != NULL) - galago_object_set_watch(obj, TRUE); - else - galago_core_set_watch_all(TRUE); - - return signal_handler->id; -} - -unsigned long -galago_signal_connect(void *obj, const char *signal, GCallback cb, - void *user_data) -{ - GalagoSignalContext *signal_context; - - galago_return_val_if_fail(obj != NULL, 0); - galago_return_val_if_fail(signal != NULL, 0); - galago_return_val_if_fail(*signal != '\0', 0); - galago_return_val_if_fail(cb != NULL, 0); - galago_return_val_if_fail(GALAGO_IS_OBJECT(obj), 0); - - signal_context = galago_class_get_signal_context(GALAGO_OBJECT_CLASS(obj)); - - return _galago_signal_connect_common(signal_context, obj, signal, cb, - user_data); -} - -unsigned long -galago_signal_connect_class(GalagoObjectClass *klass, const char *signal, - GCallback cb, void *user_data) -{ - GalagoSignalContext *signal_context; - - galago_return_val_if_fail(klass != NULL, 0); - galago_return_val_if_fail(signal != NULL, 0); - galago_return_val_if_fail(*signal != '\0', 0); - galago_return_val_if_fail(cb != NULL, 0); - - signal_context = galago_class_get_signal_context(klass); - - return _galago_signal_connect_common(signal_context, NULL, signal, cb, - user_data); -} - -void -galago_signals_disconnect_by_id(unsigned long id) -{ - GalagoSignalHandler *signal_handler; - - galago_return_if_fail(id > 0); - - signal_handler = galago_signal_context_find_handler_with_id(id); - - galago_return_if_fail(signal_handler != NULL); - - galago_signal_context_remove_handler(signal_handler->signal_context, - signal_handler); -} - -void -galago_signal_emit(void *object, const char *signal, ...) -{ - GalagoObjectClass *klass; - GalagoSignalContext *signal_context; - va_list args; - - galago_return_if_fail(object != NULL); - galago_return_if_fail(signal != NULL); - galago_return_if_fail(GALAGO_IS_OBJECT(object)); - - klass = GALAGO_OBJECT_CLASS(object); - signal_context = galago_class_get_signal_context(klass); - - if (galago_signal_context_is_frozen(signal_context)) - return; - - va_start(args, signal); - galago_signal_emit_vargs(object, signal, args); - va_end(args); -} - -void -galago_signal_emit_vargs(void *object, const char *signal, va_list args) -{ - GalagoSignalData *signal_data; - GalagoSignalHandler *signal_handler = NULL; - GalagoObjectClass *klass; - GalagoSignalContext *signal_context; - GList *l; - va_list tmp; - - galago_return_if_fail(object != NULL); - galago_return_if_fail(signal != NULL); - galago_return_if_fail(GALAGO_IS_OBJECT(object)); - - klass = GALAGO_OBJECT_CLASS(object); - signal_context = galago_class_get_signal_context(klass); - - if (galago_signal_context_is_frozen(signal_context)) - return; - - signal_data = g_hash_table_lookup(signal_context->signals, signal); - - if (signal_data == NULL) - { - galago_log_error( - "The signal '%s' for class '%s' was not registered. " - "This is probably a bug in libgalago. Please report this.\n", - signal, galago_class_get_name(klass)); - - return; - } - - for (l = signal_data->handlers; l != NULL; l = l->next) - { - if (signal_handler != NULL) - galago_signal_handler_unref(signal_handler); - - signal_handler = (GalagoSignalHandler *)l->data; - galago_signal_handler_ref(signal_handler); - - G_VA_COPY(tmp, args); - - if (signal_handler->object == NULL || signal_handler->object == object) - { - signal_data->marshal(signal_handler->cb, object, signal, tmp, - signal_handler->user_data); - } - - va_end(tmp); - } - - if (signal_handler != NULL) - galago_signal_handler_unref(signal_handler); -} - -void -galago_signals_init(void) -{ - galago_return_if_fail(!initted); - - last_signal_id = 0; - signal_handlers = g_hash_table_new(g_int_hash, g_int_equal); - - initted = TRUE; -} - -void -galago_signals_uninit(void) -{ - galago_return_if_fail(initted); - - g_hash_table_destroy(signal_handlers); - signal_handlers = NULL; - - initted = FALSE; -} Deleted: branches/libgalago/glib-port/libgalago/galago-signals.h =================================================================== --- branches/libgalago/glib-port/libgalago/galago-signals.h 2005-06-20 08:56:49 UTC (rev 1966) +++ branches/libgalago/glib-port/libgalago/galago-signals.h 2005-06-21 07:13:18 UTC (rev 1967) @@ -1,209 +0,0 @@ -/** - * @file libgalago/galago-signals.h Galago Signals API - * - * @Copyright (C) 2004-2005 Christian Hammond - * - * This library is g_free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef _GALAGO_SIGNALS_H_ -#define _GALAGO_SIGNALS_H_ - -typedef struct _GalagoSignalHandler GalagoSignalHandler; -typedef struct _GalagoSignalContext GalagoSignalContext; - -#include <libgalago/galago-object.h> -#include <libgalago/galago-value.h> - -typedef void (*GalagoMarshalFunc)(GCallback cb, GalagoObject *obj, - const char *signal, va_list args, - void *data); - -#define GALAGO_SIGNAL_CONTEXT(obj) \ - (galago_class_get_signal_context(GALAGO_OBJECT_CLASS(obj))) - -#ifdef __cplusplus -extern "C" { -#endif - -/**************************************************************************/ -/** @name Signal Context API */ -/**************************************************************************/ -/*@{*/ - -/** - * Creates a signal context. - * - * @return The new signal context. - */ -GalagoSignalContext *galago_signal_context_new(void); - -/** - * Destroys a signal context. - * - * @param signal_context The signal context. - */ -void galago_signal_context_destroy(GalagoSignalContext *signal_context); - -/** - * Freezes a signal context. - * - * @param signal_context The signal context to g_freeze. - */ -void galago_signal_context_freeze(GalagoSignalContext *signal_context); - -/** - * Thaws a signal context. - * - * @param signal_context The signal context to thaw. - */ -void galago_signal_context_thaw(GalagoSignalContext *signal_context); - -/** - * Returns whether or not a signal context is frozen. - * - * @param signal_context The signal context. - * - * @return TRUE if the signal context is frozen, or FALSE. - */ -gboolean galago_signal_context_is_frozen( - const GalagoSignalContext *signal_context); - -/** - * Finds a signal handler with the specified object, signal name, and callback. - * - * @param signal_context The signal context. - * @param object The object. - * @param signal The signal. - * @param cb The callback. - * - * @return The signal handler, if found, or NULL. - */ -GalagoSignalHandler *galago_signal_context_find_handler( - const GalagoSignalContext *signal_context, const void *object, - const char *signal, GCallback cb); - -/** - * Finds a signal handler with the specified ID. - * - * @param id The signal handler ID. - * - * @return The signal handler, if fond, or NULL. - */ -GalagoSignalHandler *galago_signal_context_find_handler_with_id( - unsigned long id); - -/*@}*/ - -/**************************************************************************/ -/** @name Signals Subsystem API */ -/**************************************************************************/ -/*@{*/ - -/** - * Registers a signal in the signal context. - * - * @param signal_context The signal context. - * @param signal The signal name. - * @param marshal The marshaller function. - * @param num_values The number of values passed to the callback. - * @param ... The optional list of data types passed. - * - * @return TRUE if this signal was registered, or FALSE if there was an - * error or if @a signal is already registered. - */ -gboolean galago_signal_register(GalagoSignalContext *signal_context, - const char *signal, - GalagoMarshalFunc marshal, - size_t num_values, ...); - -/** - * Unregisters a signal in the signal context. - * - * @param signal_context The signal context. - * @param signal The signal name. - */ -void galago_signal_unregister(GalagoSignalContext *signal_context, - const char *signal); - -/** - * Connects a signal handler to a signal for all objects in a class. - * - * @param klass The class. - * @param signal The signal to connect to. - * @param cb The callback function. - * @param user_data User-specified data. - * - * @return The ID of the signal handler, or 0 if there was an error. - */ -unsigned long galago_signal_connect_class(GalagoObjectClass *klass, - const char *signal, - GCallback cb, void *user_data); - -/** - * Connects a signal handler to a signal for an object. - * - * @param obj The object to connect to, or NULL for all on the context. - * @param signal The signal to connect to. - * @param cb The callback function. - * @param user_data User-specified data. - * - * @return The ID of the signal handler, or 0 if there was an error. - */ -unsigned long galago_signal_connect(void *obj, const char *signal, - GCallback cb, void *user_data); - -/** - * Disconnects a signal handler with the specified ID. - * - * @param id The signal handler ID. - */ -void galago_signals_disconnect_by_id(unsigned long id); - -/** - * Emits a signal. - * - * @param object The object. - * @param signal The signal name. - * @param ... The arguments list. - */ -void galago_signal_emit(void *object, const char *signal, ...); - -/** - * Emits a signal, using a va_list of arguments. - * - * @param object The object. - * @param signal The signal name. - * @param args The arguments list. - */ -void galago_signal_emit_vargs(void *object, const char *signal, va_list args); - -/** - * Initializes the signals subsystem. - */ -void galago_signals_init(void); - -/** - * Uninitializes the signals subsystem. - */ -void galago_signals_uninit(void); - -/*@}*/ - -#ifdef __cplusplus -} -#endif - -#endif /* _GALAGO_SIGNALS_H_ */