diff --git a/ChangeLog b/ChangeLog index c4f4efea4..9926fc5bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-09-28 Øyvind Kolås + + * clutter/clutter-container.[ch]: added + clutter_container_find_child_by_name. + 2007-09-28 Øyvind Kolås * clutter/glx/clutter-stage-glx.c: (clutter_stage_glx_realize): diff --git a/clutter/clutter-container.c b/clutter/clutter-container.c index f9ee905b5..17c167433 100644 --- a/clutter/clutter-container.c +++ b/clutter/clutter-container.c @@ -504,3 +504,55 @@ clutter_container_sort_depth_order (ClutterContainer *container) CLUTTER_CONTAINER_GET_IFACE (container)->sort_depth_order (container); } + +/** + * clutter_container_find_child_by_name: + * @container: a #ClutterContainer + * @child_name: the name of the requested child. + * + * Finds a child actor of a container by its name. Search recurses + * into any child container. + * + * Return value: The child actor with the requested name, or %NULL if no + * actor with that name was found. + * + * Since: 0.6 + */ +ClutterActor * +clutter_container_find_child_by_name (ClutterContainer *container, + const gchar *child_name) +{ + GList *children; + GList *iter; + ClutterActor *actor = NULL; + + g_return_val_if_fail (CLUTTER_IS_CONTAINER (container), NULL); + + children = clutter_container_get_children (container); + + for (iter=children; iter; iter = g_list_next (iter)) + { + ClutterActor *a; + const gchar *iter_name; + + a = CLUTTER_ACTOR (iter->data); + iter_name = clutter_actor_get_name (a); + + if (iter_name && !strcmp (iter_name, child_name)) + { + actor = a; + break; + } + + if (CLUTTER_IS_CONTAINER (a)) + { + ClutterContainer *c = CLUTTER_CONTAINER (a); + + actor = clutter_container_find_child_by_name (c, child_name); + if (actor) + break; + } + } + g_list_free (children); + return actor; +} diff --git a/clutter/clutter-container.h b/clutter/clutter-container.h index 00378dd87..9934162c0 100644 --- a/clutter/clutter-container.h +++ b/clutter/clutter-container.h @@ -114,6 +114,8 @@ void clutter_container_foreach (ClutterContainer *container, gpointer user_data); ClutterActor *clutter_container_find_child_by_id (ClutterContainer *container, guint child_id); +ClutterActor *clutter_container_find_child_by_name(ClutterContainer *container, + const gchar *child_name); void clutter_container_raise_child (ClutterContainer *container, ClutterActor *actor, ClutterActor *sibling);