diff --git a/clutter/clutter-container.c b/clutter/clutter-container.c index 63b4eab47..3f2296da6 100644 --- a/clutter/clutter-container.c +++ b/clutter/clutter-container.c @@ -449,7 +449,10 @@ clutter_container_get_children (ClutterContainer *container) * @callback: a function to be called for each child * @user_data: data to be passed to the function, or %NULL * - * Calls @callback for each child of @container. + * Calls @callback for each child of @container that was added + * by the application (with clutter_container_add_actor()). Does + * not iterate over "internal" children that are part of the + * container's own implementation, if any. * * Since: 0.4 */ @@ -473,6 +476,41 @@ clutter_container_foreach (ClutterContainer *container, iface->foreach (container, callback, user_data); } +/** + * clutter_container_foreach_with_internals: + * @container: a #ClutterContainer + * @callback: a function to be called for each child + * @user_data: data to be passed to the function, or %NULL + * + * Calls @callback for each child of @container, including "internal" + * children built in to the container itself that were never added + * by the application. + * + * Since: 1.0 + */ +void +clutter_container_foreach_with_internals (ClutterContainer *container, + ClutterCallback callback, + gpointer user_data) +{ + ClutterContainerIface *iface; + + g_return_if_fail (CLUTTER_IS_CONTAINER (container)); + g_return_if_fail (callback != NULL); + + iface = CLUTTER_CONTAINER_GET_IFACE (container); + if (!iface->foreach) + { + CLUTTER_CONTAINER_WARN_NOT_IMPLEMENTED (container, "foreach"); + return; + } + + if (iface->foreach_with_internals != NULL) + iface->foreach_with_internals (container, callback, user_data); + else + iface->foreach (container, callback, user_data); +} + /** * clutter_container_raise_child: * @container: a #ClutterContainer diff --git a/clutter/clutter-container.h b/clutter/clutter-container.h index 68cbd71fd..dc1a60151 100644 --- a/clutter/clutter-container.h +++ b/clutter/clutter-container.h @@ -90,6 +90,10 @@ struct _ClutterContainerIface ClutterCallback callback, gpointer user_data); + void (* foreach_with_internals) (ClutterContainer *container, + ClutterCallback callback, + gpointer user_data); + /* child stacking */ void (* raise) (ClutterContainer *container, ClutterActor *actor, @@ -137,20 +141,22 @@ void clutter_container_remove_actor (ClutterContainer *container, void clutter_container_remove_valist (ClutterContainer *container, ClutterActor *first_actor, va_list var_args); -GList * clutter_container_get_children (ClutterContainer *container); -void clutter_container_foreach (ClutterContainer *container, - ClutterCallback callback, - gpointer user_data); -ClutterActor *clutter_container_find_child_by_name (ClutterContainer *container, - const gchar *child_name); -void clutter_container_raise_child (ClutterContainer *container, - ClutterActor *actor, - ClutterActor *sibling); -void clutter_container_lower_child (ClutterContainer *container, - ClutterActor *actor, - ClutterActor *sibling); -void clutter_container_sort_depth_order (ClutterContainer *container); - +GList * clutter_container_get_children (ClutterContainer *container); +void clutter_container_foreach (ClutterContainer *container, + ClutterCallback callback, + gpointer user_data); +void clutter_container_foreach_with_internals (ClutterContainer *container, + ClutterCallback callback, + gpointer user_data); +ClutterActor *clutter_container_find_child_by_name (ClutterContainer *container, + const gchar *child_name); +void clutter_container_raise_child (ClutterContainer *container, + ClutterActor *actor, + ClutterActor *sibling); +void clutter_container_lower_child (ClutterContainer *container, + ClutterActor *actor, + ClutterActor *sibling); +void clutter_container_sort_depth_order (ClutterContainer *container); GParamSpec * clutter_container_class_find_child_property (GObjectClass *klass,