From 59bb19a4494d4be2b431cf62ccb34efc894cd027 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 9 Feb 2012 15:43:25 +0000 Subject: [PATCH] actor: Add a default handler for ::destroy Now that ClutterActor can be instantiated, we need to do the right thing, and destroy its children when it is destroyed. --- clutter/clutter-actor.c | 54 ++++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c index c25a5f7d8..98a72b018 100644 --- a/clutter/clutter-actor.c +++ b/clutter/clutter-actor.c @@ -4754,6 +4754,21 @@ clutter_actor_real_has_overlaps (ClutterActor *self) return TRUE; } +static void +clutter_actor_real_destroy (ClutterActor *actor) +{ + ClutterActorIter iter; + ClutterActor *child; + + clutter_actor_iter_init (&iter, actor); + while (clutter_actor_iter_next (&iter, &child)) + { + g_object_ref (child); + clutter_actor_iter_remove (&iter); + clutter_actor_destroy (child); + } +} + static GObject * clutter_actor_constructor (GType gtype, guint n_props, @@ -4795,6 +4810,26 @@ clutter_actor_class_init (ClutterActorClass *klass) object_class->dispose = clutter_actor_dispose; object_class->finalize = clutter_actor_finalize; + klass->show = clutter_actor_real_show; + klass->show_all = clutter_actor_show; + klass->hide = clutter_actor_real_hide; + klass->hide_all = clutter_actor_hide; + klass->map = clutter_actor_real_map; + klass->unmap = clutter_actor_real_unmap; + klass->unrealize = clutter_actor_real_unrealize; + klass->pick = clutter_actor_real_pick; + klass->get_preferred_width = clutter_actor_real_get_preferred_width; + klass->get_preferred_height = clutter_actor_real_get_preferred_height; + klass->allocate = clutter_actor_real_allocate; + klass->queue_redraw = clutter_actor_real_queue_redraw; + klass->queue_relayout = clutter_actor_real_queue_relayout; + klass->apply_transform = clutter_actor_real_apply_transform; + klass->get_accessible = clutter_actor_real_get_accessible; + klass->get_paint_volume = clutter_actor_real_get_paint_volume; + klass->has_overlaps = clutter_actor_real_has_overlaps; + klass->paint = clutter_actor_real_paint; + klass->destroy = clutter_actor_real_destroy; + g_type_class_add_private (klass, sizeof (ClutterActorPrivate)); /** @@ -6321,25 +6356,6 @@ clutter_actor_class_init (ClutterActorClass *klass) G_TYPE_NONE, 2, CLUTTER_TYPE_ACTOR_BOX, CLUTTER_TYPE_ALLOCATION_FLAGS); - - klass->show = clutter_actor_real_show; - klass->show_all = clutter_actor_show; - klass->hide = clutter_actor_real_hide; - klass->hide_all = clutter_actor_hide; - klass->map = clutter_actor_real_map; - klass->unmap = clutter_actor_real_unmap; - klass->unrealize = clutter_actor_real_unrealize; - klass->pick = clutter_actor_real_pick; - klass->get_preferred_width = clutter_actor_real_get_preferred_width; - klass->get_preferred_height = clutter_actor_real_get_preferred_height; - klass->allocate = clutter_actor_real_allocate; - klass->queue_redraw = clutter_actor_real_queue_redraw; - klass->queue_relayout = clutter_actor_real_queue_relayout; - klass->apply_transform = clutter_actor_real_apply_transform; - klass->get_accessible = clutter_actor_real_get_accessible; - klass->get_paint_volume = clutter_actor_real_get_paint_volume; - klass->has_overlaps = clutter_actor_real_has_overlaps; - klass->paint = clutter_actor_real_paint; } static void