Add ClutterContainer::foreach_with_internals()
authorHavoc Pennington <hp@pobox.com>
Mon, 23 Mar 2009 14:15:00 +0000 (10:15 -0400)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Fri, 24 Apr 2009 14:25:08 +0000 (15:25 +0100)
Bug 1517 - clutter_container_foreach_with_internals()

This allows us to iterate over all children (for things like maintaining
map/realize invariants) or only children that apps added and care about.

Signed-off-by: Emmanuele Bassi <ebassi@linux.intel.com>
clutter/clutter-container.c
clutter/clutter-container.h

index 63b4eab..3f2296d 100644 (file)
@@ -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
  */
@@ -474,6 +477,41 @@ clutter_container_foreach (ClutterContainer *container,
 }
 
 /**
+ * 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
  * @actor: the actor to raise
index 68cbd71..dc1a601 100644 (file)
@@ -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,