#include "clutter-marshal.h"
#include "clutter-private.h"
+#define CLUTTER_BINDING_POOL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), CLUTTER_TYPE_BINDING_POOL, ClutterBindingPoolClass))
+#define CLUTTER_IS_BINDING_POOL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CLUTTER_TYPE_BINDING_POOL))
+#define CLUTTER_BINDING_POOL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CLUTTER_TYPE_BINDING_POOL, ClutterBindingPoolClass))
+
#define BINDING_MOD_MASK ((CLUTTER_SHIFT_MASK | \
CLUTTER_CONTROL_MASK | \
CLUTTER_MOD1_MASK | \
CLUTTER_HYPER_MASK | \
CLUTTER_META_MASK) | CLUTTER_RELEASE_MASK)
-typedef struct _ClutterBindingEntry ClutterBindingEntry;
+typedef struct _ClutterBindingPoolClass ClutterBindingPoolClass;
+typedef struct _ClutterBindingEntry ClutterBindingEntry;
static GSList *binding_pools = NULL;
static GQuark key_class_bindings = 0;
struct _ClutterBindingPool
{
+ GObject parent_instance;
+
gchar *name; /* interned string, do not free */
GSList *entries;
GHashTable *entries_hash;
};
+struct _ClutterBindingPoolClass
+{
+ GObjectClass parent_class;
+};
+
struct _ClutterBindingEntry
{
gchar *name; /* interned string, do not free */
guint is_blocked : 1;
};
+G_DEFINE_TYPE (ClutterBindingPool, clutter_binding_pool, G_TYPE_OBJECT);
+
static guint
binding_entry_hash (gconstpointer v)
{
}
static void
-binding_pool_free (gpointer data)
+clutter_binding_pool_finalize (GObject *gobject)
{
- if (G_LIKELY (data))
- {
- ClutterBindingPool *pool = data;
+ ClutterBindingPool *pool = CLUTTER_BINDING_POOL (gobject);
- /* remove from the pools */
- binding_pools = g_slist_remove (binding_pools, pool);
+ /* remove from the pools */
+ binding_pools = g_slist_remove (binding_pools, pool);
- g_hash_table_destroy (pool->entries_hash);
+ g_hash_table_destroy (pool->entries_hash);
- g_slist_foreach (pool->entries, (GFunc) binding_entry_free, NULL);
- g_slist_free (pool->entries);
+ g_slist_foreach (pool->entries, (GFunc) binding_entry_free, NULL);
+ g_slist_free (pool->entries);
- g_slice_free (ClutterBindingPool, pool);
- }
+ G_OBJECT_CLASS (clutter_binding_pool_parent_class)->finalize (gobject);
+}
+
+static void
+clutter_binding_pool_class_init (ClutterBindingPoolClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->finalize = clutter_binding_pool_finalize;
+}
+
+static void
+clutter_binding_pool_init (ClutterBindingPool *pool)
+{
+ pool->entries = NULL;
+ pool->entries_hash = g_hash_table_new (binding_entry_hash,
+ binding_entry_compare);
+
+ binding_pools = g_slist_prepend (binding_pools, pool);
}
/**
return NULL;
}
- pool = g_slice_new (ClutterBindingPool);
+ pool = g_object_new (CLUTTER_TYPE_BINDING_POOL, NULL);
pool->name = (gchar *) g_intern_string (name);
- pool->entries = NULL;
- pool->entries_hash = g_hash_table_new (binding_entry_hash,
- binding_entry_compare);
-
- binding_pools = g_slist_prepend (binding_pools, pool);
return pool;
}
pool = clutter_binding_pool_new (G_OBJECT_CLASS_NAME (klass));
g_dataset_id_set_data_full (klass, key_class_bindings,
pool,
- binding_pool_free);
+ g_object_unref);
return pool;
}