[clutter] cally: Use the Actor API instead of ClutterContainer



commit 4d75e7a0f45c336441bf4cd218d5d922c8fd9897
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Sun Dec 18 22:33:24 2011 +0000

    cally: Use the Actor API instead of ClutterContainer
    
    Cally is doing a bunch of list traversals through the list returned by
    ClutterContainer.get_children(); this means a traversal already, plus
    a bunch of allocations. We can do better than that, now that we have
    a proper graph iteration API inside ClutterActor.

 clutter/cally/cally-actor.c |   74 ++++++++++++++----------------------------
 1 files changed, 25 insertions(+), 49 deletions(-)
---
diff --git a/clutter/cally/cally-actor.c b/clutter/cally/cally-actor.c
index 73b972f..f5aceff 100644
--- a/clutter/cally/cally-actor.c
+++ b/clutter/cally/cally-actor.c
@@ -462,11 +462,11 @@ cally_actor_get_parent (AtkObject *obj)
 static gint
 cally_actor_get_index_in_parent (AtkObject *obj)
 {
-  CallyActor    *cally_actor   = NULL;
-  ClutterActor *actor        = NULL;
+  CallyActor *cally_actor = NULL;
+  ClutterActor *actor = NULL;
   ClutterActor *parent_actor = NULL;
-  GList        *children     = NULL;
-  gint          index        = -1;
+  ClutterActor *iter;
+  gint index = -1;
 
   g_return_val_if_fail (CALLY_IS_ACTOR (obj), -1);
 
@@ -496,14 +496,17 @@ cally_actor_get_index_in_parent (AtkObject *obj)
   if (actor == NULL) /* Object is defunct */
     return -1;
 
-  parent_actor = clutter_actor_get_parent(actor);
-  if ((parent_actor == NULL)||(!CLUTTER_IS_CONTAINER(parent_actor)))
+  index = 0;
+  parent_actor = clutter_actor_get_parent (actor);
+  if (parent_actor == NULL)
     return -1;
 
-  children = clutter_container_get_children(CLUTTER_CONTAINER(parent_actor));
-
-  index = g_list_index (children, actor);
-  g_list_free (children);
+  for (iter = clutter_actor_get_first_child (parent_actor);
+       iter != NULL && iter != actor;
+       iter = clutter_actor_get_next_sibling (iter))
+    {
+      index += 1;
+    }
 
   return index;
 }
@@ -565,9 +568,7 @@ cally_actor_ref_state_set (AtkObject *obj)
 static gint
 cally_actor_get_n_children (AtkObject *obj)
 {
-  ClutterActor     *actor    = NULL;
-  GList            *children = NULL;
-  gint              num      = 0;
+  ClutterActor *actor = NULL;
 
   g_return_val_if_fail (CALLY_IS_ACTOR (obj), 0);
 
@@ -578,57 +579,32 @@ cally_actor_get_n_children (AtkObject *obj)
 
   g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), 0);
 
-  if (CLUTTER_IS_CONTAINER (actor))
-    {
-      children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
-      num = g_list_length (children);
-
-      g_list_free (children);
-    }
-  else
-    {
-      num = 0;
-    }
-
-  return num;
+  return clutter_actor_get_n_children (actor);
 }
 
 static AtkObject*
 cally_actor_ref_child (AtkObject *obj,
-                      gint       i)
+                       gint       i)
 {
-  ClutterActor     *actor    = NULL;
-  ClutterActor     *child    = NULL;
-  GList            *children = NULL;
-  AtkObject        *result   = NULL;
+  ClutterActor *actor = NULL;
+  ClutterActor *child = NULL;
 
   g_return_val_if_fail (CALLY_IS_ACTOR (obj), NULL);
 
   actor = CALLY_GET_CLUTTER_ACTOR (obj);
-
   if (actor == NULL) /* State is defunct */
-    {
-      return NULL;
-    }
+    return NULL;
 
   g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), NULL);
 
-  if (CLUTTER_IS_CONTAINER (actor))
-    {
-      children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
-      child = g_list_nth_data (children, i);
-
-      result = clutter_actor_get_accessible (child);
+  if (i >= clutter_actor_get_n_children (actor))
+    return NULL;
 
-      g_object_ref (result);
-      g_list_free (children);
-    }
-  else
-    {
-      result = NULL;
-    }
+  child = clutter_actor_get_child_at_index (actor, i);
+  if (child == NULL)
+    return NULL;
 
-  return result;
+  return g_object_ref (clutter_actor_get_accessible (child));
 }
 
 static AtkAttributeSet *



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]