Use a dynamic array for the actors when delivering events

Instead of using a fixed size array for storing the scenegraph sub-node
during event delivery we should use a GPtrArray. The benefits are:

  - a smaller allocation
  - no undocumented yet binding constraint on the scenegraph size
This commit is contained in:
Emmanuele Bassi 2009-02-23 15:22:08 +00:00
parent 64db7896db
commit 3409a941a4

View File

@ -1734,17 +1734,15 @@ static inline void
emit_event (ClutterEvent *event,
gboolean is_key_event)
{
#define MAX_EVENT_DEPTH 512
static ClutterActor **event_tree = NULL;
static gboolean lock = FALSE;
GPtrArray *event_tree = NULL;
ClutterActor *actor;
gint i = 0, n_tree_events = 0;
gint i = 0;
if (!event->any.source)
{
g_warning ("No event source set, discarding event");
CLUTTER_NOTE (EVENT, "No source set, discarding event");
return;
}
@ -1754,14 +1752,12 @@ emit_event (ClutterEvent *event,
lock = TRUE;
/* Sorry Mr Bassi. */
if (G_UNLIKELY (event_tree == NULL))
event_tree = g_new0 (ClutterActor *, MAX_EVENT_DEPTH);
event_tree = g_ptr_array_sized_new (64);
actor = event->any.source;
/* Build 'tree' of emitters for the event */
while (actor && n_tree_events < MAX_EVENT_DEPTH)
while (actor)
{
ClutterActor *parent;
@ -1771,30 +1767,29 @@ emit_event (ClutterEvent *event,
parent == NULL || /* stage gets all events */
is_key_event) /* keyboard events are always emitted */
{
event_tree[n_tree_events++] = g_object_ref (actor);
g_ptr_array_add (event_tree, g_object_ref (actor));
}
actor = parent;
}
/* Capture */
for (i = n_tree_events-1; i >= 0; i--)
if (clutter_actor_event (event_tree[i], event, TRUE))
for (i = event_tree->len - 1; i >= 0; i--)
if (clutter_actor_event (g_ptr_array_index (event_tree, i), event, TRUE))
goto done;
/* Bubble */
for (i = 0; i < n_tree_events; i++)
if (clutter_actor_event (event_tree[i], event, FALSE))
for (i = 0; i < event_tree->len; i++)
if (clutter_actor_event (g_ptr_array_index (event_tree, i), event, FALSE))
goto done;
done:
for (i = 0; i < event_tree->len; i++)
g_object_unref (g_ptr_array_index (event_tree, i));
for (i = 0; i < n_tree_events; i++)
g_object_unref (event_tree[i]);
g_ptr_array_free (event_tree, TRUE);
lock = FALSE;
#undef MAX_EVENT_DEPTH
}
/*