/* * _clutter_meta_group_clear_metas_no_internal: * @group: a #ClutterMetaGroup * * Clears @group of all #ClutterActorMeta instances that don't have an * internal priority and releases the reference on them */ void _clutter_meta_group_clear_metas_no_internal (ClutterMetaGroup *group) { GList *internal_list = NULL; GList *l, *next; for (l = group->meta; l; l = next) { next = l->next; if (_clutter_actor_meta_is_internal (l->data)) { if (internal_list) internal_list->prev = l; l->next = internal_list; l->prev = NULL; internal_list = l; } else { _clutter_actor_meta_set_actor (l->data, NULL); g_object_unref (l->data); g_list_free_1 (l); } } group->meta = g_list_reverse (internal_list); }
/* * _clutter_meta_group_add_meta: * @group: a #ClutterMetaGroup * @meta: a #ClutterActorMeta to add * * Adds @meta to @group * * This function will remove the floating reference of @meta or, if the * floating reference has already been sunk, add a reference to it */ void _clutter_meta_group_add_meta (ClutterMetaGroup *group, ClutterActorMeta *meta) { GList *prev = NULL, *l; if (meta->priv->actor != NULL) { g_warning ("The meta of type '%s' with name '%s' is " "already attached to actor '%s'", G_OBJECT_TYPE_NAME (meta), meta->priv->name != NULL ? meta->priv->name : "<unknown>", clutter_actor_get_name (meta->priv->actor) != NULL ? clutter_actor_get_name (meta->priv->actor) : G_OBJECT_TYPE_NAME (meta->priv->actor)); return; } /* Find a meta that has lower priority and insert before that */ for (l = group->meta; l; l = l->next) if (_clutter_actor_meta_get_priority (l->data) < _clutter_actor_meta_get_priority (meta)) break; else prev = l; if (prev == NULL) group->meta = g_list_prepend (group->meta, meta); else { prev->next = g_list_prepend (prev->next, meta); prev->next->prev = prev; } g_object_ref_sink (meta); _clutter_actor_meta_set_actor (meta, group->actor); }
/* * _clutter_meta_group_remove_meta: * @group: a #ClutterMetaGroup * @meta: a #ClutterActorMeta to remove * * Removes @meta from @group and releases the reference being held on it */ void _clutter_meta_group_remove_meta (ClutterMetaGroup *group, ClutterActorMeta *meta) { if (meta->priv->actor != group->actor) { g_warning ("The meta of type '%s' with name '%s' is not " "attached to the actor '%s'", G_OBJECT_TYPE_NAME (meta), meta->priv->name != NULL ? meta->priv->name : "<unknown>", clutter_actor_get_name (group->actor) != NULL ? clutter_actor_get_name (group->actor) : G_OBJECT_TYPE_NAME (group->actor)); return; } _clutter_actor_meta_set_actor (meta, NULL); group->meta = g_list_remove (group->meta, meta); g_object_unref (meta); }
/* * _clutter_meta_group_add_meta: * @group: a #ClutterMetaGroup * @meta: a #ClutterActorMeta to add * * Adds @meta to @group * * This function will remove the floating reference of @meta or, if the * floating reference has already been sunk, add a reference to it */ void _clutter_meta_group_add_meta (ClutterMetaGroup *group, ClutterActorMeta *meta) { if (meta->priv->actor != NULL) { g_warning ("The meta of type '%s' with name '%s' is " "already attached to actor '%s'", G_OBJECT_TYPE_NAME (meta), meta->priv->name != NULL ? meta->priv->name : "<unknown>", clutter_actor_get_name (meta->priv->actor) != NULL ? clutter_actor_get_name (meta->priv->actor) : G_OBJECT_TYPE_NAME (meta->priv->actor)); return; } group->meta = g_list_append (group->meta, meta); g_object_ref_sink (meta); _clutter_actor_meta_set_actor (meta, group->actor); }